使模块 jdk.incubator.httpclient 在运行时可见
Making the module jdk.incubator.httpclient visible at runtime
问题
如何使模块 jdk.incubator.httpclient
中的 类 在运行时可见?
我在用什么
Java 9 + Maven + HttpClient jdk.incubator.http.HttpClient
问题
=> 使用 jdk.incubator.HttpClient
时 Maven 构建失败。 修复 感谢@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.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)
在discussion中,带出的细节是执行:-
java --list-modules
不包含 jdk.incubator.httpclient
作为模块,这就是抛出 j.l.m.ResolutionException
的原因。因此,解决方案应该是将安装的 JDK 版本升级到最新版本(应包括孵化器模块),然后尝试使用与建议相同的命令 运行 应用程序:-
java -jar --add-modules jdk.incubator.httpclient uhc-staging.jar
问题
如何使模块 jdk.incubator.httpclient
中的 类 在运行时可见?
我在用什么
Java 9 + Maven + HttpClient jdk.incubator.http.HttpClient
问题
=> 使用 jdk.incubator.HttpClient
时 Maven 构建失败。 修复
=> 运行时堆栈跟踪:
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.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)
在discussion中,带出的细节是执行:-
java --list-modules
不包含 jdk.incubator.httpclient
作为模块,这就是抛出 j.l.m.ResolutionException
的原因。因此,解决方案应该是将安装的 JDK 版本升级到最新版本(应包括孵化器模块),然后尝试使用与建议相同的命令 运行 应用程序:-
java -jar --add-modules jdk.incubator.httpclient uhc-staging.jar