2014-09-19 101 views
-1

如何在Windows上使用Java代码编辑系统变量或用户变量,并使用JNA?我只发现this问题,但它似乎没有帮助。为什么以下两个代码片段不起作用?编辑Windows环境变量不起作用

import com.sun.jna.Library; 
import com.sun.jna.Native; 

public class Environment 
{ 
    public interface WinLibC extends Library 
    { 
     WinLibC INSTANCE = (WinLibC) Native.loadLibrary("msvcrt", 
       WinLibC.class); 

     public int _putenv(String name); 
    } 

    public static void main(String[] args) 
    { 
     WinLibC.INSTANCE._putenv("MYVARIABLE=MYVALUE"); 
    } 
} 

import com.sun.jna.Library; 
import com.sun.jna.Native; 

public class Environment 
{ 
    WinLibC clib = (WinLibC) Native.loadLibrary("msvcrt", WinLibC.class); 

    public Environment() 
    { 
     setenv("myVariable", "myValue"); 
    } 

    public interface WinLibC extends Library 
    { 
     public int _putenv(String name); 
    } 

    public void setenv(String variable, String value) 
    { 
     clib._putenv(variable + "=" + value); 
    } 

    public static void main(String[] args) 
    { 
     new Environment(); 
    } 
} 

而不是写环境变量,什么都不会发生。

+0

为什么在关于操作环境变量的问题中向我们展示JNA'printf'代码? – 2014-09-19 15:43:02

+0

@Andrew Medico:作为映射原生函数的一个例子。 – BullyWiiPlaza 2014-09-19 15:44:33

+0

我认为可以肯定的是,可以回答这个问题的人不需要调用一个完全不相关的函数的例子。 – 2014-09-19 15:52:10

回答

0

你不应该需要JNA来获取环境变量。 System.getenv()确实如此。

另一方面,在Java中设置集合通常是一个坏主意。它使得程序的可移植性降低(不同的系统对环境变量的可见性/持久性有不同的概念),它混淆了JVM和实际系统环境之间的区别。

当然,如果你绝对来,你需要在Windows上使用setenv在Linux/Unix和_putenv

+0

当我想让一个Java程序执行持久的环境变量更改时,这并不是一个坏主意,只是。我会看看如果我可以使用你的技巧让它工作:) – BullyWiiPlaza 2014-09-19 16:01:18