我几个小时以来一直在读这个主题:
我想做的(并且成功)是从我的代码运行一个可运行的jar,事实是,当我将代码导出到一个可运行的jar中时,它就会停止工作。
从我的编译器开始工作的方法是:
ProcessBuilder pb = new ProcessBuilder("java", "-jar", "JAR I'M LOADING");
pb.start
这是我尝试过的:
我已经创建了一个包含我想要运行的jar的数据包,并且我创建了一个静态JarLoader类:
public class JarLoader {
static JarLoader jl = new JarLoader();
public static ProcessBuilder loadJar(){
return new ProcessBuilder("java", "-jar", jl.getClass().getResource("JAR I'M TRYING TO LOAD").toString());
}
当然,我将运行jar的方法切换为:
ProcessBuilder pb = JarLoader.loadJar();
pb.start();
这种技术非常适用于其他类型的资源,例如图像,但它不适用于jar。
我错过了什么吗? (是的,我确实将包含Jar和JarLoader的文件夹添加到项目的源代码中)
答案 0 :(得分:1)
您当前使用的技术允许您访问已在JAR文件中打包的资源。但是这些资源只在应用程序中是连贯的,而不是来自外部。
当您使用java -jar ...
执行JAR文件时,这是一个正在执行的外部应用程序,它不会理解如何从另一个JAR中检索JAR。您需要将其临时写入磁盘,然后运行临时JAR文件。
你需要:
Files.createTempFile()
在某处创建临时JAR文件。Files.copy()
从资源流复制到临时文件。File.deleteOnExit()
确保在主(主机)应用程序终止时清除临时文件。java -jar tempfile.jar
或您调用的任何内容执行临时文件。