JDK 8迁移至JDK 17:不依赖--add-exports替代sun.security.krb5.*内部API的方案咨询
JDK 8迁移至JDK 17:不依赖--add-exports替代sun.security.krb5.*内部API的方案咨询
我正在将一个旧的Java代码库从JDK 8迁移到JDK 17,需要找到sun.security.krb5.*包的替代方案,因为这些包在新版本JDK中被强封装了。
之前我们使用内部类进行Kerberos认证:
import sun.security.krb5.KrbException; import sun.security.krb5.PrincipalName; import sun.security.krb5.RealmException;
sun.security.krb5.Credentials getCredentialsFromCache() throws RealmException, KrbException, IOException { PrincipalName principalName = new PrincipalName(this.principal, PrincipalName.KRB_NT_PRINCIPAL); sun.security.krb5.Credentials credentials = sun.security.krb5.Credentials .acquireTGTFromCache(principalName, ticketCache); return credentials; }
这段代码在JDK 8中运行正常,但在JDK 17中,sun.security.krb5.*被封装了,我想找到一个替代方案,而不是使用--add-exports作为临时解决办法。
我遇到了以下错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project some-project: Compilation failure: Compilation failure: [ERROR] /path/to/java/file/SomeCleass.java:[35,20] package sun.security.krb5 is not visible [ERROR] (package sun.security.krb5 is declared in module java.security.jgss, which does not export it to the unnamed module)
现有代码还会根据Java供应商动态加载Kerberos配置类:
private Class<?> getKrbConfigClass() throws ClassNotFoundException { Class<?> classRef; if (System.getProperty("java.vendor").contains("IBM")) { classRef = Class.forName(IBM_CONFIG); } else { classRef = Class.forName(SUN_CONFIG); } return classRef; }
由于sun.security.krb5.Config不再可访问,在JDK 17中实现相同功能的最佳方式是什么?
- 什么是JDK 17中
sun.security.krb5.*类的官方替代方案? - 有没有推荐的方法可以在不依赖内部API的情况下从缓存中获取Kerberos凭据?
- 我们应该如何以Java供应商无关的方式正确处理Kerberos配置加载?
备注:内容来源于stack exchange,提问作者Abhishek Dasgupta




