4

Scala / Mongo / Casbah / Salat / Play2 を使用していますが、Salat を使用しようとすると、Scalap に依存しているようです。

アプリケーションを実行すると正常に動作しますplay runplay 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$JavaContextScalaコンパイラプロジェクトにあるので、SBT依存関係を追加しました:

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

今でもうまく動作しplay startます。

しかし、実行時に scala コンパイラーに依存してプロジェクトを実行しなければならないのは普通ですか? play runまた、scala コンパイラに依存 しなくても機能するのはなぜですか? 本番モードで実行されていない場合、自動的に組み込まれますか?

ありがとう

4

2 に答える 2

4

実際、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 で管理しており、正常に動作しています...しかし、コンパイラはまだ最初の依存関係として Salat を使用した推移的な依存関係として取得されています...

実行時にコンパイラを使用するのは奇妙ですが、動作します...

于 2012-08-09T20:56:58.060 に答える
3

これは、次の 2 つの理由で発生します。

  • 開発モードで作業している場合、クラスは継続的に再コンパイルされます。したがって、コンパイラが必要です。

  • ステージモードを使用すると、クラスは永久に 1 回コンパイルされますが、これは内部で行われます。そうでない場合は、scala コンパイラへの参照を提供する必要があります。これにより、scala コンパイラの依存関係が置き換えられる可能性があります。

于 2012-08-06T08:37:49.390 に答える