Java 针对特定于操作系统的JRE进行编码
我的代码依赖于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,其中包含用于构建目的的所有类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
提前感谢。如果您真的需要这些特定于操作系统的类,我会获取它们的源代码,编译它们,并创建您自己的小型库进行编译。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的答案: