我开发并发布了一个使用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来产生一个定制的运行时。
有人能提供其他解决方案吗?我错过了什么吗?谢谢。
发布于 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进行了打包。
我在这里所做的:
JAVA_HOME使其工作.)jdeps查找非模块化jar的依赖关系,并设置--add-modules参数以生成较小的运行时映像。当然,模块化项目甚至更容易:在这个提交给我的示例项目中,您可以看到,我在模块路径和主模块中使用了jpackager的参数,而不是类路径和主类。
发布于 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)版本:
发布于 2018-12-05 20:45:35
因此,唯一的解决方案是编写一个使用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");
}
}https://stackoverflow.com/questions/53548430
复制相似问题