这是我第一次使用Gradle 2.3进行实验,看起来应该这么简单,我错过了一些明显的东西,但我无法弄明白。从文档中没有任何东西跳出来,我已经尝试了几个谷歌搜索但没有任何区别的东西。
我有一个简单的项目,它写入并从MongoDB数据库中读回一些信息。它工作正常;我可以执行它:
gradle run
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工作在我项目的更简单版本上)
答案 0 :(得分:1)
您需要在清单中添加一个类路径条目,列出此依赖的jar,作为相对于此.jar文件位置的相对URL。通常,其他.jar文件将位于同一目录或lib /子目录中。