You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动