针对OS特定JRE的编码

时间:2012-02-13 22:18:46

标签: java windows linux

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

现在,在运行代码时,我将无法使用NTSystem类及其功能。但我的代码足够智能,可以确定它运行的操作系统,并使用适当的类。

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

为每个目标平台创建JAAS配置文件,或在单个JAAS配置中为每个平台创建entries。然后通过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

请注意,double equals具有特殊含义。有关加载顺序的详细信息,请参阅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。

答案 1 :(得分:0)

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

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

相关问题