2013-04-15 3 views
2

Я работаю над пусковой установкой для игры Minecraft, мне бы хотелось установить местоположение APPDATA (windows) для игры. Значение действительно не изменено, но оно изменено для программы, выполняющей код. Например, это очень легко добиться в системах Mac OS X или Linux, изменив местоположение «домашних», используя System.setProperty("user.home", dir);, но как вы достигаете этого с помощью папки APPDATA на окнах?Изменение пути к AppData (системное свойство)

Изменение этого местоположения возможно с использованием пакетных скриптов; APPDATA=%CD%\minecraft.

Программа/пусковая установка запрограммирована с использованием качания и не основана на консоли.

ответ

2
  1. APPDATA является средой окна переменной
  2. Прошлые ответы от поиска: "переменной набор среды Java":

    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. Более конкретно для вас:

    • Вашего пусковой качели приложение
    • Вашего игра аа качелей приложения, с рамкой, чтобы запустить игру в
    • I Предположим, это два отдельных приложений и вашего приложения запуска начинает новый процесс, который запускает приложение для игры.

    • Если это так:

      • Создание 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 может контролировать переменные среды для новых процессов, которые он порождает.
      • Если вы должны объединить два приложения в одном и запустить игру в приложении launcher, тогда вам нужно установить среду для приложения запуска до. Используйте либо командную строку, либо пакетный скрипт, запускающий пусковую установку.
+0

Ваш ответ выглядит идеально, я постараюсь как можно скорее изучить его. –

2

Вы можете попробовать это

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

Мне очень жаль, но это не представляется возможным. Я хочу использовать это в создаваемой вами игровой пусковой установке (конкретно, Minecraft Launcher). Сама пусковая установка создает фрейм для запуска игрового апплета, поэтому это не программа, которая запускает внешний файл. К сожалению, я не думаю, что эту команду можно было бы использовать, к сожалению. Но спасибо за вашу помощь. –

+0

Я думаю, вы должны попробовать это, потому что он будет устанавливать переменные Windows. – namthienmenh

+0

О, я вижу, извините. Я думал, что это просто изменит его для одной программы. Дело в том, что этот набор является переменной во всем мире, я хочу, чтобы он установил его только для одного java-апплета. –

2

Вы можете изменить AppData для любого дочернего процесса вы икру. Используйте ProcessBuilder. Возможно, хотя и сложно, изменить его для текущего процесса (используйте JNI). Смотрите этот родственный вопрос: Is it possible to set an environment variable at runtime from Java?

+0

Спасибо, я буду defenitly взглянуть в это. –