java9 '-release 8' с внутренними пакетами (например, sun.misc.Unsafe) - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь создать банку multi-release с Maven (3.8.0).Мы называем sun.misc.Unsafe, который прекрасно компилируется в java8 и java11.Однако при компиляции с java11 --release 8 возникает Compilation failure: package sun.misc does not exist.


. Вот как воспроизвести ошибку:

Простой класс, который вызывает Unsafe:

public class ChangeableObjects {
    sun.misc.Unsafe unsafe;
}

Простой pom:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>8</release>
            </configuration>
        </plugin>
    </plugins>
</build>

Если мы прокомментируем строку <release>8</release>, она отлично работает на java8 и java11.

Если мы скомпилируем код как есть, он завершится неудачнос java8;это нормально, так как это функция java9 .Проблема в том, что он также не работает с java11.


Я предполагаю, что проблема в том, что пакет sun.misc был перемещен между java8 и java9.Но все же цель флага release состоит в том, что код, который хорошо компилируется с java8, должен также хорошо компилироваться с java11.

Я неправильно понимаю, как использовать флаг release?Нужно ли вручную связывать пакет sun.misc, чтобы он работал?

1 Ответ

0 голосов
/ 05 декабря 2018

Во-первых, как указывалось в комментариях, способ, которым я построил мульти-релиз jar (по ссылке, которую я предоставил), не был рекомендован.Используя пример, данный nullpointer,

Я бы предпочел использовать что-то вроде https://github.com/meterware/multirelease-parent/blob/master/pom.xml

Я использовал Набор инструментов Maven , которые позволяют компилироватьиспользуя разные JDK.Таким образом, моя проблема исчезла.

Во-вторых, ответ на вопрос, почему я получаю ошибку компиляции при компиляции в jdk11 с --release 8, на самом деле был дан khmarbaise, который указал на https://stackoverflow.com/a/43103038/296328:

javac предоставляет два параметра командной строки, -source и -target, которые можно использовать для выбора версии языка Java, принятой компилятором, и версии файлов классов, которые он создает, соответственно.Однако по умолчанию javac компилируется с самой последней версией API платформы.Поэтому скомпилированная программа может случайно использовать API-интерфейсы, доступные только в текущей версии платформы.Такие программы не могут работать на более старых версиях платформы, независимо от значений, переданных в -source и `-target.опции.Это долговременная проблема удобства использования, так как пользователи ожидают, что с помощью этих параметров они получат файлы классов, которые могут работать на указанной версии платформы.

Тем не менее, кажется, что есть обходные пути:см. Maven: javac: исходная версия 1.6 требует целевой версии 1.6 , например.

...