代码之家  ›  专栏  ›  技术社区  ›  Mir-Ismaili

Java:是“Sun.AWT.IMAGE”包被弃用了吗?

  •  5
  • Mir-Ismaili  · 技术社区  · 6 年前

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

    包装 sun.awt.image '在模块中声明' java.desktop ,不导出到 未命名模块 .

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

    符号在模块' 桌面 '不导出包' 太阳图像

    为了使用 PNGImageDecoder ImageDecoder 等。

    在努力寻找解决方案后,我发现了一些类似的情况,建议添加 requires java.desktop; module-info.java 文件(类) this case this case )但我意识到,只有当您的项目已经 模块-info.java 文件中缺少一个使用过的模块。

    我的项目还没有这个文件(注意 未命名模块 “在第一条错误消息中)。据我所知,这意味着所有模块都是自动导入的。因此,添加这个文件和添加该行没有任何效果,除了(更改错误消息和)对我的代码的其他部分造成一些类似的问题(当然,通过将所需模块添加到 模块-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.图像 存在于 桌面 模块(JDK 11),但不知道如何访问它。

    我使用Intellij思想作为IDE。

    2 回复  |  直到 6 年前
        1
  •  4
  •   Jesper    6 年前

    你不应该使用 sun.* com.sun.* 程序中的类;它们是未记录的JDK内部类,可以在任何版本中更改。

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

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

        2
  •  5
  •   Naman    6 年前

    它是密封的!

    这个问题当然不会得到解决,包括JDK中的所有模块。

    我知道这个包(sun.awt.image)存在于java.desktop模块(的 JDK 11),但不知道如何访问它。

    问题的真正症结在于,即使在课堂上 PNGImageDecoder 它所属的包裹 sun.awt.image java.desktop 模块,模块已选择 不出口 任何利用它的外部图书馆。

    抽象此类类的选择( sun.* )已经有了有意的打算,并与Java-9的发行说明进行了良好的文档记录,其基本原理在 JEP-260#Encapsulate Most Internal APIs 也。


    这么说之后, 暂时的 相当老套的解决方案是

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

    命令行参数。最好,您应该寻找一种替代方法来实现您使用该类所要实现的目标。 PNGIDED .


    最后一部分, "the unnamed module" 是实际代码(无论是您的应用程序还是它的任何依赖项)试图访问此类的位置 PNGIDED . 因此,可以这样想,上面用于用例的命令行arg会导致:

    --add-exports=java.desktop/sun.awt.image=ALL-UNNAMED
    
    推荐文章