Ошибка пакета java.net.http отсутствует на JDK9

У меня проблема с компиляцией простого блокирования GET-примера из HttpRequest JavaDoc:

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);
    }
}

Я получаю ошибку package java.net.http does not exist при компиляции с использованием JDK 9:

{ 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: error: package java.net.http does not exist
import java.net.http.HttpRequest;
                    ^
org.example.module1\src\org.example.module1\org\example\Http2.java:7: error: package java.net.http does not exist
import java.net.http.HttpResponse;
                    ^
org.example.module1\src\org.example.module1\org\example\Http2.java:9: error: package java.net.http does not exist
import static java.net.http.HttpRequest.noBody;
                           ^
org.example.module1\src\org.example.module1\org\example\Http2.java:9: error: static import only from classes and interfaces
import static java.net.http.HttpRequest.noBody;
^
org.example.module1\src\org.example.module1\org\example\Http2.java:10: error: package java.net.http does not exist
import static java.net.http.HttpResponse.asString;
                           ^
org.example.module1\src\org.example.module1\org\example\Http2.java:10: error: static import only from classes and interfaces
import static java.net.http.HttpResponse.asString;
^
org.example.module1\src\org.example.module1\org\example\Http2.java:14: error: cannot find symbol
        HttpResponse response = HttpRequest
        ^
  symbol:   class HttpResponse
  location: class Http2
org.example.module1\src\org.example.module1\org\example\Http2.java:14: error: cannot find symbol
        HttpResponse response = HttpRequest
                                ^
  symbol:   variable HttpRequest
  location: class Http2
org.example.module1\src\org.example.module1\org\example\Http2.java:16: error: cannot find symbol
                .body(noBody())
                      ^
  symbol:   method noBody()
  location: class Http2
org.example.module1\src\org.example.module1\org\example\Http2.java:19: error: cannot find symbol
        String responseBody = response.body(asString());
                                            ^
  symbol:   method asString()
  location: class Http2
10 errors

Такая же ошибка возникает при использовании командной строки и IntelliJ.

Это не проблема с моим модулем, потому что классы без java.net.http компилируются и запускаются без проблем.

Любая идея, что происходит?

Ответ 1

В определении вашего модуля, расположенном (на основе имени вашего пакета) в src/org/example/module-info.java, вам нужно добавить зависимость к пакету java.net.http, который включен в модуль java.httpclient:

module org.example {
    requires java.httpclient;
}

Вы можете найти список модулей JDK в сводке модулей.

Ответ 2

Между тем, поскольку build 149 из jdk9, классы

  • HttpClient
  • HttpRequest
  • HttpResponse
  • WebSocket

были перенесены в пакет jdk.incubator.http. Они являются частью мозаичного модуля jdk.incubator.httpclient. Подробнее см. Билет JDK-8170648.

Итак, вам нужно изменить свой импорт на jdk.incubator.http.*. Кроме того, вы должны включить модуль jdk.incubator.httpclient в свой module-info.java. При компиляции и запуске вашего кода добавьте аргумент --add-modules=jdk.incubator.httpclient к вызову исполняемых файлов java и javac.

Все классы, связанные с http-клиентом, были удалены из jdk9. Они включены в качестве функций инкубатора и больше не являются частью API. Надеюсь, новый клиент будет частью jdk10.