标签: jlink

带有加密提供程序的签名模块化 JAR 无法链接到运行时映像

我正在尝试使用 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

6
推荐指数
1
解决办法
358
查看次数

Jlink弹簧靴

我有一个简单的 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)

java spring jlink maven spring-boot

6
推荐指数
1
解决办法
4857
查看次数

找到丢失的模块

我的问题:在构建最小的 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)

现在我的项目运行良好。我怎样才能避免试错步骤?

java jlink java-module

6
推荐指数
1
解决办法
909
查看次数

为什么我的 JavaFX 应用程序的运行时映像(由 jlink 组装)无法启动并正常工作?

我有一个简单的 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 编译我的模块化应用程序: …

java javafx jlink java-module

6
推荐指数
1
解决办法
497
查看次数

使用 Moditect 将模块信息添加到现有的 Maven 依赖项

我正在使用 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)

java jlink maven moditect

6
推荐指数
1
解决办法
456
查看次数

有没有办法在使用maven-jlink-plugin时添加maven依赖项?

我正在使用这个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)

java jodatime jlink maven java-9

5
推荐指数
2
解决办法
2190
查看次数

java 9 第三方模块适用于 IDE,但不适用于 jlink

该程序基于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 jlink apache-poi hikaricp java-9

5
推荐指数
1
解决办法
824
查看次数

gradle/JavaFX 项目中模块 javafx.base 的两个版本

我的团队正在开发一个 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)

javafx gradle jlink

5
推荐指数
1
解决办法
672
查看次数

JLINK如何使用

我们正在研究如何升级到Java 9。JLINK的一个新功能是生成我们自己的JRE,它与我们的应用程序完美匹配。

我对此有一些天真的问题:

  • 什么情况下我们应该这样做?我了解微服务的好处,但是 Web 应用程序呢?

  • 大公司真的在使用它吗?还是他们大多使用常用的 JDK?

  • 如何维护JLINK JRE?我们是否应该在每个新的 Java 版本中重建它(对于 Docker 镜像也是如此......)

  • 如果 graalVM 与我们的应用程序兼容,不是总是更好/更容易吗?

谢谢。

java jlink docker graalvm

5
推荐指数
1
解决办法
960
查看次数

使用 jdeps + jlink + jpackage 构建 Windows 自包含应用程序后的 EXCEPTION_ACCESS_VIOLATION

我试图建立一个束(自包含的应用程序)windows使用jdeps+ jlink+ jpackage

在 mac 上,使用相同的过程,我设法为这个项目图形编辑器创建(遵循JPackageScriptFX作为参考)一个完全工作的自包含“.app”,通过组合和 使用+ +的脚本。mavenjdepsjlinkjpackage

我预计,对于相同的配置jdeps+ jlink+jpackage将在Windows安装后,工作过的WiX 3.X

该过程运行良好并生成安装程序,但不幸的是,当我启动“.exe”文件时出现以下错误。

  • 可以在此处找到有关我使用的配置的更多详细信息。
  • 我使用的“bat”脚本是这个:build_app.bat
  • 在 Windowsmaven 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)

java jlink maven jdeps jpackage

5
推荐指数
1
解决办法
221
查看次数