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



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

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

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

提前谢谢。

为每个目标平台创建JAAS配置文件,或在单个JAAS配置中为每个平台创建条目。然后通过Java SE API访问信息,而无需直接使用com.sun.*包。这可以通过Java身份验证和授权服务(JAAS)(javax.security.auth.*和javax.security.auth.login.*)执行

sampleApp {
    com.sun.security.auth.module.NTLoginModule required debug=false;
};

将该条目保存为sampleapp_jaas.config。接下来设置系统属性,以便Java查找配置文件。

-Djava.security.auth.login.config==sampleapp_jaas.config

请注意,doubleequals具有特殊含义。有关加载顺序的详细信息,请参阅com.sun.security.auth.login.ConfigFile。

然后创建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。

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

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