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

标签 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 ,那么它甚至都没有构建项目。
如果我将行保留为行,那么它可以正确构建并生成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/

相关文章:

java - 嵌入 Neo4j 到底需要哪些 jar?

grails - 创建和安装 grails 插件 - 我的插件如何从安装期间/安装后依赖的插件访问资源?

java - 无法使用子/模块解析 MAVEN 项目中的类依赖关系(在 Eclipse 和 mnv CLI 中看到)

安卓和 iOS : How to handle dependencies when building an SDK

android - 如何使用 Gradle 更改 App Bundle 生成的文件名?

android - 在AndroidStudio 3.1.1上更新Gradle后找不到AndroidJUnit4

gradle - 无法在gradle初始化脚本(包括github项目)中应用外部插件

javascript - 如何在 "traditional website"上使用 node_modules ?

android - Android Studio建议

java - 在gradle中为子项目配置父/根项目