签名 java 11 jar with jarsigner duplicate entry module-info.class
Signing java 11 jar with jarsigner duplicate entry module-info.class
嗨,我是 java 模块的新手,所以这可能是一个愚蠢的问题。
我试图用密钥库对我的 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 的内容,是的,它确实有多个模块-info.class 文件
是否可以将它们结合起来?以及如何?
我的模块-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) }
}
}
我知道我不应该 post 截图,但这是用存档管理器打开的 jar
有 7 个模块-info.class 文件,第一个生成于 2018 年 12 月 23 日(今天),其余全部来自 2018 年 11 月 5 日,我记得升级到 java 11天,
所以这些是从我的依赖项中添加的,我怎样才能将它们集成到一个 class?或者还有其他选择来签署 jar 吗?
同样,这是来自菜鸟。
[编辑]
如果您正在寻找完整的源代码,它在 GitHub -> https://github.com/CodingOtaku/Animu-Downloaderu
根据您发布的 build.gradle,当您 运行:
./gradlew jar
您正在创建一个 fat/shadow jar,它将所有依赖项捆绑在一起,包括一个大 jar 中的模块化依赖项。此过程将每个 jar(类 和资源)中的所有文件提取到 libs 文件夹中,最后将其压缩到项目的 shadow 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.
的本机库
可以找到创建跨平台 jar 的一个选项 here,部分非模块化应用程序 -> Gradle -> 跨平台 jar。
jlink
或者您可以考虑使用 jlink
进行分发,因为您的应用已经 modular.
在这种情况下,您将为给定平台生成自定义图像。您可以考虑为每个平台创建一个。
改为查看此 doc, section Modular with Gradle, and use the jlink
task, or try the badass-jlink-plugin。
jpackage
Java12 的 jpackage
工具有一个 preview。有了它,您可以为每个平台创建一个安装程序。
嗨,我是 java 模块的新手,所以这可能是一个愚蠢的问题。
我试图用密钥库对我的 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 的内容,是的,它确实有多个模块-info.class 文件
是否可以将它们结合起来?以及如何?
我的模块-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) }
}
}
我知道我不应该 post 截图,但这是用存档管理器打开的 jar
有 7 个模块-info.class 文件,第一个生成于 2018 年 12 月 23 日(今天),其余全部来自 2018 年 11 月 5 日,我记得升级到 java 11天,
所以这些是从我的依赖项中添加的,我怎样才能将它们集成到一个 class?或者还有其他选择来签署 jar 吗?
同样,这是来自菜鸟。
[编辑] 如果您正在寻找完整的源代码,它在 GitHub -> https://github.com/CodingOtaku/Animu-Downloaderu
根据您发布的 build.gradle,当您 运行:
./gradlew jar
您正在创建一个 fat/shadow jar,它将所有依赖项捆绑在一起,包括一个大 jar 中的模块化依赖项。此过程将每个 jar(类 和资源)中的所有文件提取到 libs 文件夹中,最后将其压缩到项目的 shadow 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.
的本机库可以找到创建跨平台 jar 的一个选项 here,部分非模块化应用程序 -> Gradle -> 跨平台 jar。
jlink
或者您可以考虑使用 jlink
进行分发,因为您的应用已经 modular.
在这种情况下,您将为给定平台生成自定义图像。您可以考虑为每个平台创建一个。
改为查看此 doc, section Modular with Gradle, and use the jlink
task, or try the badass-jlink-plugin。
jpackage
Java12 的 jpackage
工具有一个 preview。有了它,您可以为每个平台创建一个安装程序。