Не удалось собрать программу 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
Другие вопросы по тегам