Скомпилируйте код Scala 2.8.x с помощью Apache Buildr
Вопрос
Я изо всех сил пытался заставить Buildr скомпилировать мой проект Scala 2.8, и я надеялся, что кто-нибудь, возможно, уже понял это.
В настоящее время у меня есть стандартное приложение HelloWorld с файлом сборки, подобным следующему:
ENV['JAVA_HOME'] = 'C:\Program Files (x86)\Java\jdk1.6.0_17'
ENV['SCALA_HOME'] = 'C:\scala-2.8.0.Beta1-RC6'
define "HelloWorld" do
#artifact_ns['Buildr::Compiler::Scalac'].library = '2.8.0'
require 'buildr/scala'
puts Scala.version
end
Когда я запускаю buildr, я получаю следующий вывод:
(в разделе C:/Users/Travis/eclipse_ws/HelloWorld, разработка)
2.7.5
Построение адского мира
Компиляция HelloWorld в C:/Users/Travis/eclipse_ws/HelloWorld/target/classes
Сборка прервана!
←[Сбой компилятора 31mScala:
#←[0 м
Первая проблема заключается в ошибке NoClassDefFoundError - он не может найти основной класс компилятора scala.Вторая проблема заключается в том, что Scala.version распечатывает версию 2.7.5.Это неверно, потому что путь SCALA_HOME указывает на версию 2.8.
Наконец, использование флага --trace показывает мне, что Buildr генерирует несколько правильную команду scalac, и когда я запускаю эту команду вручную, все компилируется.Я говорю, что это в какой-то степени правильно только потому, что некоторые записи cp дублируются.Смотрите следующее:
scalac - путь к классу C:/scala-2.8.0.Beta1-RC6/lib/scala-library.jar;C:/scala-2.8.0.Beta1-RC6/lib/scala-compiler.jar;C:/scala-2.8.0.Beta1-RC6/lib/scala-library.jar;C:/scala-2.8.0.Beta1-RC6/lib/scala-compiler.jar -исходный путь C:/Users/Travis/eclipse_ws/HelloWorld/src/main/scala -d C:/Users/Travis/eclipse_ws/HelloWorld/target/classes -подробный -g C:/Users/Travis/eclipse_ws/HelloWorld/src/main/scala/hw/HelloWorld.scala
Еще одна вещь, которую я попробовал (но с ошибкой в builder), заключалась в настройке следующего (что, как я думал, не требовалось при наличии SCALA_HOME):
#artifact_ns['Buildr::Compiler::Scalac'].library = '2.8.0'
Итак, есть какие-нибудь идеи?
Вот краткий список моей системной информации:64-разрядная версия Win 7 JDK 6 32-разрядный, установленный локально для buildr, но JDK 6 64-разрядный для всей системы Ruby 1.8.6 32-разрядный Buildr 1.3.5 32-разрядный Scala 2.8.0.Бета1-RC6
Еще одна вещь, которую я подумываю сделать, это переустановить мой 32-разрядный JDK и извлечь его из каталога с (x86) в имени.Я обнаружил, что это связано с файлами Scala bat, хотя я не уверен, имеет ли это отношение к моим текущим проблемам.
Заранее спасибо!
Решение
Разобрался в этом.Глупая проблема.В Buildr (или, может быть, в более общем смысле в Ruby?) вызов метода require должен выполняться в верхней части файла (или, по крайней мере, не внутри блока define).
требуется 'buildr/scala'
Таким образом, как ошибка NoClassDefFoundError, так и неправильная версия, отображаемая с помощью puts Scala.version, были исправлены этим.Ниже показано, как должен был выглядеть мой сценарий:
require 'buildr/scala'
ENV['JAVA_HOME'] = 'C:\Program Files (x86)\Java\jdk1.6.0_17'
ENV['SCALA_HOME'] = 'C:\scala-2.8.0.Beta1-RC6'
define 'HelloWorld' do
puts Scala.version
end
КСТАТИ:Buildr кажется довольно приятным (быстрый, лаконичный, соглашение по конфигурации и т.д.), как только вы поймете, что делаете :-)
Другие советы
С версией 1.4 на данный момент вы можете сделать
Buildr.settings.build['scala.version'] = "2.8.0"
require 'buildr/scala'
И он будет использовать scala 2.8.
Buildr 1.4 поддерживает Scala 2.8, а 1.4.2 по умолчанию будет использовать 2.8.