首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java 11上使用非模块化依赖项打包应用程序

如何在Java 11上使用非模块化依赖项打包应用程序
EN

Stack Overflow用户
提问于 2018-11-29 22:16:08
回答 3查看 6.2K关注 0票数 8

我开发并发布了一个使用Apache和JavaCV的JavaCV应用程序。我已经通过Java1.6、7和8更新了它。用于macOS、Windows和Linux的安装程序都是用Javapackager构建的。Java 8在1月19日结束了对它的支持,我找不到在Java 11上打包和分发的解决方案,Java 11是新的LTS版本。

JavaCV和巴蒂克都不生产模块化的jar,但我已经成功地将它们重新打包到可以编译并在Java11上生成一个可运行的jar的地步,app工作得很好,但我不能将它打包以供发行。我计划使用Java 10来使用javapackager并从那里捆绑11运行时,但是它使用jlink来生成自定义运行时,jlink失败了,因为JavaCV和Batik不是模块化的。由于Batik和JavaCV中的引用不满意,jdeps不会产生一个模块信息类来修补并使它们模块化,尽管没有它们我的应用程序工作得很好。

因此,我将不得不离开Java 8的代码库,即使不再支持,也要发布它。

我知道有一个调用来创建javapackager的替代品,但是在Java 8被弃用之后,它才会出现。我仍然需要巴蒂克和JavaCV项目来重构和构建模块化的jars来产生一个定制的运行时。

有人能提供其他解决方案吗?我错过了什么吗?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-07 20:19:51

更新:jpackage现在包含在JDK 14之后。不过,下面的答案仍然适用于较早的JDK版本。

我也有过同样的问题。我想使用JDK 11,但是根据JDK-8212780,JEP 343计划在JDK 13上使用,所以我们需要等待更长的时间。在Java 8- 10下打包“本机”自包含的应用程序并不是一个问题,因为包器包括在内(至少在Oracle JDK中是这样)。

今天,我发现了这封邮件,并想尝试一下:您可以看到我在Github.com/skymatic/javafx11 11-test上的示例项目,我成功地使用JDK开发分支的后端jpackager进行了打包。

我在这里所做的:

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

当然,模块化项目甚至更容易:在这个提交给我的示例项目中,您可以看到,我在模块路径和主模块中使用了jpackager的参数,而不是类路径和主类。

票数 7
EN

Stack Overflow用户

发布于 2021-04-23 23:39:44

这里有一个指向GitHub模板的链接,展示了如何使用jlink、jpackage和GitHub操作来生成一个JavaFX应用程序和带有小型JVM的原生macOS、macOS和Linux:

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

下面是使用Swing和嵌入式Spring服务器的(WIP)版本:

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

票数 1
EN

Stack Overflow用户

发布于 2018-12-05 20:45:35

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

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

包装器的示例代码

代码语言:javascript
复制
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");
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53548430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档