为什么需要Scala编译器在运行时? (Play2 /萨拉特与Scalap依赖性)(Why do

2019-09-20 20:58发布

我使用斯卡拉/蒙戈/卡斯巴/萨拉特/ Play2,当我尝试使用萨拉特似乎它有一个依赖于Scalap。

运行与应用程序时,它工作正常play run ,但与play start ,我得到了下面的堆栈:

[info] application - Can't create user 
java.lang.NoClassDefFoundError: scala/tools/nsc/util/ClassPath$JavaContext
    at scala.tools.scalap.scalax.rules.scalasig.ScalaSigParser$.scalaSigFromAttribute(ScalaSig.scala:35) ~[scalap-2.9.1.jar:na]
    at scala.tools.scalap.scalax.rules.scalasig.ScalaSigParser$.parse(ScalaSig.scala:38) ~[scalap-2.9.1.jar:na]
    at com.novus.salat.util.ScalaSigUtil$$anonfun$parseScalaSig0$2.apply(ScalaSigUtil.scala:73) ~[salat-util_2.9.1-0.0.8-SNAPSHOT.jar:0.0.8-SNAPSHOT]
    at com.novus.salat.util.ScalaSigUtil$$anonfun$parseScalaSig0$2.apply(ScalaSigUtil.scala:73) ~[salat-util_2.9.1-0.0.8-SNAPSHOT.jar:0.0.8-SNAPSHOT]
    at scala.Option.map(Option.scala:133) ~[scala-library.jar:na]
    at com.novus.salat.util.ScalaSigUtil$.parseScalaSig0(ScalaSigUtil.scala:73) ~[salat-util_2.9.1-0.0.8-SNAPSHOT.jar:0.0.8-SNAPSHOT]
Caused by: java.lang.ClassNotFoundException: scala.tools.nsc.util.ClassPath$JavaContext
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) ~[na:1.7.0_01]
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) ~[na:1.7.0_01]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_01]
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) ~[na:1.7.0_01]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) ~[na:1.7.0_01]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) ~[na:1.7.0_01]

scala/tools/nsc/util/ClassPath$JavaContext是在Scala编译器项目,所以我增加了SBT依赖性:

"org.scala-lang" % "scala-compiler" % "2.9.1"

现在,它正常工作与play start了。

但它是正常的有与运行时依赖于Scala编译器运行我的项目? 为什么它会与合作play run不Scala编译器依赖? 是不是当在生产模式下运行自动嵌入?

谢谢

Answer 1:

其实Scalap取决于Scala编译器:

<dependencies>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-compiler</artifactId>
        <version>2.9.0.RC4</version>
    </dependency>
</dependencies>

http://www.jarvana.com/jarvana/inspect-pom/org/scala-lang/scalap/2.9.0.RC4/scalap-2.9.0.RC4.pom

我是有这个问题,因为我一时的依赖是由SBT手动和没有处理。

现在,我通过SBT管理它们和正常工作......但是编译器仍然是检索与萨拉特传递依赖作为初始依赖...

很奇怪有在运行时编译器,但它的工作原理...



Answer 2:

出现这种情况的原因有两个:

  • 如果您在开发模式下工作,你的类时间可持续重新编译。 所以,你需要一个编译器。

  • 如果您使用的舞台模式,类被编译一次永远的,但是这是内部完成。 如果没有,你就必须提供Scala编译器,它可以取代Scala编译器相关性的参考。



文章来源: Why do i need Scala compiler at runtime? (Play2/Salat with Scalap dependency)