当使用runtime.getRuntime().exec()时,Jar文件是如何工作的?

4

我想创建一个可执行JAR文件,只需点击即可运行我的游戏。我的游戏超出了Java默认分配的堆内存,因此必须使用-Xmx1000m来运行我的代码。我在网上进行了研究,不幸的是,似乎没有一种方法可以告诉JAR文件以超过默认内存运行我的代码。相反,我创建了另一个类,该类将使用runtime从另一个主方法中编译我的代码,并使用此方法创建了一个JAR文件:

import java.io.*;
public class RuntimeExec{
public static void main(String[] args){
    try
    {
    Process process = Runtime.getRuntime().exec("java -Xmx1000m Controller");
    process.waitFor();
    int exitCode = process.exitValue();
    if(exitCode == 0) { /* success*/ }
    else { /*failed*/ }
    }
    catch (Exception e)
    {e.printStackTrace();}
}

}

这个方法可以运行,但我认为它只能运行文件夹中的现有类,而不能运行存储在jar文件中的类。有没有一种方法可以让jar文件运行其中一个类或者组合两个不同的jar文件来解决内存堆问题?


2
为什么不使用批处理文件来启动您的应用程序呢? - Perception
2
重新阅读问题后,我意识到这是一个重复的问题。 - Tim Bender
2个回答

0

有很多方法可以做到这一点:

  1. 如您所提到的,通过拥有另一个触发游戏文件的Jar文件
  2. 正如@Perception所提到的,有一个批处理文件将启动您的游戏。但要小心,如果从网络上下载,用户必须设置脚本可运行的权限
  3. 构建安装程序。在Mac上,使用Oracle Java App bundler for Java 7,Apple App bundler for Java 6构建.app文件。您仍然无法重新分发它,因为必要的权限不会被设置。为应用程序文件构建dmg。这可用于分发。 Windows的类似安装程序

第三种技术是最好的,因为您可以很好地打包依赖项,设置所有JVM参数等。


0
提供用户简易安装的完整解决方案是通过使用Java Web Start部署应用程序。它可以设置应用程序的RAM,并安装桌面快捷方式以启动它。相较于调用exec(实现不佳)而言,JWS更为强大。

然而,如果JWS由于某些原因不适用于此应用程序,请参见IWantToBeBig进行黑客攻击,这将导致Jar具有足够的内存(类似于您如何使用exec上面,但在使用ProcessBuilder重新启动没有足够内存的应用程序时更加强大)。

将桌面快捷方式组织成允许用户通过单击启动它的方式,留给读者作为练习。


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