簡體   English   中英

intellij,gradle“實現”不起作用,傳遞依賴性泄漏

[英]intellij , gradle “implementation” doesn't work, transitive dependecies leaks

注意:標題更新,問題似乎在intellij

我創建了一個簡單的repo來測試這個問題:

https://github.com/fvigotti/gradle-implementation-error

Gradle 5.4.1但在升級之前還使用以前的版本進行了測試..

預期的行為

實現不應該泄漏“實現庫”

當前行為

一切都泄露了......

上下文

我已經創建了一個空的ad-hoc示例項目來演示這個... https://github.com/fvigotti/gradle-implementation-error

重現步驟

gradle clean build publishToMavenLocal然后轉到另一個項目並導入: implementation "net.me:library-sample:1.0-SNAPSHOT"這不應該暴露: import org.apache.commons.codec.Decoder但它是!

我正在測試github上發現的更多源代碼似乎幾乎每個人都使用from components.java而不用擔心實現依賴性泄漏......我確定我在這里遺漏了一些東西..

謝謝Francesco

UPDATE

以下是該問題的視頻: https//vimeo.com/334392418

你在向IntelliJ提交的bug報告中說,“ 我很驚訝沒有人浮出水面 ”。 可能它沒有浮出水面的原因,是因為你遇到的不是現實世界中的問題。

我認為真正的問題可能是理解Java中類加載的臭名昭着的本質。

類加載必須能夠在系統級應用程序級別工作。 Class.forName(String)實際上在系統級別工作。 但是,您可以通過Class上的調用從應用程序級別驅動系統級別。

Gradle的api /實現約束僅適用於應用程序級別。 不在系統級別。 在Gradle構建運行的上下文之外,Gradle無法對Java類加載系統本身的設計操作施加約束。

這就像我不能從文字處理器應用程序訪問我的計算機的CPU指令寄存器。 但這並不意味着應該禁止操作系統以某種方式與CPU連接。

在您的情況下,您的net.me.consumer.Main類是“ 文字處理器 ”。 org.apache.commons.csv.CSVFormatorg.apache.commons.codec.Decoder類似於CPU中的指令。 java.lang.Class類似於操作系統。

您無法直接從文字處理器訪問CPU。 但是,您可以在文字處理器中執行操作,使操作系統與CPU連接。 你正在做類似於Class.forName(decoderClazzName)事情。

您的項目演示的相同“ 泄漏 ”也可以在Eclipse中重新編寫。 並且還在Visual Studio Code中。 實際上,我可以將它添加到您的消費者項目的MainMainTest類中:

    org.apache.commons.codec.Decoder decoder = new Decoder() {

        @Override
        public Object decode(Object source) throws DecoderException {
            // TODO Auto-generated method stub
            return null;
        }
    };

Eclipse不僅允許它,它還會自動為我創建它。 另外,它添加了必要的導入語句,我甚至沒有要求它。 並且非常快速且愉快地編譯它沒有任何問題或投訴。 即使沒有依賴於消費者的build.gradle定義的commons-codec

雖然我沒有在NetBeans中嘗試過,但我懷疑你會在那個或任何其他Java IDE中獲得相同的結果。

您使用IntelliJ提交錯誤的方式,您還必須為每個Java IDE,每個基於Java的應用程序服務器,每個基於JVM的編譯器等提交錯誤。

我認為期望Java生態系統中的每個軟件供應商都遵守單個依賴關系管理工具定義的約束是不合理的。 無論他們認為象素是多么 ;)

暫無
暫無

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

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