问题标签 [jlink]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1058 浏览

java - jlink 选项 compress 有什么作用?

jlink 压缩选项有什么作用?oracle 文档对此没有很详细的说明:

什么是被压缩的资源?有什么缺点--compress=2吗?

0 投票
1 回答
721 浏览

java - jlink JRE 可以与外部 JAR 文件一起使用吗?

Java 中的 jlink 功能允许您为应用程序创建单独的运行时环境。通常,这个应用程序所需的所有模块都被 jlink 压缩到一个大的“模块”文件中。

我有兴趣找出是否有办法省略一些模块,以便它们是单独的 jar 文件,但这样 jlink 将能够找到它们并仍然运行应用程序。有没有办法做到这一点?

例如,如果您正在处理 LGPL 库,则这种情况的一个用例是。您可能希望将 LGPL 库排除在模块的巨大“blob”之外并将其作为单独的 jar 保留,以便想要将 jar 交换为不同版本/调整版本的人可以(这是 LGPL 要求的) .

Jlink 有一个“需要静态”语句,您可以使用它来要求可选模块。我认为使用它可能会起作用,但我遇到了这个问题。

当我用需要静态编译一个项目时,我已经能够通过使用 java 的“--add-modules”开关包含模块来运行它。但是,一旦我在其上运行 jlink 以创建自定义图像,我就无法让它工作。

当我尝试运行 jlinked 项目时,我得到 ClassNotFound 异常。

当您在项目上运行 jlink 时,它会创建一个自定义运行时映像。项目的所有主要模块都放入一个名为 modules 的图像文件中。我已经使用 jimage 命令检查了这个图像文件,并且我已经确认这个图像文件不包含我声明为静态的模块。

使用 jlink,我尝试将静态声明的模块中的 jar 文件放入带有模块映像的目录中。然后我尝试使用“--add-modules”手动添加模块,以及使用-p和-cp来指定带有jar的目录,但我仍然得到一个ClassNotFound异常。

0 投票
2 回答
4897 浏览

java - JRE 何时作为单独的产品完全停产?

从 Java 9 开始引入了模块系统,使得单独提供 JRE变得多余

通过,似乎仍然可以下载它。例如,现在从这里开始Java 9 存档 此外,这里只声明:

重构 JDK 和 JRE 运行时映像,以明确区分开发人员、部署人员和最终用户可以依赖并在适当时修改的文件,而不是实现内部的文件,这些文件可能会在没有更改的情况下进行更改注意。

新的映像结构消除了这种区别:JDK 映像只是一个运行时映像,恰好包含全套开发工具和历史上在 JDK 中发现的其他项目。

所以没有谈论完全删除。来自:jdk-9

当您安装 jdk-9 时,公共 jre-9 也会自动安装。

另外,我认为从 Java 9 开始,应该始终使用 jlink 创建自定义运行时,但现在似乎只从 Java 11 开始强制执行。从 Java 11 的发行说明here Oracle JDK release notes

在 Windows 和 macOS 中,在以前的版本中安装 JDK 可以选择安装 JRE。在 JDK 11 中,这不再是一个选项。在此版本中,不再提供 JRE 或服务器 JRE。仅提供 JDK。用户可以使用 jlink 创建更小的自定义运行时。

但后来我可以找到很多这样的讨论:

是不是这样,从 Java 11 开始就不能直接下载 JRE 了?还是我在(Oracle 和 OpenJDK)之间混合实现?或者上面的讨论是否具有误导性?

编辑:我不需要下载 jre,我可以通过 jlink 创建它或使用已经可用的解决方案,我的问题更多是理论上的

0 投票
1 回答
580 浏览

java - OpenJDK 13/jpackage - Windows 下捆绑应用程序和运行时的问题

我正在 OpenJDK 13 中测试 jpackage 实用程序以创建捆绑包和安装程序。只要我使用 OpenJDK 作为创建包的运行时,它就可以在 Windows 和 MacOS 上运行良好。但是 OpenJDK13 没有发布,我喜欢使用 OpenJDK12 作为运行时。所以我正在创建一个 OpenJDK12 运行时:

我在 jpackage 中使用这个运行时

创建捆绑包时没有错误消息。但是当我尝试启动应用程序时,我在 Windows 下收到错误“无法启动 JVM”。

如果我在 MacOS 上尝试同样的操作,一切正常。

有没有人有想法或一些提示有什么问题?或者我可以在哪里搜索解决方案或更多信息?

谢谢

0 投票
1 回答
109 浏览

java - jlink 图像中的语言环境 getDisplayLanguage 损坏

这里是 SSCCE:

编译运行时正确显示

但是,如果我现在通过 jlink 创建一个自定义运行时映像并使用它运行它,我会得到:

