gpt4 book ai didi

java - 如何使用 gradle 创建的 fatJar 中存在的主要方法执行类

转载 作者:行者123 更新时间:2023-11-30 10:27:01 24 4
gpt4 key购买 nike

这是 how to execute a built fat JAR as a gradle task? 的后续问题我没有足够的分数来提出我的问题作为评论。所以我得再问一遍。这个问题已经在其他格式和场景中多次被问到,但这些回答都没有帮助我。

我的问题:

场景 1:使用 gradle fatJar 创建一个带有依赖项的 jar

场景 2:使用 maven 程序集创建具有依赖项的单个 jar

执行

java -cp sample.jar com.example.ClassA

在两个进程中生成的 jar 文件。

问题:过程 1 中的 jar 给了我

错误:无法找到或加载主类 com.example.ClassA

进程 2 中的 jar 正确执行。

我已经提取了两个 jar 文件,它们具有相同的文件夹结构和相同的文件 - 这意味着编译的类文件存在于两个 jar 文件中。

我没有在这两个进程中指定任何 list 条目,因为我有多个主类并且我没有尝试生成可执行 jar 文件。

我的 build.gradle 文件如下所示:

apply plugin: 'java'
apply plugin: 'maven'

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
mavenLocal()
}

sourceSets {
main{
java{
srcDirs 'src/main/java'
}
}
}

processResources {
from 'src/main/resources'
}

task compile (type: JavaCompile) {
source = sourceSets.main.java.srcDirs
include '**/*.java'
classpath = sourceSets.main.compileClasspath
destinationDir = sourceSets.main.output.classesDir
}

compile.options.compilerArgs = ["-sourcepath", "$projectDir/src/main/java"]

dependencies {
.
.
.

}

task fatJar(type:Jar) {
baseName = 'xxxxxxx'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}

defaultTasks 'clean', 'compile', 'fatJar'

编辑 - 1:

我试过 jar 的相对路径、jar 的绝对路径,甚至浏览到包含 jar 的文件夹。没有任何运气。

我试过使用“/”而不是“.”在包名中。那里也没有运气。

我尝试过使用 Java VM 参数提供足够大的堆空间。纳达。

尝试在 powershell 上执行。出现以下错误:

+ CategoryInfo          : NotSpecified: (Error: Could not lo...ClassA:String) [], RemoteException

+ FullyQualifiedErrorId : NativeCommandError

我想直接查看内容,所以使用了 jar -tvf path_to_jar\sample.jar 。有趣的是 jar 命令没有执行,并提示说在类路径中找不到命令。我不得不浏览到 java 安装目录并执行命令,它显示了文件内容。

我在这里没有想法和选择。有什么指点吗?

最佳答案

出于某种原因,无论我对 fatJar 使用哪种配置,最终的 jar 在尝试执行主类时都会出错。

使用 ShadowJar 任务,我能够构建必要的 jar 并执行问题中指定的主类。

我知道这违背了关于使用 fatJar 和执行主类的问题的全部目的。但由于时间限制,我不得不寻找替代方案。

对于那些正在为 Shadow Jar 任务寻找配置的人,我使用以下方法完成了它:

buildscript {
repositories {
mavenLocal()
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3'
}
}
}


apply plugin: 'com.github.johnrengelman.shadow'

最后为了执行任务,我使用了

gradle shadowJar

关于java - 如何使用 gradle 创建的 fatJar 中存在的主要方法执行类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45471440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com