Gradle Noob在这里。我有一个非常简单的项目,试图用来更好地理解依赖关系以及如何使用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')
}
你好
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?我该如何解决?
先谢谢您的帮助。
最佳答案
默认情况下,来自依赖项或子项目的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/
关于gradle - Gradle&Java:将文件添加为依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41150174/