我们的应用程序服务器是 Jboss 7.4 (Wildfly 23),当我从 JDK11 切换到 JDK17 时,出现运行时异常: 引起:java.lang.IllegalAccessException:类org.jboss.as.naming.InitialContext无法访问类com.sun.jndi.dns.DnsContextFactory(在模块jdk.naming.dns中),因为模块jdk.naming.dns不导出com.sun.jndi.dns 到未命名模块@500cd973
为什么我们使用 DnsContextFactory 是因为我们想要(从 Java)搜索 SRV 记录中的 ldap 域,应用程序中的代码:
Hashtable<String, String> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory"); // replace?
env.put("java.naming.provider.url", "dns:");
DirContext ctx = new InitialDirContext(env); // throws exception
Attributes attributes = ctx.getAttributes("_ldap._tcp.mydomain.com", new String[]{"SRV"});
Attribute a = attributes.get("SRV");
for (int i = 0; i < a.size(); i++) {
.
.
.
}
我可以通过在启动期间添加 VM 参数来解决此问题: JAVA_OPTS =“$ JAVA_OPTS --add-exports = jdk.naming.dns / com.sun.jndi.dns = ALL-UNNAMED” 但我不愿意,我的理解是 add-export 在未来(JDK21?)中会失败,我正在寻找更好的长期解决方案。
编辑: 如果我使用 JDK11 启动 Jboss 7.4,一切正常,但如果我使用 JDK17 启动,该模块现在“隐藏”且不可用。除了使用 com.sun 中的 DnsContextFactory 之外,还有其他方法来搜索 SRV 记录吗?
我能够通过将创建 DirContext 的代码替换为以下内容来解决此问题:
import javax.naming.spi.NamingManager;
DirContext context = (DirContext) NamingManager.getURLContext("dns", new Hashtable<String, Object>());