Java:不赞成使用sun.awt.image软件包吗? [英] Java: Is `sun.awt.image` package deprecated?

查看:371
本文介绍了Java:不赞成使用sun.awt.image软件包吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在项目中使用一些使用sun.awt.image.PNGImageDecoder的代码.问题是源代码基于 Java 8 ,而我的项目使用的是 JDK 9 + (11).所以我得到了这个错误:

包'sun.awt.image'在模块'java.desktop'中声明,该包不会将其导出到未命名的模块.

用于import sun.awt.image.*,以及:

符号在模块'java.desktop'中声明,该模块不导出包'sun.awt.image'

用于使用PNGImageDecoderImageDecoder

经过努力寻找解决方案后,我发现了一些类似的情况,这些情况建议将requires java.desktop;添加到module-info.java文件中(例如这种情况).但是,正如我意识到的那样,只有当您的项目已经有一个module-info.java文件并且您缺少其中一个使用过的模块时,此解决方案才有用.

我的项目还没有此文件(请注意第一条错误消息中的"未命名模块").据我所知,这意味着所有模块都是自动导入的.因此,添加此文件并添加该行没有任何影响,除了(更改错误消息并)对我的代码的其他部分造成了类似的问题(当然,可以通过将必需的模块添加到module-info.java文件中来解决)./p>

确保我将所有模块都导入了(JDK 11的)jmods文件夹中,但是问题没有解决:

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)存在于(JDK 11的)java.desktop模块中,但是不知道如何访问它.

我将IntelliJ IDEA用作IDE.

解决方案

您不应在程序中使用sun.*com.sun.*类.它们是JDK的未记录内部类,可以在任何发行版中进行更改.

使用它们可能会使您的程序与其他Java版本不兼容.

请参阅:这是一种不良做法使用Sun的专有Java类?

I was wanting to use some codes that using sun.awt.image.PNGImageDecoder in my project. The problem is source code is based on Java 8 and my project using JDK 9+ (11). So I got this error:

Package 'sun.awt.image' is declared in module 'java.desktop', which does not export it to the unnamed module.

for import sun.awt.image.*, and:

Symbol is declared in module 'java.desktop' which does not export package 'sun.awt.image'

for using PNGImageDecoder or ImageDecoder etc.

After some efforts to find a solution, I found some similar situations that suggest adding requires java.desktop; to module-info.java file (like this case and this case). But as I realized this solution can only be useful when your project already has a module-info.java file and you missing one used module in it.

My project hadn't this file already (pay attention to "the unnamed module" in the first error message). As far as I know, this means all modules are imported automatically. So adding this file and adding that line hadn't any effect except (changing error message and) causing some similar issues for other parts of my codes (which were, of course, solvable by adding required modules to module-info.java file).

To sure I imported all modules in jmods folder (of JDK 11), but the problem didn't solve:

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;


I know this package (sun.awt.image) exists in java.desktop module (of JDK 11), but don't know how can access it.

I use IntelliJ IDEA as IDE.

解决方案

You should not use sun.* or com.sun.* classes in your program; they are undocumented, internal classes of the JDK and can change in any release.

Using them possibly makes your program incompatible with other versions of Java.

See: It is a bad practice to use Sun's proprietary Java classes?

这篇关于Java:不赞成使用sun.awt.image软件包吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