Экспорт пакета из системного модуля не разрешен с --release

У меня есть следующая программа:

module-info.java

module a {
}

Main.java

public class Main {
    public static void main(String[] args) {
        System.out.println(sun.nio.ByteBuffered.class);
    }
}

Эта программа успешно компилируется с --add-exports опция:

> javac --add-exports java.base/sun.nio=a module-info.java Main.java

Тем не менее, когда я добавляю --release аргумент, он терпит неудачу:

> javac --add-exports java.base/sun.nio=a --release 9 module-info.java Main.java
error: exporting a package from system module java.base is not allowed with --release
1 error

По сути, эти две команды эквивалентны. Так почему последний запрещен?

Кроме того, поскольку ИДЕЯ проходит --release В качестве аргумента для javac, это делает разработку в IDEA невозможной, если моему проекту нужен внутренний API.

Я использую JDK 9+178.

7 ответов

Решение

Из этого сообщения об ошибке следует, что --release не может использоваться в сочетании с --add-exports, --add-reads, а также --patch-module,

По ссылке:

Общее предложение здесь состоит в том, чтобы заставить make --release 9 работать согласованно между JDK 9 и (ожидаемым) JDK 10, даже за счет возможного различного поведения таких команд, как:
$ <jdk9>/javac Test.java
$ <jdk9>/javac --release 9 Test.java

Также:

Что должно быть приемлемо, учитывая намерения --release - позволяют компилировать код с использованием поддерживаемых API для данного выпуска JDK.

В частности, предложение заключается в следующем:

[редактировать]

-предотвращает использование --add-exports, -add-reads и --patch-module для системных модулей в сочетании с --release (любая версия)

Вот файл diff, который содержит:

экспорт пакета из системного модуля {0} запрещен с помощью --release

Я не могу комментировать обоснование, но из приведенной выше цитаты речь идет о том, чтобы JDK 9 работал согласованно с JDK 10.

Если вы используете IntelliJ, есть лучшее решение. Просто снимите флажок «Использовать '--release' option» в настройках компилятора Java.

Если вы используете идею IntelliJ, попробуйте проверить настройки вашего компилятора Java:

Перейдите в меню "Файл" -> [Настройки] -> [Сборка, Выполнение, Развертывание] -> [Компилятор Java] и проверьте настройку "Версия байт-кода проекта". Я получил аналогичную ошибку ("экспорт пакета из системного модуля java.datatransfer не разрешен с --release") при использовании JDK 11, хотя это значение все еще было установлено в версию 9. Установка его в 11 исправила проблему для меня.

Использование -target & -source вместо:

-target 11 -source 11

Перейдите в меню "Файл" -> [Настройки] -> [Сборка, выполнение, развертывание] -> [Компилятор Java] и выберите свою версию JDK. (Убедитесь, что он выше, чем JDK 11)

См. Изображение ниже

В eclipse снимите флажок --release в свойствах проекта , а не в общих настройках.

Если вы используете InetlliJ Idea, сделайте этот параметр: перейдите в меню "Файл" -> [Настройки] -> [Сборка, выполнение, развертывание] -> [Компилятор Java] и выберите свою версию JDK, а иногда она пуста, поэтому вставьте версию java. например [если вы используете 11] и сохраните, затем скомпилируйте программу и запустите.

Другие вопросы по тегам