gpt4 book ai didi

java - 使用 jarsigner 重复条目 module-info.class 签署 java 11 jar

转载 作者:搜寻专家 更新时间:2023-10-31 19:59:26 24 4
gpt4 key购买 nike

您好,我是 Java 模块的新手,所以这可能是一个愚蠢的问题。

我试图用 keystore 签署我的 jar 文件,但出现以下错误。

user@Ubuntu:libs(master)$ jarsigner -keystore keyStoreFileName Test.jar alias
Enter Passphrase for keystore:
jarsigner: unable to sign jar: java.util.zip.ZipException: duplicate entry: module-info.class

我找不到任何关于如何避免这种情况的文档。

所以我做了 jar -tf 来检查 jar 的内容,是的,它确实有多个 module-info.class 文件

是否有组合它们的选项?以及如何?

我的 module-info.java 包含以下内容。

module module_name {
requires java.desktop;
requires java.prefs;
requires javafx.controls;
requires javafx.fxml;
requires javafx.web;
requires org.jsoup;
opens com.test.apps to javafx.fxml;
exports com.test.apps;
}

我正在像这样用 gradle 创建 jar

jar {
manifest {
attributes 'Main-Class': 'com.test.apps.Main'
attributes 'Application-Name': 'Test'
}

from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}

}

我知道我不应该发布屏幕截图,但这是使用存档管理器打开的 jar Archive manager screenshot

有 7 个 module-info.class 文件,第一个生成于 18 年 12 月 23 日(今天),其余全部来自 2018 年 11 月 5 日,我记得那天升级到 java 11,

所以那些是从我的依赖项中添加的,我怎样才能将它们集成到一个类中?或者还有其他选择来签署 jar 吗?

同样,这是来自菜鸟。

[编辑]如果您正在寻找完整的源代码,它在 GitHub -> https://github.com/CodingOtaku/Animu-Downloaderu

最佳答案

根据您发布的 build.gradle,当您运行时:

./gradlew jar

您正在创建一个 fat/shadow jar,它将所有依赖项捆绑在一起,包括一个大 jar 中的模块化依赖项。此过程将每个 jar 中的所有文件(类和资源)提取到 libs 文件夹中,最后将其压缩到项目的影子 jar 中。

模块化依赖项(至少是 JavaFX jar)在其 jar 文件中包含一个 module-info.class 文件。所以这些将被添加到 libs 文件夹中。

作为 jar 任务的结果,根据您的平台,您最终可能只会得到这些文件中的一个(如果粘贴了具有相同名称的文件,则添加的第一个或最后一个文件)到一个文件中),或与所有文件一起使用(如果保留所有文件,即使名称相同,这似乎是您的情况)。

无论哪种方式,由于您正在创建一个 fat jar,您将按以下方式运行它:

java -jar my-fat-jar.jar

为此你根本不需要模块。

解决方案

所以一个简单的解决方案是从你的 fat jar 中排除模块信息文件:

jar {
manifest {
attributes 'Main-Class': 'your.main.class'
}
from {
exclude '**/module-info.class'
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}

跨平台jar包

注意你的jar是releasing不是跨平台的,因为它只包含 Linux 的 native 库。

可以找到一个创建跨平台 jar 的选项 here ,部分非模块化应用程序 -> Gradle -> 跨平台 jar。

jlink

或者您可以考虑使用 jlink 进行分发,因为您的应用程序已经是 modular .

在这种情况下,您将为给定平台生成自定义图像。您可以考虑为每个平台创建一个。

查看此 doc , Modular with Gradle 部分,并使用 jlink 任务,或尝试 badass-jlink-plugin相反。

jpackage

有一个preview Java 12 的 jpackage 工具。有了它,您可以为每个平台创建一个安装程序。

关于java - 使用 jarsigner 重复条目 module-info.class 签署 java 11 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53902118/

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