使用Scala 2.10运行Scala ^ Z3

时间:2013-03-05 11:27:55

标签: scala z3 scala-2.10

我在我的Mac OSX(Mountain Lion,JDK 7,Scala 2.10,Z3 4.3)上成功安装了Scala ^ Z3(在此之后:http://lara.epfl.ch/w/ScalaZ3)。一切都很顺利,除了我不能从这个网站(http://lara.epfl.ch/w/jniz3-scala-examples)运行任何示例而没有得到这个令人讨厌的错误:

java.lang.NoClassDefFoundError: scala/reflect/ClassManifest
    at .<init>(<console>:8)
    at .<clinit>(<console>)
    at .<init>(<console>:7)
        ...
Caused by: java.lang.ClassNotFoundException: scala.reflect.ClassManifest
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    ... 29 more

我认为这是因为Scala 2.9.x和2.10.x在处理反射时不兼容。因为我能够在Scala 2.9.x下运行相同的示例集。我的问题是,无论如何都要绕过这个并在Scala 2.10下运行Scala ^ Z3?

3 个答案:

答案 0 :(得分:5)

通过查看项目属性和构建文件(https://github.com/psuter/ScalaZ3/blob/master/project/build.propertieshttps://github.com/psuter/ScalaZ3/blob/master/project/build/scalaZ3.scala),我推断scalaZ3目前仅针对scala 2.9.2提供。目前没有跨版本支持。

在“build.properties”文件中将版本更改为scala 2.10.0之后,您可能会尝试获取代码并自行编译。 有关如何编译它的说明,请参阅此页面:https://github.com/psuter/ScalaZ3。 如果你很幸运,代码将按照scala 2.10进行编译。如果你不是,可能会有一些小修复。交叉你的手指。

如果你不赶时间,你也可能会对Scala ^ Z3作者提出错误并要求他们提供scala 2.10版本的库。

答案 1 :(得分:3)

我正在将我的回复中的说明复制到您的issue on GitHub,因为它可能在将来帮助某人。

当前状态是旧的sbt项目似乎与Scala 2.10混合不好。以下是Linux项目“手动”编译的说明。这适用于Z3 4.3(从the Z3 git repo抓取)和Scala 2.10。按照原始说明安装Z3后:

首先编译Java文件:

$ mkdir bin
$ find src/main -name '*.java' -exec javac -d bin {} +

然后编译C文件。为此,您需要首先生成JNI标头,然后编译共享库。以下命令中的选项适用于Linux。要查找JNI标头的位置,我在Scala控制台中运行(new java.io.File(System.getProperty("java.home")).getParent(并在结果中添加/include)。

$ javah -classpath bin -d src/c z3.Z3Wrapper
$ gcc -o lib-bin/libscalaz3.so -shared -Wl,-soname,libscalaz3.so \
        -I/usr/lib/jvm/java-6-sun-1.6.0.26/include \
        -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux \
        -Iz3/4.3/include -Lz3/4.3/lib \
        -g -lc -Wl,--no-as-needed -Wl,--copy-dt-needed -lz3 -fPIC -O2 -fopenmp \
        src/c/*.[ch]

现在编译Scala文件:

$ find src/main -name '*.scala' -exec scalac -classpath bin -d bin {} +

您将获得“功能警告”,这在转移到2.10时是典型的,另一个警告是关于非详尽模式匹配。

现在让我们制作一个jar文件......

$ cd bin
$ jar cvf scalaz3.jar z3
$ cd ..
$ jar uf bin/scalaz3.jar lib-bin/libscalaz3.so

...现在你应该bin/scalaz3.jar包含你需要的一切。我们试一试:

$ export LD_LIBRARY_PATH=z3/4.3/lib
$ scala -cp bin/scalaz3.jar
scala> z3.scala.version

希望这有帮助!

答案 2 :(得分:1)

这不会直接回答这个问题,但可能会帮助其他人尝试使用scalaz3构建scala 2.10

我在ScalaZ3上使用Scala 2.10.1Z3 4.3.0构建了Windows 7。我在http://lara.epfl.ch/w/jniz3-scala-examples处使用integer constraints示例对其进行了测试,结果正常。

构建Z3

codeplex上的Z3 4.3.0下载不包含libZ3.lib文件。所以我不得不下载源代码并在我的机器上构建它。构建过程非常简单。

构建ScalaZ3

目前,build.properties有sbt版本0.7.4和scala版本2.9.2。这很好。 (我必须对build.scala文件进行一些小修改。在z3LibPath(z3VN).absolutePath任务中将z3LibPath(z3VN).absolutePath + "\\libz3.lib"修改为gcc

现在,如果我在2.10.1中将scala版本更改为build.properties,则在启动sbt时会出现"Error compiling sbt component 'compiler-interface'"错误。我不知道为什么会这样。

然后我将sbt版本更改为0.12.2,将scala版本更改为2.10.1,然后使用新源启动。我还在包含build.sbt的项目根文件夹中添加了scalaVersion := "2.10.1"。这是必需的,因为在sbt 0.12.2中,文件build.properties应该仅用于指定sbt版本。有关sbt版本差异的更多信息(https://github.com/harrah/xsbt/wiki/Migrating-from-SBT-0.7.x-to-0.10.x)。

我收到错误Z3Wrapper.java:27: cannot find symbol LibraryChecksum。发生这种情况是因为未生成由构建(LibraryChecksum.java)生成的文件project\build\build.scala。看起来package任务不执行(project\build\build.scala)中的任务。任务compute-checksumjavahgcc未执行。这可能会发生,因为sbt 0.12.2期望build.scala文件直接位于project文件夹下。

然后我复制了从之前版本生成的LibraryChecksum.java,然后构建完成。生成的jar文件不包含scalaz3.dll

然后我手动执行了javahgcc个任务。可以使用scala 2.9.2从成功构建的日志中复制这些任务的命令(我对scala 2.10.1的命令进行了适当的修改)。在这里,我不得不做出一些改变。我必须显式添加scala-library.jar任务的javah类路径的完整路径。

然后我使用lib-bin\scalaz3.dlljar uf target\scala-2.10\scalaz3.jar lib-bin/scalaz3.dll添加到jar文件中。