【问题标题】:How to run a jar file from another jar如何从另一个 jar 运行 jar 文件
【发布时间】:2012-09-20 20:25:41
【问题描述】:

我有一个使用 L4J 转换为 .exe 的 jar 文件,以及 appdata 中的另一个 jar 文件。有两个文件的原因是我需要一个更新机制。

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

【问题讨论】:

  • 使用Java Web Start 安装应用程序。自动更新是免费内置的,它适用于 Windows、OS X 和 *nix。
  • 我看过web-start。我认为我自己做的东西可能更专业。我想要我自己的更新程序/启动器 GUI。
  • 啊。错别字。我会在我提出的任何问题中补充这一点。很抱歉没有包括在内,我认为这不在问题的范围内。从现在开始,我将提供更多信息。

标签: java deployment appdata


【解决方案1】:

您可以使用URLClassLoader 在运行时加载第二个 Jar。

根据您的需要,您可能需要一个桥接接口(两个 Jar 中都存在一个),您可以从您的“exe”调用该接口以运行第二个 Jar...或者您可以简单地使用第二个 Jar 的 @987654323 @方法 ;)

您的另一个选择是运行另一个 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
  • 是的,我也有这个问题;)
  • +1 很好的解释,还有 cmd/c 启动模式 :)
  • 谢谢,这足以让我理解大声笑。吃一块饼干!
【解决方案2】:

您需要通过 at 到类路径添加一个 jar,例如:“c:\mypath\myjar.jar”,然后您将更新该 myjar.jar

【讨论】:

  • 所以你将类路径添加到 .exe 包装的 jar 中的元数据中,然后从 .exe 运行主类,就像加载库一样,对吧?
  • 是的,每次重新启动后,新的 jar 都在那里,就像 windows 中的 .dll 文件一样 :)
  • 请注意,如果您的启动器 (exe) 加载应用程序 (Jar),您将无法覆盖 jar,因为 Java 的类加载器会保持 Jar 的打开状态。
  • 是的,确实如此,当 orig jar 退出时,可以手动重命名该文件或启动另一个实用程序来重命名该文件
  • 是的,.exe 将在启动或导入 jar 之前更新 jar。谢谢!
猜你喜欢
  • 2017-12-21
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2014-07-12
  • 2011-04-30
  • 2016-03-01
相关资源
最近更新 更多