Java 9 HttpClient java.lang.NoClassDefFoundError:jdk / incubator / http / HttpClient

我试图在Java 9 maven项目中使用孵化器中的HttpClient。 我没有得到任何编译问题。 该项目成功建立。 但是当我尝试运行Main类时,它会给我以下exception:

Exception in thread "main" java.lang.NoClassDefFoundError: jdk/incubator/http/HttpClient at java9.http_client.Main.main(Main.java:18) Caused by: java.lang.ClassNotFoundException: jdk.incubator.http.HttpClient at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496).... 

我的代码只是一个模块信息文件和一个只调用google.com并尝试读取响应的Main类:

module-info.java

 module java9.http_client { requires jdk.incubator.httpclient; } 

Main.java

 public final class Main { public static void main(String[] args) { try { HttpClient client = HttpClient.newHttpClient(); URI httpURI = new URI("http://www.google.com/"); HttpRequest request = HttpRequest.newBuilder(httpURI).GET().build(); HttpResponse response = client.send(request, HttpResponse.BodyHandler.asString()); String responseBody = response.body(); int responseStatusCode = response.statusCode(); System.out.println(responseBody + "\n" + responseStatusCode); } catch (URISyntaxException | IOException | InterruptedException e) { throw new RuntimeException("Unable to run Java 9 Http Client examples", e); } } } 

的pom.xml

  4.0.0 com.javacodegeeks.java9 http_client 0.0.1-SNAPSHOT Java9HttpClient Java Http Client example  1.9 3.6.1 3.0.0      org.apache.maven.plugins maven-compiler-plugin ${maven-compiler-plugin-version}   org.apache.maven.plugins maven-shade-plugin ${maven-shade-plugin-version}      org.apache.maven.plugins maven-compiler-plugin  ${java-version} ${java-version} true    org.apache.maven.plugins maven-shade-plugin   package  shade     com.javacodegeeks.java9.http_client.Main         

我错过了什么? 我找到了关于这个的各种文章,但他们都是这样做的。

任何帮助都是有用的。 谢谢!

使用–add-modules时执行的命令

 cd /home/mansi/NetBeansProjects/java9-http-client; JAVA_HOME=/home/mansi/jdk-9 /home/mansi/netbeans-dev-201709070001/java/maven/bin/mvn "-Dexec.args=--add-modules=jdk.incubator.httpclient -classpath %classpath java9.http_client.Main" -Dexec.executable=/home/mansi/jdk-9/bin/java -Dexec.classpathScope=runtime org.codehaus.mojo:exec-maven-plugin:1.5.0:exec 

不使用–add-modules时

 cd /home/mansi/NetBeansProjects/java9-http-client; JAVA_HOME=/home/mansi/jdk-9 /home/mansi/netbeans-dev-201709070001/java/maven/bin/mvn "-Dexec.args=-classpath %classpath java9.http_client.Main" -Dexec.executable=/home/mansi/jdk-9/bin/java -Dexec.classpathScope=runtime org.codehaus.mojo:exec-maven-plugin:1.5.0:exec 

执行期间的差异是使用类路径与模块路径。 注意JEP11#Incubator Modules中的声明为

…默认情况下,类路径上的应用程序不会解析孵化器模块。

所以为了使用类路径执行代码

类路径上的应用程序必须使用--add-modules命令行选项来请求解析孵化器模块。


如果要在不使用--add-modules选项的情况下执行,则在创建新module并尝试执行Main类时,请确保使用参数使用模块路径执行java命令:

 -p or --module-path  

从分号分隔的(;)目录列表中搜索目录。 每个目录都是模块目录。

 -m or --module / 

指定要解析的初始模块的名称,如果模块未指定,则指定要执行的主类的名称。

完整的命令将是(例如)像:

 .../jdk-9.0.1.jdk/Contents/Home/bin/java -p .../jdk9-httpincubate-maven/target/classes -m jdk.httpincubate.maven/http2.Main 

注意

  • 我在GitHub上创建的示例项目中遵循了上述目录结构,以便复制相同的目录结构。

  • 只是添加它并且没有任何公开化我使用2017年的IntelliJ EAP并且它允许我在没有VM参数的情况下运行 Main类(使用包含上面共享的参数的命令。)

如果接受的答案仍然不适合你那么..

缺少的秘密还包括使用相同编译器arg的maven-surefire-plugin

    org.apache.maven.plugins maven-compiler-plugin 3.7.0  10 10 --add-modules=jdk.incubator.httpclient    org.apache.maven.plugins maven-surefire-plugin 2.21.0  --add-modules=jdk.incubator.httpclient