我是格拉德尔·诺布。我有一个非常简单的项目,我试图使用这个项目来更好地理解依赖关系,以及如何用Gradle导入Java中的不同文件。我有以下文件结构:
$ ls
build.gradle dependencies src
$ ls dependencies/
Hello.java Hello.jar
$ ls src/
Temp.java
有以下三个文件
build.gradle:
apply plugin: 'java'
dependencies {
compile fileTree(dir: 'dependencies', include:'**/*.jar')
}
sourceSets {
main {
java {
srcDirs = ['src']
}
}
}
task compile(type: JavaCompile) {
source = file('src')
}
Hello.java
public class Hello{
int l = 1;
public Hello(){
System.out.println(l);
}
public static void main(String[] args){
Hello h = new Hello();
}
}
Temp.java:
public class Temp {
public static void main( String[] args0){
Hello h = new Hello();
}
}
当在命令行上运行gradle jar
时,看起来gradle构建成功,但是当试图运行jar时.
$ java -classpath build/libs/testproject.jar Temp
Exception in thread "main" java.lang.NoClassDefFoundError: Hello
at Temp.main(Temp.java:5)
Caused by: java.lang.ClassNotFoundException: Hello
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more
根据Gradle上的文档,我似乎看不出我做错了什么。我的依赖规范在build.gradle中做什么,为什么不允许Temp.java看到Hello.java?我该怎么解决这个问题?
提前谢谢你的帮助。
发布于 2016-12-15 04:20:40
依赖项或子项目中的jar不会按默认值打包到根项目jar。
如果要将其添加到根项目的jar中,可以修改根项目的jar任务并添加类。
jar {
//...
from 'dependencies/classes/Hello.class'
//...
}
然后再次运行jar
任务来创建jar,./gradlew jar
此时,您的程序应该正常运行。
$ java -cp build/lib/testproject.jar Temp
更简单的解决方案,在根项目中应用application
插件
apply plugin: 'application'
mainClassName = 'Temp'
并使用./gradlew run
运行程序。
有一些文章已经讨论了这个主题,请参阅
https://www.mkyong.com/gradle/gradle-create-a-jar-file-with-dependencies/
发布于 2016-12-15 10:16:05
如果你是个贵族..。我建议你遵循格拉德尔非常明智的惯例
https://stackoverflow.com/questions/41150174
复制相似问题