Ошибка пакета 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.