【问题标题】:java.lang.NoSuchMethodError in Scalatra using Scalate with MarkdownScalatra 中的 java.lang.NoSuchMethodError 使用带有 Markdown 的 Scalate
【发布时间】:2013-08-20 21:15:06
【问题描述】:

所以我有一个 Scalatra 应用程序(使用 Scalatra 2.2.1)。我正在使用 Scalate 构建视图;我决定选择 Jade/Markdown 一二。只有一个问题:如果我尝试在翡翠模板中使用降价(以:markdown 标记开头),我会得到:

scala.Predef$.any2ArrowAssoc(Ljava/lang/Object;)Lscala/Predef$ArrowAssoc;
java.lang.NoSuchMethodError: scala.Predef$.any2ArrowAssoc(Ljava/lang/Object;)Lscala/Predef$ArrowAssoc;

at org.fusesource.scalamd.Markdown$.<init>(md.scala:119)
at org.fusesource.scalamd.Markdown$.<clinit>(md.scala:-1)
at org.fusesource.scalate.filter.ScalaMarkdownFilter$.filter(ScalaMarkdownFilter.scala:32)
at org.fusesource.scalate.RenderContext$class.filter(RenderContext.scala:276)
at org.fusesource.scalate.DefaultRenderContext.filter(DefaultRenderContext.scala:30)
at org.fusesource.scalate.RenderContext$class.value(RenderContext.scala:235)
at org.fusesource.scalate.DefaultRenderContext.value(DefaultRenderContext.scala:30)
at templates.views.$_scalate_$about_jade$.$_scalate_$render(about_jade.scala:37)
at templates.views.$_scalate_$about_jade.render(about_jade.scala:48)
at org.fusesource.scalate.DefaultRenderContext.capture(DefaultRenderContext.scala:92)
at org.fusesource.scalate.layout.DefaultLayoutStrategy.layout(DefaultLayoutStrategy.scala:45)
at org.fusesource.scalate.TemplateEngine$$anonfun$layout$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(TemplateEngine.scala:559)
at org.fusesource.scalate.TemplateEngine$$anonfun$layout$1$$anonfun$apply$mcV$sp$1.apply(TemplateEngine.scala:559)
at org.fusesource.scalate.TemplateEngine$$anonfun$layout$1$$anonfun$apply$mcV$sp$1.apply(TemplateEngine.scala:559)

所以这很酷。一旦我删除 :markdown 标志,错误就会消失,除此之外,一切都会编译(除了 Markdown 没有正确呈现)。

到目前为止我知道和发现的事情:

  1. 有人认为此错误是构建中某处不兼容的 Scala 版本的副产物。我的 build.scala 将 Scala 版本定义为 Scalatra 明确兼容的 2.10.0。
  2. ...也就是说,我不知道引入了哪个版本的 Scalate Scalatra,并且我尝试覆盖它到目前为止还没有奏效。我知道当前的 Scalate (1.6.1) 稳定版只能兼容 Scala 2.10.0——但这就是我正在使用的。
  3. 不过,我确信我的类路径是干净的。我没有冲突的 Scala 版本。 一切在依赖项中都是 2.10.0。

以前有人用过这个吗?有什么想法吗?

编辑

根据请求,这是我的构建定义:

//build.sbt 
libraryDependencies += "org.scalatest" %% "scalatest" % "2.0.M5b" % "test"                                                                                                                                     
                                                                                                                                                                                                           
libraryDependencies += "org.twitter4j" % "twitter4j-core" % "3.0.3"                                                                                                                                            
                                                                                                                                                                                                           
libraryDependencies += "org.fusesource.scalamd" % "scalamd" % "1.5" 

//build.properties
sbt.version=0.12.3

//build.scala
import sbt._                                                                                                                                                                                                   
import Keys._                                                                                                                                                                                                  
import org.scalatra.sbt._                                                                                                                                                                                      
import org.scalatra.sbt.PluginKeys._                                                                                                                                                                           
import com.mojolly.scalate.ScalatePlugin._                                                                                                                                                                     
import ScalateKeys._                                                                                                                                                                                           
                                                                                                                                                                                                               
object TheRangeBuild extends Build {                                                                                                                                                                           
  val Organization = "com.gastove"                                                                                                                                                                             
  val Name = "The Range"                                                                                                                                                                                       
  val Version = "0.1.0-SNAPSHOT"                                                                                                                                                                               
  val ScalaVersion = "2.10.0"                                                                                                                                                                                  
  val ScalatraVersion = "2.2.1"                                                                                                                                                                                
                                                                                                                                                                                                               
