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

标签 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.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/

相关文章:

c++ - 如何在 Restinio 中使用 POST 处理程序?

linux - 如何获取/proc/[pid]/status的信息

java - 图像上传 Servlet 在 Chrome 中不工作,但在其他浏览器中工作

java - 将 ListView 值传递给另一个 Activity 中的多个 EditText

java - 获取一个android项目的类结构

java - BHSM-Servlet 不允许浏览器缓存用户名

java - 找出 Java 中的焦点应用程序(窗口)

python - 模块导入失败 : How to get Google Cloud Client libraries to run on Google Cloud SDK

linux - 如何在 Cpanel/WHM 中配置 SVN?

linux - 在 Docker 容器中构建 make 用户时返回非零值 :error 9,