【问题标题】:WildFly Service Module Loader - ClassNotFound on jdk.incubator.http.HttpClientWildFly 服务模块加载器 - jdk.incubator.http.HttpClient 上的 ClassNotFound
【发布时间】:2024-01-11 15:18:01
【问题描述】:

我正在使用 WildFly15 和 JDK 10 来使用新的 HTTP 客户端构建一个应用程序,当我将 jdk.incubator.httpclient 声明为我的模块中唯一且单一的要求时,它可以正常工作。 (我不能去JDK11,因为我们需要运行在32位)。

这是两组值的完整命令行(我从 Eclipse 复制的):

Program arguments:
-mp "D:\ambientes\oboticario\itsmconn2\wildfly-15.0.0.Final\modules" org.jboss.as.standalone -b localhost --server-config=standalone-full.xml -Djboss.server.base.dir=D:\ambientes\oboticario\itsmconn2\wildfly-15.0.0.Final\standalone

VM Arguments:
"-Dprogram.name=JBossTools: WildFly 15 at localhost" -server -Xms64m -Xmx512m -Dorg.jboss.resolver.warning=true -Djava.net.preferIPv4Stack=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true "-Dorg.jboss.boot.log.file=D:\ambientes\oboticario\itsmconn2\wildfly-15.0.0.Final\standalone\log\boot.log" "-Dlogging.configuration=file:D:\ambientes\oboticario\itsmconn2\wildfly-15.0.0.Final\standalone\configuration\logging.properties" "-Djboss.home.dir=D:\ambientes\oboticario\itsmconn2\wildfly-15.0.0.Final" -Dorg.jboss.logmanager.nocolor=true -Djboss.bind.address.management=localhost --add-modules jdk.incubator.httpclient 

我正在正确地将 --add-modules jdk.incubator.httpclient 添加到 JVM 启动中。

module mymodule {
    requires jdk.incubator.httpclient;
    //requires javaee.api;
}

但是,当我删除javaee.api 模块的注释并将其添加为要求时,我得到ClassNotFoundException

module mymodule {
    requires jdk.incubator.httpclient;
    requires javaee.api;
}

由于我在 EJB 中使用 HTTP 客户端 API,这可能是 javaee.api 中断构建的原因吗?如何解决?

Caused by: java.lang.ClassNotFoundException: jdk.incubator.http.HttpClient from [Module "deployment.sdi.war" from Service Module Loader]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:255)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:410)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
    ... 18 more

使用选项 use --show-module-resolution 启动 java 确认模块已加载:

...
root jdk.incubator.httpclient jrt:/jdk.incubator.httpclient
...

and also after this WildFLy prints the message: WARNING: Using incubator modules: jdk.incubator.httpclient

【问题讨论】:

  • 模块deployment.sdi.war 驻留在哪里?在javaee.api 内吗?是transitive吗?
  • @nullpointer 这是我的战争,我将它部署到 WildFly。我没有为它明确声明的模块。
  • 如果不查看 javaee.api 模块描述或依赖项,很难判断。 我没有明确声明的模块 ...我仍然假设它在模块路径上(可能作为自动模块),然后 JBoss 尝试使用服务加载器访问 HttpClient 类我猜它失败的地方。但它仍然不是很清楚。
  • @nullpointer yes javaee.api 它是一个自动模块,因为它是一个普通的第三方 jar。如何将 http 客户端添加为它的依赖项?我已经看过了,但找不到任何东西。
  • @nullpointer 肯定正在加载,用日志更新了我的问题。我会考虑将此报告为 Jira 中的错误。问题是我们需要在 32 位上运行,并且该平台没有 JDK11。

标签: java wildfly java-module module-info java-http-client


【解决方案1】:

这似乎是 WildFly 中的一个错误。我们决定使用 64 位平台的新虚拟机并迁移到 JDK11。

【讨论】:

    最近更新 更多