如何通过Java设置系统变量?

5
我需要在程序内设置某些系统变量。我的谷歌搜索未能找到任何方法来实现它。我该如何做?(我可以接受hacky的方法。我需要能够在Windows,Linux和Mac上运行此应用程序。)
编辑:
在这里添加我的评论,因为它在帖子下面不容易看到:
最好的链接是this,它只在内存中设置变量。它们在程序退出后不会保持。
编辑:
我正在编写一个安装程序,需要以某种方式记录在系统级别上发生了安装(以及一些目录的路径)。下次用户运行安装程序时,安装程序将检查系统中是否已经存在变量,在这种情况下,用户将收到适当的警告。
如果调整环境变量不是一个好主意,那么实现上述目标的最佳方法是什么?

你想设置哪些系统变量? - Hans Z
你的谷歌功夫很弱,学徒。 - Michael-O
3
可能已经有人回答过了,答案在 https://dev59.com/nnRC5IYBdhLWcg3wXP0C。 - AngerClown
1
请查看右侧的相关SO链接。 - Hans Z
1
使用这篇文章可能会对你有所帮助。 - amicngh
显示剩余10条评论
6个回答

3

使用系统类的以下方法

// Get a system property
String dir = System.getProperty("user.dir");

// Set a system property
String previousValue = System.setProperty("application.property", "newValue");

更多细节请参考:

点击此处


程序退出后更改是否会保留? - missingfaktor
1
不,他们不会这样做,也不应该这样做!这将是非常邪恶的。 - Michael-O
当然,更改只会在进程终止之前有效......但这只是为了指导您,在设置此System类属性时解决方案会更接近。 - vamsi

2
如果你希望程序结束后仍然保留环境变量,我建议你使用Properties类。它可以非常容易地写入文件并进行持久化。

1
首先,Properties是一个Java类,用于保存程序可能需要的属性。你所说的基本属性由操作系统提供。并非所有这些都可以更改。如果尝试更改,将会收到SecurityException(例如,您无法更改os.name)。基本属性从计算机的内存中读取(基本上),您可以通过在使用的操作系统中设置环境变量来添加其他变量。例如,在Win95中,您可以在autoexec.bat中添加以下行: set BARTENDER_NAME=Carl 此行可以放在任何批处理文件中,并且BARTENDER_NAME将等于Carl,直到您重置它。 在您的Java程序中,如果添加以下行: System.out.println(System.getProperty("BARTEDER_NAME")); 您将获得Carl作为输出。 在Linux或Unix上的bash shell中,您将使用以下命令: BARTENDER_NAME=Carl export BARTENDER_NAME
您可以为Java程序创建自己的属性集,并将其存储在文件中,然后使用Properties load()方法加载它们。 希望这可以帮助到您。

http://www.coderanch.com/t/387634/java/java/Permanently-setting-System-property


0
由于这方面没有标准解决方案,我建议您使用工厂模式。它的意思是:
envManager = null
如果系统是Windows
  `envManager = WindowsEnvManager`

else if 系统是 Linux

  `envManager = LinuxEnvManager`

如果系统是Mac

  `envManager = macEnvManager`

persistEnvironment(envManager);

persistEnvironment 方法将在 EnvManager 上调用特定的函数。


您似乎误解了问题。这不是一个架构/设计问题。我感兴趣的是如何实现这些 XEnvManagerpersistEnvironment 等功能。 - missingfaktor

0

使用 Java Preferences API 怎么样?这样,如果你在 Windows 上运行,就可以将此类数据存储在注册表中。简单的教程 在这里

您可以按系统或用户存储首选项,并且根据您的需要使首选项持久保存。


编辑

例子:

package com.stackoverflow.Q11100967;

import java.util.prefs.Preferences;

/**
 * @author maba, 2012-06-20
 */
public class App {

    public static void main(String[] args) {
        Preferences preferences = Preferences.systemNodeForPackage(App.class);

        if (!preferences.getBoolean("installed", false)) {
            // Install the stuff...
            preferences.putBoolean("installed", true);
            preferences.put("version", "1.2.3");
        }
    }
}

在Windows上,首选项将存储在HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Prefs/com/stackoverflow/Q11100967

为了使其工作,您必须以管理员特权或类似方法运行进程。


编辑2

在Linux上,偏好设置将存储在/etc/.java/.systemPrefs/com/stackoverflow/Q11100967/中的名为prefs.xml的文件中,其内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE map SYSTEM "http://java.sun.com/dtd/preferences.dtd">
<map MAP_XML_VERSION="1.0">
  <entry key="installed" value="true"/>
  <entry key="version" value="1.2.3"/>
</map>

0

好的,这只是我脑子里的想法,所以它非常不专业。

获取一个进程并运行命令行命令来设置系统变量。这并不是可移植的,但在短期内应该足够使用,直到你找到更好的解决方案。


这不会持久化变量。请查看我问题的编辑。 - missingfaktor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接