无法执行jar文件(包含依赖项),这是从gradle构建的

时间:2014-11-10 10:06:44

标签: gradle dependencies

我是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')

但没有成功。

提前致谢

2 个答案:

答案 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的系统)。