我在我的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?
答案 0 :(得分:5)
通过查看项目属性和构建文件(https://github.com/psuter/ScalaZ3/blob/master/project/build.properties和https://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.1
和Z3 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-checksum
,javah
和gcc
未执行。这可能会发生,因为sbt 0.12.2
期望build.scala
文件直接位于project
文件夹下。
然后我复制了从之前版本生成的LibraryChecksum.java
,然后构建完成。生成的jar文件不包含scalaz3.dll
。
然后我手动执行了javah
和gcc
个任务。可以使用scala 2.9.2
从成功构建的日志中复制这些任务的命令(我对scala 2.10.1
的命令进行了适当的修改)。在这里,我不得不做出一些改变。我必须显式添加scala-library.jar
任务的javah
类路径的完整路径。
然后我使用lib-bin\scalaz3.dll
将jar uf target\scala-2.10\scalaz3.jar lib-bin/scalaz3.dll
添加到jar文件中。