как использовать jdk.internal.mis c. Сигнал в java11 - PullRequest
1 голос
/ 11 февраля 2020

У меня есть класс, который использует jdk.internal.misc.Signal. В module-info.java есть requires jdk.unsupported.

Если я попытаюсь скомпилировать это, я получу:

[ERROR] MyClass.java:[28,20] package jdk.internal.misc is not visible
[ERROR]   (package jdk.internal.misc is declared in module java.base, which does not export it to module MyModule)

Затем, если я добавлю <arg>--add-exports</arg><arg>java.base/jdk.internal.misc=MyModule</arg> в плагин maven-compiler-plugin: 3.8.1 я получу:

[ERROR] exporting a package from system module java.base is not allowed with --release

Тогда, если я уберу <release>11</release>, я получу:

Fatal error compiling: warning: source release 11 requires target release 11

У меня такое чувство, что я упускаю что-то важное или, может быть, это просто ошибка? Я использую maven 3.6.3 и openjdk 11.0.2.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

jdk.internal.misc.Signal находится в java.base модуле. Если вы загляните внутрь его файла module-info.java, вы заметите следующее:

    exports jdk.internal.misc to
        (...)
        jdk.unsupported;

Однако jdk.unsupported содержит sun.misc.Signal, который является исходным классом до Java 9 для обработки сигналов.

В целом использование классов в пакетах .internal. является плохой практикой, поскольку они не являются частью API publi c.

Вместо этого я бы предложил использовать sun.misc.Signal с модулем requires jdk.unsupported до тех пор, пока не появится аннотация @Deprecated с информацией о том, какой API следует использовать вместо этого.

Кстати. Это прекрасный пример того, как JPMS помогает скрыть внутренние детали реализации библиотеки (в данном случае JDK) от непреднамеренного использования.

0 голосов
/ 11 февраля 2020

исправлено путем изменения <release>11</release> в <target>11</target> в моем pom.xml:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
...