为java程序设置环境变量的最佳方法?

时间:2014-08-11 17:15:10

标签: java r command-line environment-variables

我正在编写一个使用RJava接口(http://rforge.net/rJava/)的Java程序。因为这允许在Java程序中使用R,所以我必须确保在用户尝试运行该程序时设置适当的环境变量。

我的问题是,设置这些变量的最佳方法是什么?我应该在程序执行之前编写一个脚本来设置它们吗?问题是,我必须询问用户安装了哪个目录R以及存储R库的位置,因为用户可以将它放在任何地方。我不认为有任何解决方法,因为我需要更新PATH变量,并使用该信息使RJava正常工作,并能够在我的程序中运行R及其库。

我为用户永久修改PATH变量感到紧张,但我想程序的其他安装程序会一直这样做......

有关最佳方法的所有建议,以便将所有这些工作结合在一起吗?

2 个答案:

答案 0 :(得分:0)

您可以传入"系统属性"使用-D选项启动java时。

java -DLIBRARY_PATH="C:\\SomePath\\" ClassName

这可能比使用环境变量更适合您的情况。

答案 1 :(得分:0)

使用一个java程序向用户询问R安装位置,然后使用ProcessBuilder设置新的进程环境(包括R安装位置,并修改PATH)并启动第二个使用RJava接口的程序。

这样你就不会永久地改变PATH,只是为了启动第二个程序。 启动程序可以记住保存用户每次不必输入的位置。

public class Launcher {

  public static void main(String[] args) throws Exception {
    String userdir = System.getProperty("user.dir", ".");
    File propertyFile = new File(userdir, "app.properties");

    Properties properties = new Properties();
    try (FileInputStream in = new FileInputStream(propertyFile)) {
      properties.load(in);
    }
    catch (FileNotFoundException e) {
      // ok
    }

    String location= properties.getProperty("LOCATION", "default");
    System.out.println("Enter Location [" + location+ "]:");

    String string = null;
    try (Reader reader = new InputStreamReader(System.in);
        BufferedReader in = new BufferedReader(reader)) {
      string = in.readLine();
    }

    if ((string != null) && (string.length() > 0)) {
      location = string;
      properties.setProperty("LOCATION", location);
      OutputStream out = new FileOutputStream(propertyFile);
      properties.store(out, "Application properties");
    }

    String classpath = System.getProperty("java.class.path");
    ProcessBuilder pb = new ProcessBuilder();
    pb.command("java", "-cp", classpath, App.class.getName());
    Map<String, String> env = pb.environment();
    env.put("LOCATION", location;
    Process process = pb.start();

    try (
        InputStream is = process.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr)) {
      String line;
      while ((line = br.readLine()) != null) {
        System.out.println(line);
      }
    }

    int exitValue = process.waitFor();
    System.out.println("exit value = " + exitValue);
  }
}

public class App {

  public static void main(String[] args) {
    System.out.println("App: Location: " + System.getenv("LOCATION"));
    System.exit(3);
  }
}