2013-03-05 3 views
3

Я установил Scala^Z3 на свой Mac OSX (Mountain Lion, JDK 7, Scala 2.10, Z3 4.3) успешно (после этого: http://lara.epfl.ch/w/ScalaZ3). Все шло хорошо, за исключением, что я не могу запустить ни одного примера с этого сайта (http://lara.epfl.ch/w/jniz3-scala-examples), не получая эту неприятную ошибку:Запуск Scala^Z3 с помощью Scala 2.10

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 

Я думаю, что это происходит из-за несовместимости между 2.9.x Scala и 2.10.x в обработке отражений , Поскольку я смог запустить тот же набор примеров под Scala 2.9.x. Мой вопрос в том, есть ли все-таки обойти это и запустить Scala^Z3 под Scala 2.10?

ответ

1

Это не дает прямого ответа на вопрос, но может помочь другим, кто пытается построить scalaz3 с scala 2.10.

Я построил ScalaZ3 с Scala 2.10.1 и Z3 4.3.0 по телефону Windows 7. Я тестировал его с примером integer constraints по адресу http://lara.epfl.ch/w/jniz3-scala-examples, и он отлично работает.

Строительство Z3

Z3 4.3.0 скачать на CodePlex не включает libZ3.lib файл. Поэтому мне пришлось загрузить источник и создать его на моей машине. Процесс сборки довольно прост.

Строительство ScalaZ3

В настоящее время build.properties имеет SBT версия 0.7.4 и SCALA версию 2.9.2. Это строит отлично. (Я должен был сделать некоторые незначительные изменения в файл build.scala. Изменение z3LibPath(z3VN).absolutePath для z3LibPath(z3VN).absolutePath + "\\libz3.lib" в gcc задачи.)

Теперь, если я изменю SCALA версию 2.10.1 в build.properties, я получаю сообщение об ошибке "Error compiling sbt component 'compiler-interface'" о запуске SBT. Я понятия не имею, почему это происходит.

Затем я изменил версию 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, который является supposted, который будет сгенерирован сборкой (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, используя jar uf target\scala-2.10\scalaz3.jar lib-bin/scalaz3.dll.

+1

Обратите внимание, что, любезно предоставлено Этьеном Кнейсом, [ScalaZ3 теперь портировано до 2.10] (https://github.com/epfl-lara/ScalaZ3). – Philippe

+0

@Philippe Спасибо. Я расскажу о своих выводах на платформе Windows, когда получаю время, чтобы протестировать этот выпуск. – dips

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. На данный момент поддержка перекрестной версии отсутствует.

Вы можете попытаться получить код и скомпилировать его самостоятельно, изменив версию на scala 2.10.0 в файле build.properties. Инструкции по сборке см. На этой странице: https://github.com/psuter/ScalaZ3. Если вам повезет, код будет скомпилирован, как и под scala 2.10. Если вы этого не сделаете, могут быть некоторые небольшие исправления. Скрестите пальцы.

Если вы не спешите, вы также можете исправить ошибки Scala^Z3 и спросить их о библиотеке scala версии 2.10.

+0

Спасибо за ответ. На самом деле я знаю, что он доступен только для Scala 2.9. И я уже скомпилировал его из источника под Scala 2.10 (все прошло отлично). Но проблема связана с API Reflection, который не обнаруживается во время компиляции, поэтому он компилируется, но не выполняется. Я думаю, что в Scala 2.10 что-то изменилось относительно scala.reflect.ClassManifest. BTW, я уже подал ошибку. –

+0

Я не уверен, что понял. Что вы подразумеваете под «API Reflection, который не обнаружен во время компиляции»? И если он «не обнаружен», как он может скомпилировать ??? Исключение, которое вы действительно указываете на одну проблему: вы используете код, который был скомпилирован против scala 2.9, но вы используете этот код, используя библиотеку scala 2.10. Вы уверены, что изменили версию scala перед запуском 'sbt package'? Если да, можете ли вы убедиться, что выполняете свои тесты, используя ** новый ** scalaz3.jar, который 'sbt package' создан в папке« target »(а не в старой банке)? –

+0

Возможно, я не выразил это хорошо. Я имею в виду, так как эта библиотека вызывает некоторые методы рефлексивно, компилятор не может проверить правильность этих рефлексивных вызовов, поэтому проблема возникает во время выполнения. BTW, я сделал то, что вы сказали, и изменил скрипт сборки на scala 2.10, и проблема все еще была там. Спасибо вам за ответ! –

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, я запускаю (new java.io.File(System.getProperty("java.home")).getParent в консоли Scala (и добавьте /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, и еще одно предупреждение о неисчерпывающим сопоставления с образцом.

Теперь давайте создадим банку файл из всего ...

$ 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 

Надеюсь, что это поможет!

+0

Отдельная компиляция java не работает для меня. Получил ошибку сборки ссылок на некоторые классы в пакете 'z3.scala' (который еще не построен). Есть ли какая-то особая причина, по которой вы задерживаете этап компиляции scala? Кроме того, 'LibraryChecksum.java' должен быть создан вручную. – dips