  lazy val project = Project (                                                                                                                                                                                 
    "the-range",                                                                                                                                                                                               
    file("."),                                                                                                                                                                                                 
    settings = Defaults.defaultSettings ++ ScalatraPlugin.scalatraWithJRebel ++ scalateSettings ++ Seq(                                                                                                        
      organization := Organization,                                                                                                                                                                            
      name := Name,                                                                                                                                                                                            
      version := Version,                                                                                                                                                                                      
      scalaVersion := ScalaVersion,                                                                                                                                                                            
      resolvers += Classpaths.typesafeReleases,                                                                                                                                                                
      libraryDependencies ++= Seq(                                                                                                                                                                             
        "org.scalatra" %% "scalatra" % ScalatraVersion,                                                                                                                                                        
        "org.scalatra" %% "scalatra-scalate" % ScalatraVersion,                                                                                                                                                
        "org.scalatra" %% "scalatra-specs2" % ScalatraVersion % "test",                                                                                                                                        
        "ch.qos.logback" % "logback-classic" % "1.0.6" % "runtime",                                                                                                                                            
        "org.eclipse.jetty" % "jetty-webapp" % "8.1.8.v20121106" % "compile;container",                                                                                                                        
        "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "compile;container;provided;test" artifacts (Artifact("javax.servlet", "jar", "jar"))                                            
      ),                                                                                                                                                                                                       
      scalateTemplateConfig in Compile <<= (sourceDirectory in Compile){ base =>                                                                                                                               
        Seq(                                                                                                                                                                                                   
          TemplateConfig(                                                                                                                                                                                      
            base / "webapp" / "WEB-INF" / "templates",                                                                                                                                                         
            Seq.empty,  /* default imports should be added here */                                                                                                                                             
            Seq(                                                                                                                                                                                               
              Binding("context", "_root_.org.scalatra.scalate.ScalatraRenderContext", importMembers = true, isImplicit = true)                                                                                 
            ),  /* add extra bindings here */                                                                                                                                                                  
            Some("templates")                                                                                                                                                                                  
          )                                                                                                                                                                                                    
        )                                                                                                                                                                                                      
      }                                                                                                                                                                                                        
    ) ++ seq(com.typesafe.startscript.StartScriptPlugin.startScriptForClassesSettings: _*)                                                                                                                     
  )                                                                                                                                                                                                            
}

【问题讨论】:

  • 你能发布你的 SBT 构建定义吗?
  • 当然。您是只对主要的build.sbt 感兴趣,还是对project/ 中的内容感兴趣?
  • 继续发帖,为什么不呢?

标签: scala pug nosuchmethoderror scalatra scalate


【解决方案1】:

使用markdown filter时,需要添加scalamd库作为运行时依赖:

"org.fusesource.scalamd" %% "scalamd" % "1.6"

最新版本可以在Maven Central找到

您也可以删除build.sbt 文件并将依赖项放入build.scala 文件中,这样会更简单一些。

import sbt._
import Keys._
import org.scalatra.sbt._
import org.scalatra.sbt.PluginKeys._
import com.mojolly.scalate.ScalatePlugin._
import ScalateKeys._
object TheRangeBuild extends Build {
  val Organization = "com.gastove"
  val Name = "The Range"
  val Version = "0.1.0-SNAPSHOT"
  val ScalaVersion = "2.10.0"
  val ScalatraVersion = "2.2.1"
  lazy val project = Project(
    "the-range",
    file("."),
    settings = Defaults.defaultSettings ++ ScalatraPlugin.scalatraWithJRebel ++ scalateSettings ++ Seq(
      organization := Organization,
      name := Name,
      version := Version,
      scalaVersion := ScalaVersion,
      resolvers += Classpaths.typesafeReleases,
      libraryDependencies ++= Seq(  // adding this Seq to the libraryDependencies
        "org.scalatra" %% "scalatra" % ScalatraVersion,
        "org.scalatra" %% "scalatra-scalate" % ScalatraVersion,
        "org.scalatra" %% "scalatra-specs2" % ScalatraVersion % "test",
        "ch.qos.logback" % "logback-classic" % "1.0.6" % "runtime",
        "org.eclipse.jetty" % "jetty-webapp" % "8.1.8.v20121106" % "compile;container",
        "org.scalatest" %% "scalatest" % "2.0.M5b" % "test",
        "org.twitter4j" % "twitter4j-core" % "3.0.3",
        "org.fusesource.scalamd" % "scalamd" % "1.6",
        "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "compile;container;provided;test" artifacts (Artifact("javax.servlet", "jar", "jar"))
      ),
      scalateTemplateConfig in Compile <<= (sourceDirectory in Compile){ base =>
        Seq(
          TemplateConfig(
            base / "webapp" / "WEB-INF" / "templates",
            Seq.empty,  /* default imports should be added here */
            Seq(
              Binding("context", "_root_.org.scalatra.scalate.ScalatraRenderContext", importMembers = true, isImplicit = true)
            ),  /* add extra bindings here */
            Some("templates")
          )
        )
      }
    ) ++ seq(com.typesafe.startscript.StartScriptPlugin.startScriptForClassesSettings: _*)
  )
}

【讨论】:

  • Sonofa 枪。做到了!坦率地说,我不知道我从哪里得到使用 scalamd 1.5 而不是 1.6 的想法——感谢您和 @gourlaysama 指出了那一点疯狂。另外,我喜欢这种以build.scala 为中心的方法——非常干净。
【解决方案2】:

这来自:

libraryDependencies += "org.fusesource.scalamd" % "scalamd" % "1.5" 

查看scalamd-1.5 pom.xml,它是针对 Scala 2.8.1 构建的,与 2.10 不兼容。

依赖解析保留 2.10 并丢弃 2.8.1 依赖,你最终会遇到这个类路径问题。

您唯一的解决方案是尝试针对 Scala 2.10 构建一个新的 scalamd 版本,可能会修复一些问题以将其发布到那里,然后发布(至少在本地)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多