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')
}
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?我该如何解决这个问题?
提前感谢您的帮助。
答案 0 :(得分:2)
默认情况下,来自依赖项或子项目的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/
答案 1 :(得分:2)
如果你是一个gradle noob ...我建议你遵循gradle的非常明智的约定