我正在尝试使用 jlink 工具来构建一个 java 可执行文件。我按以下方式使用它:
jlink.exe --module-path <path-to-modules> --add-modules <my-module-name> --output dist --launcher launch=org.demo/org.demo.Main --strip-debug --compress 2 --no-header-files --no-man-pages
Run Code Online (Sandbox Code Playgroud)
但它给了我以下错误:
Error: signed modular JAR <path-to-modules>\bcprov.jdk15on.jar is currently not supported, use --ignore-signing-information to suppress error
Run Code Online (Sandbox Code Playgroud)
当我添加“--ignore-signing-information”选项时,它可以很好地构建我的可执行文件,但它给了我以下警告:
WARNING: signed modular JAR <path-to-modules>\bcprov.jdk15on.jar is currently not supported
Run Code Online (Sandbox Code Playgroud)
然后,当我执行已经构建的可执行文件时,我收到以下异常:
org.apache.sshd.common.SshException: Failed (NoSuchProviderException) to execute: JCE cannot authenticate the provider BC
at sshd.core/org.apache.sshd.common.future.AbstractSshFuture.verifyResult(Unknown Source)
at sshd.core/org.apache.sshd.client.future.DefaultAuthFuture.verify(Unknown Source)
at sshd.core/org.apache.sshd.client.future.DefaultAuthFuture.verify(Unknown Source)
Caused by: java.util.jar.JarException: Non-Oracle JCE providers may not be linked into the image,they must be …Run Code Online (Sandbox Code Playgroud) jar-signing jlink java-platform-module-system java-9 java-module
我有一个简单的 hello world spring 2 boot 应用程序,它使用完整的 JDK 13 运行。现在我尝试使用 spring boot 让它与自定义 JRE 一起运行。
过去,当我需要外部 jar 时,我会跑去jdeps -s json-20190722.jar看我需要什么模块。
$jdeps -s json-20190722.jar
json-20190722.jar -> java.base
Run Code Online (Sandbox Code Playgroud)
但是当我用 Spring 这样做时,我得到了
$jdeps -s spring-boot-2.2.4.RELEASE.jar
spring-boot-2.2.4.RELEASE.jar -> java.base
spring-boot-2.2.4.RELEASE.jar -> java.desktop
spring-boot-2.2.4.RELEASE.jar -> java.logging
spring-boot-2.2.4.RELEASE.jar -> java.management
spring-boot-2.2.4.RELEASE.jar -> java.naming
spring-boot-2.2.4.RELEASE.jar -> java.sql
spring-boot-2.2.4.RELEASE.jar -> java.xml
spring-boot-2.2.4.RELEASE.jar -> not found
Run Code Online (Sandbox Code Playgroud)
当我这样做时它也失败了
$ jdeps --generate-module-info . spring-boot-2.2.4.RELEASE.jar | more
Missing dependence: ./spring.boot/module-info.java not generated
Error: missing dependencies
spring.boot
org.springframework.boot.Banner -> org.springframework.core.env.Environment not …Run Code Online (Sandbox Code Playgroud) 我的问题:在构建最小的 JRE 时,如何确保没有缺少所需的模块?
为了说明这个问题,这里有一个例子,我想为我的项目构建一个最小的 JRE。在此示例中,我们假设 logback 是我唯一的依赖项。
我运行以下命令来查看需要哪些模块:
$ jar --file=logback-core-1.2.3.jar --describe-module
No module descriptor found. Derived automatic module.
logback.core@1.2.3 automatic
requires java.base mandated
contains ch.qos.logback.core
contains ch.qos.logback.core.boolex
etc. (there are more "contains ch.qos.logback.XXX" lines)
Run Code Online (Sandbox Code Playgroud)
看来我只需要该java.base模块,并相应地构建了我的最小 JRE:
jlink --output jre-min --add-modules java.base
Run Code Online (Sandbox Code Playgroud)
然而,当使用最小的 JRE 运行项目时,我在使用 logback 的电子邮件记录器时遇到了问题(通过 TLS 的格式错误的电子邮件)。经过反复试验,我发现jdk.crypto.cryptoki还需要该模块:
jlink --output jre-min --add-modules java.base,jdk.crypto.cryptoki
Run Code Online (Sandbox Code Playgroud)
现在我的项目运行良好。我怎样才能避免试错步骤?
我有一个简单的 JavaFX Web 浏览器,它是一个模块。该模块的目录结构为:
webBrowser
webBrowser/module-info.java
webBrowser/webbrowser
webBrowser/webbrowser/WebBrowser.java
Run Code Online (Sandbox Code Playgroud)
这是 module-info.java 的代码
module webBrowser {
requires javafx.controls;
requires javafx.web;
exports webbrowser;
}
Run Code Online (Sandbox Code Playgroud)
以下是 WebBrowser.java 的代码:
package webbrowser;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.web.WebView;
import javafx.scene.web.WebEngine;
import javafx.stage.Stage;
public class WebBrowser extends Application {
@Override
public void start(Stage stage) {
WebView browser = new WebView();
WebEngine webEngine = browser.getEngine();
webEngine.load("http://www.oracle.com");
Scene scene = new Scene(browser, 1200, 900);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
Run Code Online (Sandbox Code Playgroud)
我用 javac 编译我的模块化应用程序: …
我正在使用 JavaFX,并且有一些不是自动模块的依赖项。当尝试运行时,mvn clean javafx:jlink我收到以下错误:
Error: automatic module cannot be used with jlink: org.apache.commons.io from [...]`
Run Code Online (Sandbox Code Playgroud)
这对于org.apache.commons.commons-lang3和也产生了错误commons-codec.commons-codec。我看到的错误是随机的。
所以我研究使用 jdeps 来生成依赖项的模块信息,例如
jdeps --generate-module-info tmp .../.m2/repository/commons-io/commons-io/2.12.0/commons-io-2.12.0.jar
Run Code Online (Sandbox Code Playgroud)
然后我使用 Moditect 将模块信息添加到现有的 jar 中:
Error: automatic module cannot be used with jlink: org.apache.commons.io from [...]`
Run Code Online (Sandbox Code Playgroud)
但我仍然遇到同样的错误。
我的模块信息:
jdeps --generate-module-info tmp .../.m2/repository/commons-io/commons-io/2.12.0/commons-io-2.12.0.jar
Run Code Online (Sandbox Code Playgroud)
我的完整 pom.xml:
<plugin>
<groupId>org.moditect</groupId>
<artifactId>moditect-maven-plugin</artifactId>
<version>1.0.0.Final</version>
<executions>
<execution>
<id>add-module-infos</id>
<phase>generate-resources</phase>
<goals>
<goal>add-module-info</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/modules</outputDirectory>
<modules>
<module>
<artifact>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.12.0</version>
</artifact>
<moduleInfoSource>
module org.apache.commons.io {
exports org.apache.commons.io;
exports …Run Code Online (Sandbox Code Playgroud) 我正在使用这个Github项目来接触Java 9中的新模块化功能.我想为项目添加依赖项并能够构建本机映像.但是,当我尝试向pom.xml添加新的依赖项,并将requires语句添加到module-info.java时,我从maven-jlink-plugin中收到以下错误:
Error: module-info.class not found for joda.time module
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用它作为概念证明,我可以使用新的链接阶段部署图像,但自然我需要能够具有外部依赖性,我需要使用maven(工作约束).
对mod-jar/pom.xml的更改
...
<dependencies>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.9</version>
</dependency>
</dependencies>
...
Run Code Online (Sandbox Code Playgroud)
MOD-罐/ module-info.java
module com.soebes.nine.jar {
requires java.base;
requires joda.time;
exports com.soebes.example.nine.jar;
}
Run Code Online (Sandbox Code Playgroud)
日志:
[INFO] --- maven-jlink-plugin:3.0.0-alpha-1:jlink (default-jlink) @ mod-jlink ---
[INFO] Toolchain in maven-jlink-plugin: jlink [ /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/jlink ]
[INFO] The following dependencies will be linked into the runtime image:
[INFO] -> module: com.soebes.nine.one ( /Users/sebastianrestrepo/Projects/jdk9-jlink-jmod-example/maven-example/mod-1/target/jmods/com.soebes.nine.one.jmod )
[INFO] -> module: com.soebes.nine.two ( /Users/sebastianrestrepo/Projects/jdk9-jlink-jmod-example/maven-example/mod-2/target/jmods/com.soebes.nine.two.jmod )
[INFO] -> module: com.soebes.nine.jar ( …Run Code Online (Sandbox Code Playgroud) 该程序基于JDK 9(JPMS),使用IDE(Intellij)时使用一些第三方jar,如Apache(poi-3.17.jar,commons-io-2.6.jar)和HikariCP(HikariCP-3.1.0.jar) ) 我“需要”它们并且程序运行良好。当我尝试使用 java9 'jlink' 获取自定义 JRE 时,我得到以下信息:
/out$ jlink --module-path production --add-modules
studyModule,java.base,java.datatransfer,java.desktop,java.logging,
java.scripting,java.sql,java.xml,java.prefs,javafx.base,
javafx.controls,javafx.fxml,javafx.graphics,javafx.media,
javafx.swing,javafx.web,jdk.jsobject,jdk.xml.dom,jdk.unsupported
--output studyJre
Error: module-info.class not found for com.zaxxer.hikari module
/out$ jlink --module-path production --add-modules
studyModule,java.base,java.datatransfer,java.desktop,java.logging,
java.scripting,java.sql,java.xml,java.prefs,javafx.base,
javafx.controls,javafx.fxml,javafx.graphics,javafx.media,
javafx.swing,javafx.web,jdk.jsobject,jdk.xml.dom,jdk.unsupported
--output studyJre
Error: module-info.class not found for poi module
Run Code Online (Sandbox Code Playgroud)
问题是:为什么那些带有 IDE 的包可以正常工作?如果它们没有被模块化,那么也不应该在 IDE 中工作。
PS:在使用 jlink 时,我将这些 jars 添加到“root”文件夹中。
我的团队正在开发一个 Java 项目。(git repo @ https://github.com/RaiderRobotix/Scouting-Client-FX)。我们正在尝试使用 jlink 对其进行打包。运行jlink任务时显示如下(gradlew jlink)。我在 macOS 上使用 gradle 6.1.1 和 jdk 11。如果您想查看我们的 module-info.java,请查看 repo。我不想让这个问题太长。
顺便说一句,我的机器上有多个 JDK(8,11)。构建项目有效,但使用它运行gradlew run却无效(我认为这是与 lombok 无关的问题)。
完整错误: Error: Two versions of module javafx.base found in ./build/jlinkbase/jlinkjars (Infinite Recharge Client-v4.0.0-alpha.jar and javafx-base-11-mac.jar)
构建.gradle
plugins {
id 'java'
id 'idea'
id "org.openjfx.javafxplugin" version "0.0.8"
id 'org.beryx.jlink' version '2.17.2'
id "com.github.johnrengelman.shadow" version "5.2.0"
id 'org.jetbrains.kotlin.jvm' version '1.3.61'
id 'com.github.gmazzo.buildconfig' version '1.6.2'
}
group = "com.github.RaiderRobotix"
version = "v4.0.0-alpha"
repositories {
maven …Run Code Online (Sandbox Code Playgroud) 我们正在研究如何升级到Java 9。JLINK的一个新功能是生成我们自己的JRE,它与我们的应用程序完美匹配。
我对此有一些天真的问题:
什么情况下我们应该这样做?我了解微服务的好处,但是 Web 应用程序呢?
大公司真的在使用它吗?还是他们大多使用常用的 JDK?
如何维护JLINK JRE?我们是否应该在每个新的 Java 版本中重建它(对于 Docker 镜像也是如此......)
如果 graalVM 与我们的应用程序兼容,不是总是更好/更容易吗?
谢谢。
我试图建立一个束(自包含的应用程序)windows使用jdeps+ jlink+ jpackage。
在 mac 上,使用相同的过程,我设法为这个项目图形编辑器创建(遵循JPackageScriptFX作为参考)一个完全工作的自包含“.app”,通过组合和 使用+ +的脚本。mavenjdepsjlinkjpackage
我预计,对于相同的配置jdeps+ jlink+jpackage将在Windows安装后,工作过的WiX 3.X。
该过程运行良好并生成安装程序,但不幸的是,当我启动“.exe”文件时出现以下错误。
maven install上的主项目上运行 a可以复制问题。#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000000000000, pid=16672, tid=5124
#
# JRE version: (15.0+36) (build )
# Java VM: OpenJDK 64-Bit …Run Code Online (Sandbox Code Playgroud) jlink ×10
java ×8
maven ×4
java-9 ×3
java-module ×3
javafx ×2
apache-poi ×1
docker ×1
graalvm ×1
gradle ×1
hikaricp ×1
jar-signing ×1
java-platform-module-system ×1
jdeps ×1
jodatime ×1
jpackage ×1
moditect ×1
spring ×1
spring-boot ×1