无论使用哪种语言环境,它总是回退到看起来的英语语言。也许我需要一个额外的模块?运行时映像生成如下:

我的JDK版本:

0 投票
0 回答
724 浏览

java - JavaFX、Maven:JLink 的替代品

目前我正在尝试为我的 Maven 项目创建一个可运行的 jar。问题是,我使用了自动模块 itextpdf,它显然不能与 jlink 一起使用。

是否有在 Eclipse 中使用 javafx 和 maven 创建可运行 jar 的替代方法?我只是想不通,如何使这项工作。

我的 POM.xml 看起来像这样:

0 投票
0 回答
3439 浏览

maven - 错误:自动模块不能与 jlink 一起使用:-带有 JavaFX 的 Maven

我通过 Maven 存储库选择了 Apache Commons IO、JSerialComm 和 Ini4J 库。

但是,当我尝试通过创建图像时,mvn javafx:jlink出现以下错误:

我似乎与此有关:

我的模块文件如下所示:

我的 pom.xml 看起来像这样:

那么 Apache Commons IO、JSerialComm 和 Ini4J 对 Maven 和 Jlink 来说是否过时了?

我应该如何解决这个问题?我正在使用带有 OpenJDK 11 的 Eclipse IDE。

0 投票
0 回答
163 浏览

java - 如何将 JavaFX12 应用程序部署到具有相同代码库的多个平台

我按照说明在 Windows 10 上使用 NetBeans 11 创建“模块化 IDE”项目:

https://openjfx.io/openjfx-docs/#IDE-NetBeans

我最终创建了一个如下所示的项目:

在此处输入图像描述

然后我运行“清理和构建”(在 nebeans 中设置 jlink+jmod),我得到一个 Windows 分发文件夹,其中包含自运行的 java 运行时,其中包含所有依赖项(大约 90 兆)

在此处输入图像描述

我可以通过命令提示符“HelloFX”或双击“HelloFX.bat”来运行它

在此处输入图像描述

这一切都很好。但是,我在 netbeans 中的“HelloFX 项目”使用的是 Windows JavaFX 库和 Windows Jmods 库。这意味着如果我想部署到 Windows 机器而不是 Mac,这个过程将起作用。我必须为 Mac 创建一个全新的项目吗?有没有办法我可以单击“Clean and Build for Mac”和“Clean and Build for Windows”按钮?或者有没有办法使用相同的代码库?我基本上想将 JavaFX 8 项目代码库引入这个新结构。有没有好的方法来做到这一点?

0 投票
1 回答
1473 浏览

java - Gradle jlink 插件在 createMergedModule 期间因“服务实现没有默认构造函数”而失败

我正在使用带有 JDK 12.0.1 和org.beryx.jlink插件 (2.10.4) 的 Gradle(4.10.3,但我已经尝试了 5.4.1 以上的大多数版本),但是每次我尝试创建jlink 图片:

-> 任务:createMergedModule

无法从服务加载程序调用派生使用子句:com/fasterxml/jackson/databind/ObjectMapper$2.run()。

无法从服务加载程序调用派生使用子句:com/fasterxml/jackson/databind/ObjectMapper.secureGetServiceLoader()。

无法从服务加载程序调用派生使用子句:org/apache/commons/compress/utils/ServiceLoaderIterator.()。

C:\Users\MyName\IdeaProjects\myapp\build\jlinkbase\tmpjars\myapp.merged.module\module-info.java:393:错误:服务实现没有默认构造函数:XBeansXPath 提供 org.apache.xmlbeans .impl.store.PathDelegate.SelectPathInterface 与 org.apache.xmlbeans.impl.xpath.saxon.XBeansXPath;

C:\Users\MyName\IdeaProjects\myapp\build\jlinkbase\tmpjars\myapp.merged.module\module-info.java:394:错误:服务实现没有默认构造函数:XBeansXQuery 提供 org.apache.xmlbeans .impl.store.QueryDelegate.QueryInterface 与 org.apache.xmlbeans.impl.xquery.saxon.XBeansXQuery;2 个错误

-> 任务:createMergedModule 失败

当我单击在合并中抛出错误的行时module-info.java,它指向这两个:

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

关于如何解决这个问题的任何想法?

0 投票
1 回答
470 浏览

java - jlink:应用程序 jar 未在 /bin 文件夹中创建

我正在执行以下命令来创建图像。

'app.main' 模块包含主类。

“app.interfaces.impl”和“app.interfaces.otherimpl”是在“app.interfaces”模块中实现接口的模块。

当我使用 jlink 命令创建图像时,它会在 bin 文件夹中创建 java 和 keytool 命令,但不会复制任何模块。

但是当我执行'java --list-modules'时,它列出了所有模块。

如何从 app.main 模块运行主类?模块到底复制在哪里?