我正在编写一个使用RJava接口(http://rforge.net/rJava/)的Java程序。因为这允许在Java程序中使用R,所以我必须确保在用户尝试运行该程序时设置适当的环境变量。
我的问题是,设置这些变量的最佳方法是什么?我应该在程序执行之前编写一个脚本来设置它们吗?问题是,我必须询问用户安装了哪个目录R以及存储R库的位置,因为用户可以将它放在任何地方。我不认为有任何解决方法,因为我需要更新PATH变量,并使用该信息使RJava正常工作,并能够在我的程序中运行R及其库。
我为用户永久修改PATH变量感到紧张,但我想程序的其他安装程序会一直这样做......
有关最佳方法的所有建议,以便将所有这些工作结合在一起吗?
答案 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);
}
}