【问题标题】:How to package app at Java 11 with non-modular dependencies如何在 Java 11 中使用非模块化依赖项打包应用程序
【发布时间】:2019-05-02 01:43:21
【问题描述】:

我开发并分发了一个使用 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 以生成自定义运行时。

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

【问题讨论】:

  • 我猜自下而上的迁移需要时间,他们确实考虑过,但他们错过了详细讨论需要多少时间。
  • 确实如此,只要我依赖的项目确实需要。

标签: java java-11 jlink javapackager jdeps


【解决方案1】:

这里是一个 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

【讨论】:

    【解决方案2】:

    更新:jpackage 自 JDK 14 起现已包含在内。不过,以下答案仍适用于旧 JDK 版本。


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

    今天我发现了this email 并想尝试一下:您可以在github.com/skymatic/javafx11-test 上查看我的示例项目,我使用来自JDK 开发的反向移植的jpackager 成功打包了该项目分支。

    我在这里做了什么:

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

    当然,模块化项目更容易:在this commit to my sample project 中,您可以看到我使用jpackager 的参数作为模块路径和主模块,而不是类路径和主类。

    【讨论】:

    • 谢谢!我需要在这里做一些整理工作,因为我重新设计了我正在做的事情,我使我的应用程序非模块化,使用 jlink 手工制作了一个较小的 jre,然后使用打包程序将它们整合在一起。向将 jpackager 移植到 11 的人的道具。
    【解决方案3】:

    所以唯一的解决方案是编写一个使用 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");
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 2020-05-04
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多