2013-04-16 56 views
2

我有一個多項目Gradle構建。我有Sub-Project-A取決於Sub-Project-BSub-Project-B編譯時依賴於SLF4J。我做不是想要Sub-Project-A能夠對任何SLF4J庫進行編譯,但在運行時我確實希望Sub-Project-B代碼能夠運行。使用Gradle阻止第三方庫在編譯類路徑

我想我可以做的就是添加編譯時依賴於子項目-B,然後添加:

configurations { 
    compile.exclude group: 'org.slf4j' 
} 

到子項目-A。這確實會阻止任何代碼針對slf4j API進行編譯,但是它也會阻止slf4j庫位於Sub-Project-A運行時,因此只要訪問來自Sub-Project-B的代碼,就會遇到ClassNotFoundException。

既然這樣很難得到工作,我想我必須做錯了什麼,但是這不像一個不合理的設置。我只希望我的構建中的一個子項目能夠在編譯時訪問第三方庫。

回答

4

我想你會需要排除它,然後再包括它。我看不出有任何方法可以一步完成此操作。

作爲一個輕微修改erdi's solution,你可以再包括B的依賴於A的運行時配置全:

dependencies { 
    compile(project(':A')) { 
     exclude group: 'org.slf4j' 
    } 
    runtime project(':A') 
} 

這是一個少重複。

+0

是的,這確實似乎是不太重複的 – erdi

+0

這工作得很好,除了我現在發現,我已經配置了一堆其他依賴關係,最終也拉到了slf4j,所以這個解決方案並沒有結束工作。標記爲正確的解決方案,因爲在我的有限情況下,我概述了我認爲這絕對是解決這個問題的最佳方法。謝謝! – jjathman

3

上子項目-B定義的依賴時,你或許應該排除SLF4J依賴然後添加SLF4J依賴於運行時配置:

dependencies { 
    compile(project(':Sub-Project-B')) { 
     exclude group: 'org.slf4j' 
    } 
    runtime 'org.slf4j:...:...' 
}