Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 针对特定于操作系统的JRE进行编码_Java_Windows_Linux - Fatal编程技术网

Java 针对特定于操作系统的JRE进行编码

Java 针对特定于操作系统的JRE进行编码,java,windows,linux,Java,Windows,Linux,我的代码依赖于NTSystem类(com.sun.security.auth.module.NTSystem),该类位于Windows JRE的rt.jar中。但当我在Linux机器上编译我的类时,它失败了,因为该类并没有随Linux JDK/JRE一起提供 现在,当运行代码时,我将无法使用NTSystem类及其函数,这是有道理的。但我的代码足够聪明,可以确定它运行在什么操作系统上,并使用适当的类 相反,在Windows中开发时,我没有访问com.sun.security.auth.module

我的代码依赖于NTSystem类(com.sun.security.auth.module.NTSystem),该类位于Windows JRE的rt.jar中。但当我在Linux机器上编译我的类时,它失败了,因为该类并没有随Linux JDK/JRE一起提供

现在,当运行代码时,我将无法使用NTSystem类及其函数,这是有道理的。但我的代码足够聪明,可以确定它运行在什么操作系统上,并使用适当的类

相反,在Windows中开发时,我没有访问com.sun.security.auth.module.UnixSystem的权限。由于编译时间的限制,我是否被迫使用反射来加载和使用这些类?或者是否有一个特殊的rt.jar,其中包含用于构建目的的所有类


提前感谢。

如果您真的需要这些特定于操作系统的类,我会获取它们的源代码,编译它们,并创建您自己的小型库进行编译。9或者您可以使用来自不同安装的类的副本)


我相信OpenJDK最多有三种风格(包括Solaris),因此创建一个简单的库并不难。

为每个目标平台创建JAAS配置文件,或者在单个JAAS配置中为每个平台创建JAAS配置文件。然后通过JavaSEAPI访问信息,而不直接使用com.sun.*包。这可以通过(javax.security.auth.*和javax.security.auth.login.*)执行。使用以下条目创建一个:

sampleApp {
    com.sun.security.auth.module.NTLoginModule required debug=false;
};
将该条目另存为
sampleapp\u jaas.config
。接下来设置system属性,以便Java查找配置文件

-Djava.security.auth.login.config==sampleapp_jaas.config
请注意,双等于具有特殊含义。有关加载顺序的详细信息,请参见

然后创建LoginContext,在JAAS配置中查找条目。调用login来填充主题。从那里,您可以使用主题API访问信息。例如,下面的示例仅列出分配给当前用户的组

LoginContext l = new LoginContext("sampleApp");
l.login();
try {
    Subject s = l.getSubject();
    for (Principal p : s.getPrincipals()) {
        System.out.println(p);
    }
} finally {
    l.logout();
}

使用此设置,Java将使用com.sun.security.auth.module.NTSystem类来获取信息,但您的代码都不会硬连接到非标准API。

使用Java反射-请参见以下celsowm的答案: