我们的应用服务器是Jboss 7.4(Wildfly 23),当我从JDK 11切换到JDK 17时,我得到了运行时异常: 原因:java. lang. IllegalAccessException: class org. jboss. as. naming. InitialContext无法访问class com. sun. jndi. dns. DnsContextFactory(在模块jdk. naming. dns中),因为模块jdk. naming. dns没有将com. sun. jndi. dns导出到未命名的模块@500cd973
为什么我们使用DnsContextFactory是因为我们想在应用程序中的src记录中搜索ldap域(从Java):
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" 但我不这么认为,我的理解是,添加-导出在future 将失败(JDK21?),我正在寻找更好的长期解决方案.
编辑: 如果我用JDK 11启动Jboss 7.4,一切工作正常,但如果我用JDK 17启动,模块现在"隐藏"并且不可用.除了使用com.sun中的DnsContextFactory之外,还有其他方法来搜索DEV记录吗?