"Пакет java.net.http не существует" ошибка на JDK9

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

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: ошибка: пакет 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 не существует
импортировать статический 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 response = HttpRequest
        ^
  символ: класс HttpResponse
  расположение: класс Http2
org.example.module1\src\org.example.module1\org\example\Http2.java:14: ошибка: не удается найти символ
        HttpResponse response = 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: ошибка: не удается найти символ
        String responseBody = response.body(asString());
                                            ^
  символ: метод asString ()
  расположение: класс Http2
10 ошибок

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

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

Есть идеи, что происходит?

5 ответов

Решение

В определении вашего модуля, расположенного (на основе имени вашего пакета) в 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, Они являются частью модуля головоломки 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.

В JDK 11 пакет

import java.net.http.HttpClient;

И имя модуля java.net.http

У меня была точно такая же проблема, и вот как я ее решил. В градле у меня уже было

      tasks.withType<KotlinCompile>() {
    kotlinOptions.jvmTarget = "11"
}

Я добавил Gradle JVM как 11. Это вBuild, Exectution, Deployment --> Build Tools --> GradleКроме того, я добавил этот фрагмент в build.gradle

      java {
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
}

Плюс я также сделал свой модуль SDK как 11.

Дайте мне знать, если это не работает для вас.

Если вы используете Gradle и IntelliJ, это может быть связано с тем, что Gradle JVMнастройка использует версию ниже Java 11.

Чтобы изменить его в IntelliJ:

  1. Перейти > > > > Gradle
  2. Перейдите к настройке Gradle JVM справа внизу.
  3. Измените его на любую из версий Java 11.

Если вы используете Maven и IntelliJ, это может быть связано с тем, что JREнастройка в Maven использует версию ниже Java 11.

Чтобы изменить его в IntelliJ:

  1. Перейти к File> Settings> Build, Execution, Deployment> Build Tools> Maven> Runner
  2. Перейдите к настройке JRE справа.
  3. Измените его на любой из Project SDKили версия Java 11.
Другие вопросы по тегам