2012-09-20 66 views
1

我有一个jar文件,已经变成一个.exe使用L4J,和另一个jar文件在appdata。有两个文件的原因是我需要更新机制。如何从另一个jar中运行jar文件

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

+0

使用[Java Web Start](http://stackoverflow.com/tags/java-web-start/info)来安装应用程序。自动更新内置免费,它可以在Windows,OS X和* nix上运行。 –

+0

我看了一下web-start。我认为我自己创造的东西可能更具专业性。我需要我自己的更新程序/启动程序的GUI。 – Mad3ngineer

+1

啊。错别字。我会在任何有关此问题的问题中补充一点。我很抱歉没有包括这一点,我认为这不在问题的范围内。我将从现在开始提供更多信息。 – Mad3ngineer

回答

2

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

根据您的需要,您可能需要一个桥接接口(一个存在于Jars中的桥接接口),您可以通过'exe'调用第二个Jar来运行......或者您可以简单地使用第二个Jar的main方法;)

您拥有的另一个选择是运行另一个JVM。

UPDATE

为物理独立的应用程序的两个元素。你有一个JAR包装在一个EXE(又名启动器)和另一个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方法,你可以用上面的例子只是推出任何类你想...

+0

我不明白你刚才说什么.. O_O – Mad3ngineer

+0

是啊,我也是这样。;) – MadProgrammer

+1

+1很好的解释和存在的CMD/C发射方式太:) – 2012-09-20 23:04:11

1

你需要在添加一个罐子,通过类路径,为如:“C:\ mypath中\ myjar.jar”比你更新myjar.jar

+0

因此,您将类路径添加到.exe包装jar中的元数据,然后从.exe运行主类,您将加载库的方式,对吧? – Mad3ngineer

+0

是的,每次重新启动后,新的jar是存在的,就像Windows中的.dll文件:) – 2012-09-20 22:13:15

+0

好,谢谢!这真的帮助我! – Mad3ngineer