簡體   English   中英

Java:不推薦使用`sun.awt.image`包嗎?

[英]Java: Is `sun.awt.image` package deprecated?

我想在我的項目中使用一些使用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文件添加所需的模塊來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的所有模塊。

我知道這個包(sun.awt.image)存在於java.desktop模塊(JDK 11)中,但不知道如何訪問它。

這里問題的實際症結在於,即使類PNGImageDecoder和它屬於sun.awt.image的包是java.desktop模塊的一部分,模塊也選擇不將導出到任何外部圖書館利用它。

抽象這些類( sun.* )的選擇是有意識的,並且在Java-9的發行說明中很好地記錄了,並且在JEP-260#Encapsulate Most Internal API中也提到了基本原理。


話雖如此,對它的臨時相當苛刻的解決方案將是補充

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

到您的命令行參數。 您最好使用PNGImageDecoder類來尋找替代方法。


它的最后一部分, “未命名的模塊”是實際代碼(無論是你的應用程序還是它的任何依賴項)試圖訪問此類PNGImageDecoder 所以想想它,上面的命令行arg為你的用例導致:

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

你不應該在程序中使用sun.*com.sun.*類; 它們是未記錄的,JDK的內部類,可以在任何版本中更改。

使用它們可能會使您的程序與其他版本的Java不兼容。

請參閱: 使用Sun專有的Java類是不好的做法?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM