如何创建一个具有依赖关系的可运行jar

时间:2015-03-28 20:53:04

标签: java gradle

这是我第一次使用Gradle 2.3进行实验,看起来应该这么简单,我错过了一些明显的东西,但我无法弄明白。从文档中没有任何东西跳出来,我已经尝试了几个谷歌搜索但没有任何区别的东西。

我有一个简单的项目,它写入并从MongoDB数据库中读回一些信息。它工作正常;我可以执行它:

  • 在命令行上通过gradle run
  • 来自Eclipse Luna
  • 通过从Eclipse生成的jar文件,我可以通过java命令
  • 运行

但是,我无法从Gradle本身生成可运行的jar文件。我的build.gradle文件包含:

apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'com.poldie.quicktest.HelloWorld'

jar {
    manifest {
        attributes 'Main-Class': 'com.poldie.quicktest.HelloWorld'
    }

    baseName = 'my-handy-jar'

}

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.springframework.data:spring-data-mongodb:1.7.0.RELEASE'
}

当我检查my-handy.jar.jar时,我看到了:

$ jar tf my-handy-jar.jar 
META-INF/
META-INF/MANIFEST.MF
com/
com/poldie/
com/poldie/quicktest/
com/poldie/quicktest/Person.class
com/poldie/quicktest/HelloWorld.class

尝试运行它给了我:

$ java -jar my-handy-jar.jar 
    Error: A JNI error has occurred, please check your installation and try again
    Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/data/mongodb/core/MongoOperations
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
        at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
        at java.lang.Class.getMethod0(Class.java:3018)
        at java.lang.Class.getMethod(Class.java:1784)
        at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
    Caused by: java.lang.ClassNotFoundException: org.springframework.data.mongodb.core.MongoOperations
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 7 more

显然,Eclipse生成的jar文件要大得多,包含依赖项,并且有效。我如何使用Gradle实现这一目标?

(在添加MongoDB依赖项之前,使用gradle build创建jar工作在我项目的更简单版本上)

1 个答案:

答案 0 :(得分:1)

您需要在清单中添加一个类路径条目,列出此依赖的jar,作为相对于此.jar文件位置的相对URL。通常,其他.jar文件将位于同一目录或lib /子目录中。