Java: Является ли пакет `sun.awt.image` устаревшим? - PullRequest
0 голосов
/ 16 декабря 2018

Я хотел использовать некоторые коды, которые используют sun.awt.image.PNGImageDecoder в моем проекте.Проблема в том, что исходный код основан на Java 8 , а мой проект использует JDK 9 + (11).Итак, я получил эту ошибку:

Пакет 'sun.awt.image' объявлен в модуле 'java.desktop', который не экспортирует его в неназванный модуль .

для import sun.awt.image.* и:

Символ объявлен в модуле 'java.desktop', который не экспортирует пакет 'sun.awt.image'

для использования PNGImageDecoder или ImageDecoder и т. д.

После некоторых попыток найти решение, я обнаружил несколько похожих ситуаций, которые предлагают добавить requires java.desktop; в module-info.java файл (например, в этом случае и в этом случае ).Но, как я понял, это решение может быть полезно только тогда, когда в вашем проекте уже есть файл module-info.java и в нем отсутствует один использованный модуль.

Мой проект еще не имел этого файла (обратите внимание на " безымянный модуль " в первом сообщении об ошибке).Насколько я знаю, это означает, что все модули импортируются автоматически.Поэтому добавление этого файла и добавление этой строки не имели никакого эффекта, кроме (изменения сообщения об ошибке и), вызывая некоторые аналогичные проблемы для других частей моего кода (которые, конечно, были решены путем добавления необходимых модулей в файл module-info.java).

Конечно, я импортировал все модули в папку jmods (из JDK 11), но проблема не решилась:

requires java.base;
requires java.compiler;
requires java.datatransfer;
requires java.desktop;
requires java.instrument;
requires java.logging;
requires java.management;
requires java.management.rmi;
requires java.naming;
requires java.net.http;
requires java.prefs;
requires java.rmi;
requires java.scripting;
requires java.se;
requires java.security.jgss;
requires java.security.sasl;
requires java.smartcardio;
requires java.sql;
requires java.sql.rowset;
requires java.transaction.xa;
requires java.xml.crypto;
requires java.xml;
requires jdk.accessibility;
requires jdk.aot;
requires jdk.attach;
requires jdk.charsets;
requires jdk.compiler;
requires jdk.crypto.cryptoki;
requires jdk.crypto.ec;
requires jdk.crypto.mscapi;
requires jdk.dynalink;
requires jdk.editpad;
requires jdk.hotspot.agent;
requires jdk.httpserver;
requires jdk.internal.ed;
requires jdk.internal.jvmstat;
requires jdk.internal.le;
requires jdk.internal.opt;
requires jdk.internal.vm.ci;
requires jdk.internal.vm.compiler;
requires jdk.internal.vm.compiler.management;
requires jdk.jartool;
requires jdk.javadoc;
requires jdk.jcmd;
requires jdk.jconsole;
requires jdk.jdeps;
requires jdk.jdi;
requires jdk.jdwp.agent;
requires jdk.jfr;
requires jdk.jlink;
requires jdk.jshell;
requires jdk.jsobject;
requires jdk.jstatd;
requires jdk.localedata;
requires jdk.management.agent;
requires jdk.management.jfr;
requires jdk.management;
requires jdk.naming.dns;
requires jdk.naming.rmi;
requires jdk.net;
requires jdk.pack;
requires jdk.rmic;
requires jdk.scripting.nashorn;
requires jdk.scripting.nashorn.shell;
requires jdk.sctp;
requires jdk.security.auth;
requires jdk.security.jgss;
requires jdk.unsupported.desktop;
requires jdk.unsupported;
requires jdk.xml.dom;
requires jdk.zipfs;

Я знаю этот пакет (sun.awt.image) существует в модуле java.desktop (из JDK 11), но не знаю, как получить к нему доступ.

Я использую IntelliJ IDEA в качестве IDE.

Ответы [ 2 ]

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

Вы не должны использовать sun.* или com.sun.* классы в вашей программе;они недокументированы, являются внутренними классами JDK и могут изменяться в любом выпуске.

Их использование может сделать вашу программу несовместимой с другими версиями Java.

См .: Это плохопрактиковать использование проприетарных классов Java от Sun?

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

Он инкапсулирован!

Эта проблема, безусловно, не будет решена, включая все модули из JDK.

Я знаю, что этот пакет (sun.awt.image) существует в модуле java.desktop (из JDK 11), но не знаю, как получить к нему доступ.

Суть проблемы здесь заключается в том, что, хотя класс PNGImageDecoder и пакет, к которому он принадлежит sun.awt.image, являются частью модуля java.desktop, модуль выбрал , а не экспортировать для любой внешней библиотеки, использующей его.

Выбор абстрагирования таких классов (sun.*) был преднамеренным и хорошо задокументирован с примечаниями к выпуску Java-9, а обоснование упомянуто в JEP-260 # Инкапсуляция большинства внутренних API также.


Сказав это, временное довольно хакерское решение было бы добавить

--add-exports=java.desktop/sun.awt.image=<yourModuleName>

к вашемуаргументы командной строки.Желательно, чтобы вы искали альтернативный путь к тому, чего вы пытаетесь достичь, используя класс PNGImageDecoder.


Последняя часть, "безымянный модуль« - это то место, где реальный код (будь то ваше приложение или любые его зависимости) пытается получить доступ к этому классу PNGImageDecoder.Так что думайте об этом, как в приведенном выше аргументе командной строки для вашего варианта использования:

--add-exports=java.desktop/sun.awt.image=ALL-UNNAMED
...