JDK9上的“包java.net.http不存在”错误

我在从HttpRequest JavaDoc编译简单的阻塞GET示例时遇到问题:

package org.example; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import static java.net.http.HttpRequest.noBody; import static java.net.http.HttpResponse.asString; public class Http2 { public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException { HttpResponse response = HttpRequest .create(new URI("http://www.infoq.com")) .body(noBody()) .GET().response(); int responseCode = response.statusCode(); String responseBody = response.body(asString()); System.out.println(responseBody); } } 

我在使用JDK 9编译时得到package java.net.http does not exist错误:

 {jdk9}»/ cygdrive / c / Program \ Files / Java / jdk-9 / bin / javac -d out / production -modulesourcepath org.example.module1 / src / -m org.example.module1

 org.example.module1 \ src \ org.example.module1 \ org \ example \ Http2.java:6:错误:包java.net.http不存在
 import java.net.http.HttpRequest;
                     ^
 org.example.module1 \ src \ org.example.module1 \ org \ example \ Http2.java:7:错误:包java.net.http不存在
 import java.net.http.HttpResponse;
                     ^
 org.example.module1 \ src \ org.example.module1 \ org \ example \ Http2.java:9:错误:包java.net.http不存在
 import static java.net.http.HttpRequest.noBody;
                            ^
 org.example.module1 \ src \ org.example.module1 \ org \ example \ Http2.java:9:错误:仅从类和接口导入静态
 import static java.net.http.HttpRequest.noBody;
 ^
 org.example.module1 \ src \ org.example.module1 \ org \ example \ Http2.java:10:错误:包java.net.http不存在
 import static java.net.http.HttpResponse.asString;
                            ^
 org.example.module1 \ src \ org.example.module1 \ org \ example \ Http2.java:10:错误:仅从类和接口导入静态
 import static java.net.http.HttpResponse.asString;
 ^
 org.example.module1 \ src \ org.example.module1 \ org \ example \ Http2.java:14:error:找不到符号
         HttpResponse响应= HttpRequest
         ^
  符号:类HttpResponse
  位置:类Http2
 org.example.module1 \ src \ org.example.module1 \ org \ example \ Http2.java:14:error:找不到符号
         HttpResponse响应= HttpRequest
                                 ^
  符号:变量HttpRequest
  位置:类Http2
 org.example.module1 \ src \ org.example.module1 \ org \ example \ Http2.java:16:error:找不到符号
                 。体(一个人())
                       ^
  符号:方法noBody()
  位置:类Http2
 org.example.module1 \ src \ org.example.module1 \ org \ example \ Http2.java:19:error:找不到符号
         String responseBody = response.body(asString());
                                             ^
  符号:方法asString()
  位置:类Http2
 10个错误

使用命令行和IntelliJ发生相同的错误。

这不是我的模块的问题,因为没有java.net.http的类编译并运行没有任何问题。

知道发生了什么事吗?

在您的模块定义中,位于(根据您的包名称) src/org/example/module-info.java ,您需要将依赖项添加到java.net.http包中,该包包含在java.httpclient模块中:

 module org.example { requires java.httpclient; } 

您可以在模块摘要中找到JDK模块列表。

同时,自构建149的jdk9,类

  • HttpClient
  • HttpRequest
  • HttpResponse
  • WebSocket

已被移动到包jdk.incubator.http 。 它们是jigsaw模块jdk.incubator.httpclient 。 有关详细信息,请参阅票据JDK-8170648 。

因此,您必须将导入更改为jdk.incubator.http.* 。 此外,您必须在jdk.incubator.httpclient中包含模块module-info.java 。 编译和运行代码时,请将参数--add-modules=jdk.incubator.httpclient到java和javac可执行文件的调用中。

所有与http客户端相关的类都已从jdk9中删除。 它们作为孵化器function包含在内,不再是API的一部分。 希望新客户将成为jdk10的一部分。

在JDK 11中,包是

 import java.net.http.HttpClient; 

模块名称是java.net.http