【问题标题】:Changing AppData path (System Property)更改 AppData 路径(系统属性)
【发布时间】:2013-04-15 15:35:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: java appdata


    【解决方案1】:
    1. APPDATA 是 windows 环境变量
    2. 过去的搜索答案:“java set environment variable”:

      How to add an environment variable in Java?
      ProcessBuilder environment variable in java
      How do I set environment variables from Java?
      Is it possible to set an environment variable at runtime from 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 可以控制它产生的新进程的环境变量。
        • 如果您必须将两个应用程序合二为一并在启动器应用程序中运行游戏,那么您需要在启动器应用程序启动之前设置启动器应用程序的环境。使用命令行或批处理脚本来启动启动器。

    【讨论】:

    • 你的答案看起来很完美,我会尽快研究一下。
    【解决方案2】:

    你可以试试这个

    Runtime.getRuntime().exec("cmd /c SET APPDATA=%CD%\minecraft");
    

    【讨论】:

    • 很抱歉,这是不可能的。我想在我创建的游戏启动器中使用它(具体来说,Minecraft Launcher)。启动器本身会创建一个框架来运行游戏小程序,因此它不是运行外部文件的程序。遗憾的是,我不认为可以使用此命令。不过还是谢谢你的帮助。
    • 我认为你应该试试这个,因为它会设置 windows 变量。
    • 哦,我明白了,对不起。我认为这只会改变一个程序。关键是,这个集合是全局变量,我希望它只为一个 Java 小程序设置它。
    【解决方案3】:

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

    【讨论】:

    • 谢谢,我一定会看看这个。
    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2015-10-14
    • 1970-01-01
    相关资源
    最近更新 更多