我是gradle的新手,我正在尝试构建一个依赖于其他jar文件的java文件。它正在正确构建,但是当我尝试执行它时,它给出了“NoClassDefinitionFoundError”。
我的build.gradle文件是:
apply plugin : 'java'
jar {
manifest {
attributes 'Main-Class': 'Hey'
}
}
dependencies
{
compile files('lib/BuildBasicJavaProject.jar') ------line A
}
如果我删除了上面的行A ,那么它甚至都没有构建项目。
如果我将行保留为行,那么它可以正确构建并生成jar文件,但是当我使用,
java -jar jarfilename.jar
那么它给了我一个NoClassDefinitionFoundError。
运行jar文件时,我需要在哪里指定依赖路径?
可能是一个基本的疑问,但我已经浪费了2天了,我尝试给
1)依赖文件的绝对路径
2)添加以下行,
runtime files('lib/BuildBasicJavaProject.jar')
但是没有成功。
提前致谢
最佳答案
首先欢迎来到Gradle世界。
您的Gradle脚本似乎是正确的。当您具有依赖项时,一个jar依赖于另一个jar,就像您在编译时的情况一样,您可以像定义时那样定义编译时依赖项。因此,如果需要此jar来运行它,则需要运行时依赖项。但是Gradle会自动将您所有的编译时相关性都设为运行时相关性。因此,您无需明确指定它们。
那么为什么您的代码无法正常工作呢?
如果使用- jar 选项,则将classpath(-cp)选项设置为,而忽略。因此,在键入jar时不能使用-cp指定从属jar。因此,如果在Windows上,则必须编写
java -cp myJar.jar;.\lib\BuildBasicJavaProject.jar Hey
或在Linux中使用(:)和斜杠(/)。
其中嘿是您的主类的全称呼名称,必须在 list 中进行定义。
因此,如果您的类(class)Hey在包中: com.alabala.dev ,它的名称是嘿,它的完全限定名称是com.alabala.dev.Hey。所以你必须告诉Gradle
mainClassName = "com.alabala.dev.Hey"
因此,现在Gradle将其放在 list 中,当您尝试在JVM中加载此jar时,她将知道要启动它,必须执行com.alabala.dev.Hey。
什么是 cp ,为什么必须指定它?用简单的词cp来表示类路径-类目录和归档文件,JVM希望在其中装载内容时在其中进行搜索。因此,这里与Gradle无关,它是Java。
关于gradle - 无法执行从gradle构建的jar文件(包含依赖项),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26841176/