如何从另一个jar文件中运行jar文件

3

我有一个通过L4J转换为.exe的jar文件,还有一个在appdata中的jar文件。之所以有两个文件是因为我需要一个更新机制。

我的问题是: 如何在桌面上运行.exe文件,然后从其中加载appdata中的jar文件?


使用 Java Web Start 安装应用程序。自动更新功能是免费内置的,并且可以在 Windows、OS X 和 *nix 上运行。 - Andrew Thompson
我已经看过Web Start了。我认为自己制作的东西可能会更专业。我想要自己的GUI来更新/启动程序。 - Mad3ngineer
1
啊,打错字了。我会在以后提问的时候加上那个信息。很抱歉没有包含那个,我并没有想到那在这个问题的范围内。以后我会提供更多的信息。 - Mad3ngineer
2个回答

3
你可以使用URLClassLoader在运行时加载第二个Jar。根据你的需求,你可能需要一个桥接接口(存在于两个Jar中),你可以从你的“exe”调用它来使第二个Jar运行……或者你可以简单地使用第二个Jar的main方法;)另一种选择是运行另一个JVM。 更新 为了物理上分离应用程序的两个元素。你有一个被包装在EXE(也称为启动器)中的Jar和另一个是你的应用程序的Jar(也称为应用程序)(我假设)。因此,你的启动器对你的应用程序完全没有任何了解(编译时依赖很少或没有)。我们需要以某种方式从启动器动态加载应用程序。为了做到这一点,我们需要一些东西。我们需要能够将应用程序加载到启动器的类加载器上下文中(以便我们可以看到它),并且我们需要一些方式来加载应用程序。 动态类加载 这可以通过简单地使用URLClassLoader来实现。
URLClassLoader loader = new URLClassLoader(new URL[]{new File("path/to/your/jar/Application.jar").toURI().toURL()});

应用程序加载

有两种方法可以实现应用程序加载。您可以简单地使用URLClassLoader查找并启动应用程序的main类...

// This is essentially the same as saying 
// the.package.name.to.you.main.class.Main.main(new String[]{});
Class<?> mainClass = loader.loadClass("the.package.name.to.you.main.class.Main");
Method mainMethod = mainClass.getMethod("main", String[].class);
mainMethod.invoke(null, new String[]{});

现在,如果你的应用程序Jar没有main方法,你可以使用上述示例来启动任何你想要的类...

我不明白你刚才说的话... O_O - Mad3ngineer
是的,我也有那个问题 ;) - MadProgrammer
1
+1 很好的解释,还有 cmd/c 启动模式 :) - user529543
谢谢,这已经足够让我理解了,哈哈。拿块饼干吧! - Mad3ngineer

1

您需要将一个jar包添加到类路径中,例如:"c:\mypath\myjar.jar",然后您就可以更新该myjar.jar文件了。


所以你需要将classpath添加到.exe封装的jar文件中的元数据中,然后像加载库一样从.exe运行主类,对吗? - Mad3ngineer
是的,在每次重新启动后,新的jar文件就像Windows中的.dll文件一样存在。 - user529543
注意,如果您的启动器(exe)加载应用程序(Jar),则无法覆盖该jar,因为Java的类加载器会保持Jar处于打开状态。 - MadProgrammer
是的,这是真的。可以手动重命名该文件或启动另一个实用程序来重命名该文件,当原始JAR退出时。 - user529543
是的,.exe 文件将在启动或导入 jar 文件之前更新 jar 文件。谢谢! - Mad3ngineer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接