15

我在从 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 package java.net.http does not exist9 编译时出现错误:

{ 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 不存在
导入 java.net.http.HttpRequest;
                    ^
org.example.module1\src\org.example.module1\org\example\Http2.java:7: 错误:包 java.net.http 不存在
导入 java.net.http.HttpResponse;
                    ^
org.example.module1\src\org.example.module1\org\example\Http2.java:9: 错误:包 java.net.http 不存在
导入静态 java.net.http.HttpRequest.noBody;
                           ^
org.example.module1\src\org.example.module1\org\example\Http2.java:9:错误:仅从类和接口静态导入
导入静态 java.net.http.HttpRequest.noBody;
^
org.example.module1\src\org.example.module1\org\example\Http2.java:10:错误:包 java.net.http 不存在
导入静态 java.net.http.HttpResponse.asString;
                           ^
org.example.module1\src\org.example.module1\org\example\Http2.java:10:错误:仅从类和接口静态导入
导入静态 java.net.http.HttpResponse.asString;
^
org.example.module1\src\org.example.module1\org\example\Http2.java:14:错误:找不到符号
        HttpResponse 响应 = HttpRequest
        ^
  符号:类 HttpResponse
  位置:类 Http2
org.example.module1\src\org.example.module1\org\example\Http2.java:14:错误:找不到符号
        HttpResponse 响应 = HttpRequest
                                ^
  符号:变量 HttpRequest
  位置:类 Http2
org.example.module1\src\org.example.module1\org\example\Http2.java:16: 错误:找不到符号
                .body(noBody())
                      ^
  符号:方法 noBody()
  位置:类 Http2
org.example.module1\src\org.example.module1\org\example\Http2.java:19:错误:找不到符号
        字符串 responseBody = response.body(asString());
                                            ^
  符号:方法 asString()
  位置:类 Http2
10 个错误

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

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

知道发生了什么吗?

4

4 回答 4

10

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

module org.example {
    requires java.httpclient;
}

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

于 2016-04-28T10:02:41.400 回答
8

同时,由于 jdk9 的 build 149,这些类

  • HttpClient
  • HttpRequest
  • HttpResponse
  • WebSocket

已移至包jdk.incubator.http中。它们是拼图模块的一部分jdk.incubator.httpclient。有关更多详细信息,请参阅票证JDK-8170648

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

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

于 2017-03-30T07:56:33.457 回答
1

在 JDK 11 中,包是

import java.net.http.HttpClient;

模块名称是java.net.http

于 2018-07-03T06:52:12.043 回答
0

Gradle

If you are using Gradle and IntelliJ it may be because the Gradle JVM setting is using a version below Java 11.

To change it in IntelliJ:

  1. Go to File > Settings > Build, Execution, Deployment > Build Tools > Gradle
  2. Go to Gradle JVM setting on the right downside.
  3. Change it to any of Project SDK or the Java 11 version.

Maven

If you are using Maven and IntelliJ it may be because the JRE setting in Maven is using a version below Java 11.

To change it in IntelliJ:

  1. Go to File > Settings > Build, Execution, Deployment > Build Tools > Maven > Runner
  2. Go to the JRE setting on the right.
  3. Change it to any of Project SDK or the Java 11 version.
于 2021-12-17T17:00:31.980 回答