Не удалось собрать программу Scala с зависимостями gradle и java.
У меня есть несколько простых проблем (хотя для меня это слишком сложно):
Я пытаюсь создать простую тестовую программу Scala, которая имеет зависимости от библиотеки Java, используя gradle. Моя тестовая программа следующая
SRC / Основной / Scala / test.scala
import org.ejml.simple.SimpleMatrix
object test {
def main(args: Array[String]): Unit = {
val M = new SimpleMatrix(2,2)
println("Created matrix succesfully")
}
}
Мой build.gradle выглядит так:
apply plugin: 'scala'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.ejml', name: 'all', version: '0.30'
compile 'org.scala-lang:scala-library:2.12.0'
}
Когда я создаю свою тестовую программу с
./gradlew clean assemble
Я получаю правильную структуру папок (build / classes / main / test.class).
Если я сейчас попробую запустить test.class с
scala test
Я получаю следующую ошибку:
java.lang.ClassNotFoundException: org.ejml.simple.SimpleMatrix
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at test$.main(test.scala:7)
at test.main(test.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at scala.reflect.internal.util.ScalaClassLoader.$anonfun$run$2(ScalaClassLoader.scala:98)
at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:32)
at scala.reflect.internal.util.ScalaClassLoader.run(ScalaClassLoader.scala:98)
at scala.reflect.internal.util.ScalaClassLoader.run$(ScalaClassLoader.scala:90)
at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:129)
at scala.tools.nsc.CommonRunner.run(ObjectRunner.scala:22)
at scala.tools.nsc.CommonRunner.run$(ObjectRunner.scala:21)
at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:39)
at scala.tools.nsc.CommonRunner.runAndCatch(ObjectRunner.scala:29)
at scala.tools.nsc.CommonRunner.runAndCatch$(ObjectRunner.scala:28)
at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:39)
at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:65)
at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:92)
at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:103)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:108)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Таким образом, кажется, что EJML не связан должным образом. Похоже, я что-то упускаю, но не могу думать о чем. Я подтвердил, что библиотека EJML загружена
$ ls ~/.gradle/caches/modules-2/files-2.1/org.ejml/
all core dense64 denseC64 equation simple
Эта программа также прекрасно работает, если я использую Eclipse и добавляю.jars вручную в проект
В прошлом я успешно создавал Java-проект с Gradle, используя тот же процесс (хотя это было несколько лет назад). Любая помощь приветствуется.
PS. просто чтобы уточнить, я пытаюсь построить с помощью командной строки. Eclipse (и другие IDE) работают нормально, если я добавляю JAR вручную
PPS. программа работает до строки "val M = ..." (проверено)
1 ответ
В этом случае мне нравится использовать плагин Gradle Application для
- запустить свой код Scala
- построить дистрибутив Tar (Linux) или Zip (Windows).
Я вижу, вы уже используете Gradle Wrapper.
Расширьте свой build.gradle с помощью:
apply plugin: 'scala'
apply plugin: 'application' // added
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.ejml', name: 'all', version: '0.30'
compile 'org.scala-lang:scala-library:2.12.0'
}
mainClassName = 'test' // added
Расширьте свою тестовую программу src/main/scala/test.scala с помощью следующих выходных данных:
import org.ejml.simple.SimpleMatrix
object test {
def main(args: Array[String]): Unit = {
val m = new SimpleMatrix(2,2)
println("Created matrix succesfully: " + m)
}
}
Затем позвольте gradle собрать и запустить вашу тестовую программу Scala с использованием вместо этого теста scala
./gradlew clean run
Теперь вы получите ваш вывод без ошибок:
$ ./gradlew clean run
:clean
:compileJava NO-SOURCE
:compileScala
:processResources NO-SOURCE
:classes
:run
Created matrix succesfully: Type = dense real , numRows = 2 , numCols = 2
0.000 0.000
0.000 0.000
Кроме того, позвольте Gradle собрать дистрибутив Tar (Linux) или Zip (Windows)
$ ./gradlew clean assemble
:compileJava NO-SOURCE
:compileScala UP-TO-DATE
:processResources NO-SOURCE
:classes UP-TO-DATE
:jar
:startScripts
:distTar
:distZip
:assemble
Посмотрите на сборки \ дистрибутивы
- Tar-файл для Linux
- Zip-файл для Windows
В этих дистрибутивах Tar / Zip вы найдете эту структуру:
+---bin
| YourProjectDirName (start up script for UN*X)
| YourProjectDirName.bat (startup script for Windows)
|
\---lib (alle needed Libs)
all-0.30.jar
core-0.30.jar
dense64-0.30.jar
denseC64-0.30.jar
equation-0.30.jar
scala-library-2.12.0.jar
simple-0.30.jar
SimpleMatrixScala.jar
Альтернативное использование
$ ./gradlew clean installDist
:compileJava NO-SOURCE
:compileScala UP-TO-DATE
:processResources NO-SOURCE
:classes UP-TO-DATE
:jar UP-TO-DATE
:startScripts UP-TO-DATE
:installDist
и посмотрите на сборку \ установку
- вы найдете дистрибутивы Structure Files