2017-10-07 64 views
2

在搖籃文檔它指出了java-library plugin搖籃的Java庫插件相比,Java插件

Java庫插件通過提供有關Java庫的具體知識擴展了Java插件的功能。特別是,Java庫向消費者公開API(即,使用Java或Java庫插件的其他項目)

此聲明暗示只有意圖被使用的Java程序(庫)應該使用java-library插件;而不意味着被消費的Java程序(應用程序)應該使用java插件。

此前使用java-library插件根build.gradle文件可能包含以下內容:

subprojects { 
    apply plugin: 'java' 
    sourceCompatibility '1.8' 
    targetCompatibility '1.8' 

    // other common java stuff 
} 

但是現在在多模塊項目具有您不能委派插件選擇的子項目,並有兩個應用程序和庫下面根build.gradle

subprojects { 
    sourceCompatibility '1.8' 
    targetCompatibility '1.8' 

    // other common java stuff 
} 

因爲sourceCompatibilitytargetCompatibility由定義這將失敗和java-library插件。理想情況下,我想做到以下幾點:

subprojects { 
    apply plugin: 'java-library' 
    sourceCompatibility '1.8' 
    targetCompatibility '1.8' 

    // other common java stuff 
} 

是否有任何理由強制執行的Java應用程序使用java插件和Java庫使用java-library插件?是否有任何理由使用java插件而不是java-library插件?

編輯

爲了進一步澄清我的問題,在搖籃樣品中存在的與java插件here併爲java-library插件here一個多模塊項目。在java插件的示例中,root build.grade使用apply plugin: 'java'java-library插件的根build.gradle不使用任何插件。該應用程序項目使用apply plugin: 'java';而核心和utils項目使用apply plugin: 'java-library'

我的問題是爲什麼一些項目使用java插件,其他人使用java-library插件?它似乎使它更難以不違反DRY原則。我很難僅指定sourceCompatibilitytargetCompatibility一次。我可以想出幾種方法來指定這些屬性,但最簡單的解決方案似乎是對所有項目都使用java-library

java插件用於某些子項目並將java-library插件用於其他項目有什麼好處嗎?

回答

0

按照docs

[...] Java庫插件只能連接到與java插件正常運行。

因此,如果您將兩個插件應用於項目,都不應該遇到任何問題。例如。您可以通過subprojects關閉將java插件應用於每個項目,然後將java-library插件應用於需要該插件附加功能的子項目(通過其build.gradle文件)。

請注意,您可以通過的withPlugin方法或PluginContainerwithId方法指定與插件相關的配置。對於這兩種方法適用:

如果插件已應用,則會執行該操作。如果稍後應用該插件,則該插件應用後將執行該操作。如果從未應用該插件,則該操作從不執行。

subprojects { sub -> 
    sub.plugins.withId('java-library') { 
     // configure sub 
    } 
} 
+0

這很有趣我以前沒見過'withPlugin'或'withId'方法。這絕對回答了我可以在應用之前配置插件的方式。然而,這是否比爲應用程序和庫使用'java-library'插件更好? – DragonAssassin

0

插件暴露了可用於聲明依賴兩種配置:apiimplementation

並且:

api配置應被用於聲明其由庫API導出的依賴關係,而implementation配置應被用於聲明依賴性其是內部的組件。

Gradle 3.4引入了new Java Library plugin configurations,它們允許您控制依賴項是否發佈到使用該庫的項目的編譯和運行時類路徑。
如果要使用新的api配置而不是compile,則必須使用新的插件。

+0

我瞭解Java庫插件的新功能,並希望將其用於我的圖書館,但沒有任何理由使用的Java插件的應用程序?應用程序沒有理由使用api配置,而java插件支持實現配置。但是我想知道我是否仍然應用java插件來應用程序? – DragonAssassin

+0

@DragonAssassin目前沒有理由在應用程序中使用它,但它只是一個意見。 –

+0

我編輯了我的問題。希望這可以讓我更清楚爲什麼我相信使用這兩個插件是有問題的。它也應該解釋爲什麼我想知道是否有任何缺點使用Java庫插件的一切。 – DragonAssassin