8

我开发并分发了一个使用 Apache Batik 和 JavaCV 的 Java Swing 应用程序。我已经通过 java 1.6、7 和 8 对其进行了更新。macOS、Windows 和 Linux 的安装程序是使用 Javapackager 构建的。Java 8 在 19 年 1 月终止支持,我找不到在新 LTS 版本 Java 11 上打包和分发的解决方案。

JavaCV 或 Batik 都不会生成模块化 jar,但我设法将它们重新打包到可以在 Java 11 上编译和生成可运行 jar 的程度,应用程序工作正常,但我无法将其打包以进行分发。我计划下降到 Java 10 以使用 javapackager 并从那里捆绑 11 运行时,但它使用 jlink 生成自定义运行时,jlink 失败,因为 JavaCV 和 Batik 不是模块化的。由于 Batik 和 JavaCV 中的引用不满意,jdeps 不会生成 module-info.class 来修补并使它们模块化,即使我的应用程序在没有它们的情况下也能正常工作。

结果,我将不得不将代码库保留在 Java 8 中,并且即使不再受支持,也要发布它。

我知道有一个调用来创建 javapackager 的替代品,但直到 Java 8 被弃用之后才会出现。而且我仍然需要 Batik 和 JavaCV 项目来重构和构建模块化 jar 以生成自定义运行时。

谁能提供任何其他解决方案?我错过了什么吗?谢谢。

4

3 回答 3

7

更新:jpackage现在包含自 JDK 14 以来。但是,以下答案仍然适用于较旧的 JDK 版本。


我有同样的问题。我想使用 JDK 11,但根据JDK-8212780 , JEP 343计划用于 JDK 13,所以我们需要再等一会儿。在 Java 8 - 10 下打包“本机”自包含应用程序不是问题,因为包含了打包程序(至少在 Oracle JDK 中)。

今天我发现了这封电子邮件,并想尝试一下:您可以在github.com/skymatic/javafx11-testjpackager上查看我的示例项目,我使用JDK 开发分支的反向移植成功打包了该项目.

我在这里做了什么:

  • 使用 OpenJDK 11 和 OpenJFX 11 创建了一个新的 HelloWorld 项目。
  • 下载了打包程序并从 Maven 构建中调用它(注意它需要与 JDK 一起驻留,并且您需要设置JAVA_HOME它才能工作......)
  • 奖励:我曾经jdeps找出我的非模块化 jar 的依赖关系并设置--add-modules参数以生成更小的运行时映像

当然,模块化项目更容易:在我的示例项目的提交中,您可以看到我使用jpackager's 参数作为模块路径和主模块,而不是类路径和主类。

于 2019-01-07T20:19:51.857 回答
0

这是一个 GitHub 模板的链接,展示了如何使用 jlink、jpackage 和 GitHub Actions 来生成 JavaFX 应用程序以及带有小型 JVM 的本机 macOS、Windows 和 Linux 安装程序:

https://github.com/wiverson/maven-jpackage-template

这是一个使用 Swing 和嵌入式 Spring Boot 服务器的(WIP)版本:

https://github.com/wiverson/desktop-spring-boot

于 2021-04-23T23:39:44.070 回答
0

所以唯一的解决方案是编写一个使用 ProcessBuilder 来启动原始应用程序 jar 的包装应用程序。

这样做的好处是可以使用链接来产生所需的最小运行时间。将 jar 放在 bin 目录中,然后使用 FPM ( https://github.com/jordansissel/fpm ) 创建安装程序。

包装器的示例代码

package xyz.arwhite.dslauncher;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class DrumScoreLauncher {

    public static void main(String[] args) {
        String installHome = System.getProperty("java.home");
        String installBin = installHome + File.separator + "bin" + File.separator;

        System.out.println("Launching Drum Score Editor from "+installHome);

        List<String> cmdLine = new ArrayList<String>();
        cmdLine.add(installBin + "java");
        cmdLine.add("-jar");
        cmdLine.add(installBin + "DrumScoreEditor.jar");

        for ( int i = 0; i < args.length; i++ )
            cmdLine.add(args[i]);

        try {
            ProcessBuilder p = new ProcessBuilder(cmdLine);
            p.inheritIO();
            p.start();

        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("Exiting launcher");
    }

}
于 2018-12-05T20:45:35.020 回答