无法使用 gradle 和 java 库依赖项构建 Scala 程序
Failed to build Scala program with gradle and java library dependencies
我有一些简单的问题(虽然对我来说太难了):
我正在尝试构建一个简单的 Scala 测试程序,它具有 Java 库依赖项,使用 gradle。我的测试程序如下
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")
}
}
我的 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(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(MainGenericRunner.scala:65)
at scala.tools.nsc.MainGenericRunner.run(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 手动添加到项目中,这个程序也可以正常构建
我过去使用相同的过程成功地用 gradle 构建了 java 项目(虽然已经有几年了)。任何帮助表示赞赏。
PS。只是为了澄清,我正在尝试使用命令行进行构建。如果我手动添加 JAR,Eclipse(和其他 IDE)工作正常
PPS。程序 运行s 直到第 "val M = ..." 行(已测试)
在这种情况下我喜欢使用 Gradle Application Plugin 到
- 运行 你的 Scala 代码
- 构建分发 Tar (Linux) 或 Zip (Windows)。
我看到您已经在使用 Gradle 包装器。
扩展你的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 test
./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 建立一个 Distribution 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
看看build\distributions
- 一个 Tar 文件 Linux
- Windows
的 Zip 文件
在此发行版 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
看看build\install
- 你会找到分布结构文件
我有一些简单的问题(虽然对我来说太难了):
我正在尝试构建一个简单的 Scala 测试程序,它具有 Java 库依赖项,使用 gradle。我的测试程序如下
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")
}
}
我的 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(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(MainGenericRunner.scala:65)
at scala.tools.nsc.MainGenericRunner.run(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 手动添加到项目中,这个程序也可以正常构建
我过去使用相同的过程成功地用 gradle 构建了 java 项目(虽然已经有几年了)。任何帮助表示赞赏。
PS。只是为了澄清,我正在尝试使用命令行进行构建。如果我手动添加 JAR,Eclipse(和其他 IDE)工作正常
PPS。程序 运行s 直到第 "val M = ..." 行(已测试)
在这种情况下我喜欢使用 Gradle Application Plugin 到
- 运行 你的 Scala 代码
- 构建分发 Tar (Linux) 或 Zip (Windows)。
我看到您已经在使用 Gradle 包装器。
扩展你的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 test
./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 建立一个 Distribution 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
看看build\distributions
- 一个 Tar 文件 Linux
- Windows 的 Zip 文件
在此发行版 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
看看build\install
- 你会找到分布结构文件