【问题标题】:Making the module jdk.incubator.httpclient visible at runtime使模块 jdk.incubator.httpclient 在运行时可见
【发布时间】:2018-05-06 22:12:15
【问题描述】:

问题

如何使模块jdk.incubator.httpclient 中的类在运行时可见?

我在用什么

Java 9 + Maven + HttpClient jdk.incubator.http.HttpClient

问题

=> 使用 jdk.incubator.HttpClient 时 Maven 构建失败。 修复 this question 感谢@nullpointer

=> 运行时堆栈跟踪:

java.lang.NoClassDefFoundError: jdk/incubator/http/HttpClient
at com.foo.Bar.Bar.<clinit>(Bar.java:56) ~[?:?]
at java.lang.Class.forName0(java.base@9-Ubuntu/Native Method) ~[?:?]
at java.lang.Class.forName(java.base@9-Ubuntu/Class.java:374) ~[?:?]
Caused by: java.lang.ClassNotFoundException: jdk.incubator.http.HttpClient
at java.net.URLClassLoader.findClass(java.base@9-Ubuntu/URLClassLoader.java:388) ~[?:?]
at java.lang.ClassLoader.loadClass(java.base@9-Ubuntu/ClassLoader.java:486) ~[?:?]
at java.lang.ClassLoader.loadClass(java.base@9-Ubuntu/ClassLoader.java:419) ~[?:?]
at com.foo.Bar.Bar.<clinit>(Bar.java:56) ~[?:?]
at java.lang.Class.forName0(java.base@9-Ubuntu/Native Method) ~[?:?]
at java.lang.Class.forName(java.base@9-Ubuntu/Class.java:374) ~[?:?]

构建 Pom 部分

<build>
    <finalName>${project.artifactId}</finalName>
    <sourceDirectory>${project.basedir}/src</sourceDirectory>

    <resources>
        <resource>
            <targetPath>.</targetPath>
            <filtering>true</filtering>
            <directory>${project.basedir}/resources</directory>

            <includes>
                <include>plugin.yml</include>
            </includes>
        </resource>
    </resources>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-clean-plugin</artifactId>
            <version>3.0.0</version>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>

            <configuration>
                <source>9</source>
                <target>9</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.0</version>

            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <minimizeJar>true</minimizeJar>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

如您所见,我使用 maven-shade-plugin 作为我的依赖项,但由于 jdk.incubator.http.HttpClient 是 JDK 的一部分,它不包含在我的 jar 中。

尝试执行为:

 java -jar --add-modules jdk.incubator.httpclient uhc-staging.jar

导致以下异常:

Error occurred during initialization of VM 
java.lang.module.ResolutionException: Module jdk.incubator.httpclient not found 
at java.lang.module.Resolver.fail(java.base@9-Ubuntu/Resolver.java:790) 
at java.lang.module.Resolver.resolveRequires(java.base@9-Ubuntu/Resolver.java:94)
at java.lang.module.Configuration.resolveRequiresAndUses(java.base@9-Ubuntu/Configuration.java:370)
at java.lang.module.ModuleDescriptor$1.resolveRequiresAndUses(java.base@9-Ubuntu/ModuleDescriptor.java:1986)
at jdk.internal.module.ModuleBootstrap.boot(java.base@9-Ubuntu/ModuleBootstrap.java:263)
at java.lang.System.initPhase2(java.base@9-Ubuntu/System.java:1927)

【问题讨论】:

  • @nullpointer jar 用作插件。有一个方法enable() 在主进程启用它时被调用。主进程只是另一个以 java -jar server.jar 开头的 jar 文件
  • @nullpointer 抱歉太简短了。我的 jar 用作 api Bukkit 的插件。当 Bukkit 服务器启动时,它会加载所有插件,包括我的插件,并调用 enable() 方法。在我的启用方法中,我首先使用 HttpClient 调用我的 api 以加载有关用户权限的一些信息。
  • 这里有点可疑,您是否有机会运行 JDK 9 的非常旧的早期访问版本? java -version 打印什么?
  • @AlanBateman 在discussion 与 OP。发现已安装 JDK 的 java --list-modules 不包括 jdk.incubator.httpclient。建议为 Ubuntu 安装最新的 JDK。也许您可以更好地指导从哪里下载或进一步下载。
  • 感谢您提供讨论链接。他似乎在运行 jdk-9+134 的构建,因此它是 2016 年和孵化功能稳定之前的古老 EA 构建。一旦它安装了 GA 版本(9 或最新的 9.0.01),那么帮助他会容易得多。

标签: java maven bukkit java-9 maven-shade-plugin


【解决方案1】:

discussion中,带出的细节是执行:-

java --list-modules

不包含 jdk.incubator.httpclient 作为模块,这就是抛出 j.l.m.ResolutionException 的原因。因此,解决方案是将安装的 JDK 版本升级到最新版本(应包括孵化器模块),然后尝试使用与建议相同的命令运行应用程序:-

java -jar --add-modules jdk.incubator.httpclient uhc-staging.jar

【讨论】:

  • 为了对此进行扩展,我在 Ubuntu 16.10 上安装了 openjdk-9-jdk 包,它不再是受支持的 Ubuntu 版本。升级到 17.04 允许我安装无法使用 16.10 安装的 oracle-java9-installer 包。由于openjdk-9-jdk 包不附带孵化器模块,因此使用--add-modules jdk.incubator.httpclient 将不起作用。使用oracle-java9-installer 并使用--add-modules jdk.incubator.httpclient 运行jar 解决了问题
  • 另外,为了避免在命令行上使用--add-modules。一个必须execute using the modulepath as detailed out in another answer
猜你喜欢
  • 2018-10-11
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多