2

我正在开发 Minecraft 游戏的启动器,我想做的是为游戏设置 APPDATA(Windows)位置。该值并没有真正改变,但它针对执行代码的程序进行了修改。例如,在 Mac OS X 或 Linux 系统上通过更改“home”文件夹位置很容易实现这一点,System.setProperty("user.home", dir);但是如何使用 Windows 上的 APPDATA 文件夹实现这一点?

可以使用这样的批处理脚本修改此位置;APPDATA=%CD%\minecraft.

程序/启动器是使用 swing 编程的,不是基于控制台的。

4

3 回答 3

2

你可以试试这个

Runtime.getRuntime().exec("cmd /c SET APPDATA=%CD%\minecraft");
于 2013-06-29T12:31:37.593 回答
2

您可以为您生成的任何子进程更改 APPDATA。使用 ProcessBuilder。虽然很困难,但可以为当前进程更改它(使用 JNI)。请参阅此相关问题:Is it possible to set an environment variable at runtime from Java?

于 2013-07-02T02:13:13.677 回答
2
  1. APPDATA 是一个windows环境变量
  2. 过去的搜索答案:“java set environment variable”:

    如何在 Java 中添加环境变量?
    Java 中的 ProcessBuilder 环境变量
    如何从 Java 设置环境变量?
    是否可以在运行时从 Java 设置环境变量?

  3. 尝试通过蛮力本机命令执行来更改当前进程的环境变量Runtime.getRuntime().exec("...")将不起作用,因为它在单独的进程中执行命令 - 环境更改仅适用于该进程。此外,System.getEnv() 使用缓存结果,因此当前的 java 程序很可能看不到更改。

  4. 更具体地说:

    • 您的启动器是一个摇摆应用程序
    • 你的游戏是一个摇摆应用程序,带有一个框架来运行游戏
    • 假设这是两个独立的应用程序,您的启动器应用程序启动了一个运行游戏应用程序 的新进程。

    • 如果这是真的:

      • 创建一个ProcessBuilder实例来启动游戏进程:

        String javaHome = System.getProperty("java.home");
        String javaBin = javaHome +
                File.separator + "bin" +
               File.separator + "java";
        String classpath = System.getProperty("java.class.path");
        
        ProcessBuilder builder = new ProcessBuilder(
                javaBin, "-cp", classpath, "com.example.MinecraftGame");
        
      • 为游戏设置环境变量:

        Map<String, String> env = pb.environment();
        env.put("APPDATA", "%CD%\minecraft");
        
      • 运行游戏:

        Process process = builder.start();
        process.waitFor();
        return process.exitValue();
        
    • 如果这不是真的:

      • 也许应该是,因为 java 可以控制它产生的新进程的环境变量。
      • 如果您必须将两个应用程序合二为一并在启动器应用程序中运行游戏,那么您需要在启动器应用程序启动之前为启动器应用程序设置环境。使用命令行或批处理脚本来启动启动器。
于 2013-07-04T03:53:34.300 回答