gradle - Gradle&Java:将文件添加为依赖项

标签 gradle dependencies

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/

相关文章:

android - 如何使用 gradle 将发布签名的 apk 部署到附加设备?

gradle - 使用 gretty 插件更改配置?

java - Gradle:是否有更好的方法将相同的依赖项分配给2种配置?

Gradle, "sourceCompatibility"vs "targetCompatibility"?

java - Play Framework : Add a dependency that points to a directory of local jar files

android - Gradle:添加依赖项的优点/缺点

version-control - 从存储库中提取代码后如何自动安装依赖项?

java - 基于一个源文件的依赖关系创建 Java Eclipse 项目的子集

ubuntu - 错误 : Library "libGL" was not found

java - ESAPI - 获取具有禁止依赖项的 NoClassDefFoundError (LoggerFactory)