我有依赖于 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,其中包含用于构建目的的所有类?
提前致谢。
最佳答案
为每个目标平台创建 JAAS 配置文件或创建 entries对于单个 JAAS 配置中的每个平台。然后通过 Java SE API 访问信息,而无需直接使用 com.sun.* 包。这可以通过 Java Authentication and Authorization Service (JAAS) 执行(javax.security.auth.* 和 javax.security.auth.login.*)。创建 JAAS config file包含以下条目:
sampleApp {
com.sun.security.auth.module.NTLoginModule required debug=false;
};
将该条目保存为 sampleapp_jaas.config
。接下来设置系统属性,以便 Java 查找配置文件。
-Djava.security.auth.login.config==sampleapp_jaas.config
请注意,双等号具有特殊含义。查看com.sun.security.auth.login.ConfigFile有关加载顺序的详细信息。
然后创建将在 JAAS 配置中查找条目的 LoginContext。调用登录以填充主题。从那里,您可以使用主题 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 - 针对特定于操作系统的 JRE 进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9268892/