我有一个通过L4J转换为.exe的jar文件,还有一个在appdata中的jar文件。之所以有两个文件是因为我需要一个更新机制。
我的问题是: 如何在桌面上运行.exe文件,然后从其中加载appdata中的jar文件?
我有一个通过L4J转换为.exe的jar文件,还有一个在appdata中的jar文件。之所以有两个文件是因为我需要一个更新机制。
我的问题是: 如何在桌面上运行.exe文件,然后从其中加载appdata中的jar文件?
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[]{});
main
方法,你可以使用上述示例来启动任何你想要的类...您需要将一个jar包添加到类路径中,例如:"c:\mypath\myjar.jar",然后您就可以更新该myjar.jar文件了。