我们的应用服务器是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记录吗?

推荐答案

我能够解决这个问题,方法是将创建DirContext的代码替换为:

    import javax.naming.spi.NamingManager;

    DirContext context = (DirContext) NamingManager.getURLContext("dns", new Hashtable<String, Object>());

Java相关问答推荐

是否需要关闭Executors返回的执行器.newVirtualThreadPerTaskExecutor()?

找到允许的最大底片

Listview—在Android Java中正确链接项目时出错

现场观看Android Studio中的变化

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

查找剩余的枚举

第三方Jar pom.xml

Spring和可编辑";where";@Query

把一条整型短裤和两条短裤装成一条长的

如何在Microronaut中将 map 读取为 map

如何仅使用键/ID的一部分(组合)高效地返回映射值?

为什么在下面的Java泛型方法中没有类型限制?

S数学.exp的相同错误保证也适用于StrictMath.exp吗?

如果执行@BeForeEach#repository.save(),则测试中的UnitTest最终UUID会发生更改

为什么项目名称出现在我的GET请求中?

使用同步方法中的新线程调用同步方法

字符串的Gzip压缩在java11和java17中给出了不同的结果

java.lang.ClassCastException:com.google.firebase.FirebaseException无法转换为com.google.fire base.auth.FirebaseAuthException

Eureka客户端无法使用用户/通行证注册到Eureka服务器

从 Java 17 切换回 Java 8 后出现的问题