Java:`sun.awt.image` 包是否已弃用?
Java: Is `sun.awt.image` package deprecated?
我想在我的项目中使用一些使用 sun.awt.image.PNGImageDecoder
的代码。问题是源代码基于 Java 8 而我的项目使用 JDK 9+ (11)。所以我得到了这个错误:
Package 'sun.awt.image
' is declared in module 'java.desktop
', which does not export it to the unnamed module.
对于 import sun.awt.image.*
,以及:
Symbol is declared in module 'java.desktop
' which does not export package 'sun.awt.image
'
用于使用 PNGImageDecoder
或 ImageDecoder
等
经过一番努力寻找解决方案后,我发现了一些类似的情况,建议将 requires java.desktop;
添加到 module-info.java
文件(如 and )。但正如我所意识到的,只有当您的项目已经有一个 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。
封装好了!
问题肯定不会得到解决,包括 JDK 中的所有模块。
I know this package (sun.awt.image) exists in java.desktop module (of
JDK 11), but don't know how can access it.
这里问题的真正症结在于,即使 class PNGImageDecoder
和它所属的包 sun.awt.image
是 [=14] 的一部分=] 模块,该模块已选择 不将其导出 到任何使用它的外部库。
抽象这样的 classes(sun.*
) 的选择是有意的,并且在 Java-9 的发行说明中有很好的记录,[=19] 中提到了基本原理=] 还有。
话虽如此,临时 相当老套的解决方案是添加
--add-exports=java.desktop/sun.awt.image=<yourModuleName>
添加到您的命令行参数。最好,您应该寻找一种替代方法来尝试使用 class PNGImageDecoder
.
它的最后一部分 "the unnamed module" 是实际代码(无论是您的应用程序还是它的任何依赖项)尝试访问此 class PNGImageDecoder
的地方。所以把它想象成上面的命令行 arg 用于您的用例结果:
--add-exports=java.desktop/sun.awt.image=ALL-UNNAMED
您不应该在程序中使用 sun.*
或 com.sun.*
类;它们是 JDK 的未记录的内部 类 并且可以在任何版本中更改。
使用它们可能会使您的程序与 Java 的其他版本不兼容。
参见:It is a bad practice to use Sun's proprietary Java classes?
我想在我的项目中使用一些使用 sun.awt.image.PNGImageDecoder
的代码。问题是源代码基于 Java 8 而我的项目使用 JDK 9+ (11)。所以我得到了这个错误:
Package '
sun.awt.image
' is declared in module 'java.desktop
', which does not export it to the unnamed module.
对于 import sun.awt.image.*
,以及:
Symbol is declared in module '
java.desktop
' which does not export package '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。
封装好了!
问题肯定不会得到解决,包括 JDK 中的所有模块。
I know this package (sun.awt.image) exists in java.desktop module (of JDK 11), but don't know how can access it.
这里问题的真正症结在于,即使 class PNGImageDecoder
和它所属的包 sun.awt.image
是 [=14] 的一部分=] 模块,该模块已选择 不将其导出 到任何使用它的外部库。
抽象这样的 classes(sun.*
) 的选择是有意的,并且在 Java-9 的发行说明中有很好的记录,[=19] 中提到了基本原理=] 还有。
话虽如此,临时 相当老套的解决方案是添加
--add-exports=java.desktop/sun.awt.image=<yourModuleName>
添加到您的命令行参数。最好,您应该寻找一种替代方法来尝试使用 class PNGImageDecoder
.
它的最后一部分 "the unnamed module" 是实际代码(无论是您的应用程序还是它的任何依赖项)尝试访问此 class PNGImageDecoder
的地方。所以把它想象成上面的命令行 arg 用于您的用例结果:
--add-exports=java.desktop/sun.awt.image=ALL-UNNAMED
您不应该在程序中使用 sun.*
或 com.sun.*
类;它们是 JDK 的未记录的内部 类 并且可以在任何版本中更改。
使用它们可能会使您的程序与 Java 的其他版本不兼容。
参见:It is a bad practice to use Sun's proprietary Java classes?