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

时间:2016-12-14 19:00:51

标签: 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')
}

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?我该如何解决这个问题?

提前感谢您的帮助。

2 个答案:

答案 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的非常明智的约定

  1. src / main / java for java sources
  2. src / main /资源资源(添加到jar / classpath的xml等)
  3. src / test / java for test java sources
  4. src / test /资源测试资源
  5. jars应该从存储库中引用,jars不应该存在于项目下的lib目录中(并且不应该用于源代码控制)
相关问题