我是gradle的新手,我正在尝试构建一个依赖于其他jar文件的java文件。它正在构建正确,但是当我尝试执行它时,它正在给出" NoClassDefinitionFoundError"。
我的build.gradle文件是:
apply plugin : 'java'
jar {
manifest {
attributes 'Main-Class': 'Hey'
}
}
dependencies
{
compile files('lib/BuildBasicJavaProject.jar') ------line A
}
如果我删除上面的 A行,那么它甚至没有构建项目。 如果我保留 A行那么它正在构建并生成jar文件,但当我使用时执行它,
java -jar jarfilename.jar
然后它给了我一个NoClassDefinitionFoundError。
在运行jar文件时,我需要在哪里指定依赖路径?
可能是一个基本的疑问,但我已经浪费了2天,我试着给予 1)依赖文件的绝对路径
2)添加以下行,
runtime files('lib/BuildBasicJavaProject.jar')
但没有成功。
提前致谢
答案 0 :(得分:1)
首先欢迎来到Gradle世界。 您的Gradle脚本似乎是正确的。当你有一个依赖项时,一个jar依赖于另一个jar,就像你在编译时的情况一样定义编译时依赖性就像你一样。因此,如果你需要这个jar运行它,你需要运行时依赖。但Gradle会自动将所有编译时依赖项都设置为运行时依赖项。因此您无需明确指定它们。
那么为什么你的代码不起作用?
如果使用 - jar 选项,则类路径(-cp)选项忽略。所以当你输入jar时你不能使用-cp指定依赖jar。你必须写如果你在Windows上
java -cp myJar.jar;.\lib\BuildBasicJavaProject.jar Hey
或者使用(:)和斜杠(/)用于Linux。
嘿是主类的完全确定名称,必须在Manifest中进行定义。
因此,如果您的班级Hey在包中: com.alabala.dev 且名称为嘿,则其完整限定名称为com.alabala.dev.Hey。所以你必须告诉Gradle
mainClassName = "com.alabala.dev.Hey"
所以现在Gradle把它放在清单中,当你试图在JVM中加载这个jar时,她会知道要启动它,她必须执行com.alabala.dev.Hey。
什么是 cp 以及为什么必须指定它?用简单的单词表示cp是classpath - JVM在想要加载东西时搜索的目录和档案。所以这里没有什么与Gradle的linekd它是Java。
答案 1 :(得分:0)
当您执行jar时,您将要指定依赖jar作为classpath的一部分。 这些方面的东西:
java -cp myJar.jar:./lib/BuildBasicJavaProject.jar my.package.MyMainClass
请记住,类路径分隔符在不同平台上是不同的(:适用于基于* nix的系统)。