2015-05-28 251 views
1

我有以下依賴性GWT(Maven的)項目:依賴衝突

<dependency> 
     <groupId>com.google.gwt.inject</groupId> 
     <artifactId>gin</artifactId> 
     <version>2.1.2</version> 
    </dependency> 

    <dependency> 
     <groupId>net.sourceforge.owlapi</groupId> 
     <artifactId>owlapi-distribution</artifactId> 
     <version>4.0.2</version> 
    </dependency> 
  • 杜松子酒2.1.2取決於吉斯3.0而owlapi 4.0.2取決於吉斯4.0 GWT項目-β

  • 杜松子酒用於客戶端,而owlapi用於服務器端。

  • 編譯失敗當我強制guice 4.0-beta被使用。通過java.lang.ClassNotFoundException: com.google.inject.internal.util.$Maps

  • 編譯成功造成的,當我強迫吉斯使用3.0,但造成java.lang.ClassNotFoundException: com.google.inject.internal.guava.collect.$ImmutableList

  • 降級owlapi的版本,運行時會失敗不是一個選項。

我有什麼選擇使這項工作?我能否以某種方式使用依賴範圍,同時仍然保留正常工作的GWT DevMode?

回答

4

將項目拆分爲不同的模塊。鑑於Maven有限的(通過設計)依賴項範圍選項,這真的是一個很好的選擇。使用一個客戶端代碼模塊,僅使用客戶端依賴關係(GIN和Guice 3),以及一個服務器端代碼模塊,僅使用服務器依賴關係(OWLAPI和Guice 4)。並讓你的客戶端模塊將你的代碼編譯爲JS,並將它們打包爲WAR,以便在服務器模塊中使用它作爲「覆蓋」(或者如果您願意,可以使用第三個依賴於客戶端和服務器的模塊)。如果您有共享代碼,請使用客戶端和服務器模塊依賴的第三/第四個共享模塊;共享模塊將調用maven-source-pluginjar-no-fork目標,以便客戶端模塊可以依賴於共享源。

您可以按照此方法在https://github.com/tbroyer/gwt-maven-archetypes處找到原型。他們使用我的Maven Plugin for GWT,但早期版本(你必須克隆和mvn install項目然後從適當的提交)依靠Mojo的Maven插件爲GWT(我的插件是設計與多模塊項目在腦海中,並刪除了很多在使用Mojo的插件時需要使用這些插件)。

+0

是否仍然可以使用DevMode的莫名其妙時,我有我的客戶端模塊編譯到JS? – hansi

+0

請閱讀我的原型的自述文件,解釋所有內容。 TL; DR:是的。 –

1

這是一個複雜的場景,爲我的Maven經驗提供了依賴範圍。

假設你得到的錯誤中提到番石榴,你可能會得到幸運強制使用最新的番石榴 - owlapi應與17或18

工作的另一個選擇可能是嘗試與吉斯4編譯杜松子酒(並可能在上游貢獻改變)。我不知道這有多難。您還必須確保您的快照與您的應用一起發佈,並且可供團隊中可能需要它們的其他人訪問。

0

這是值得的。我花了幾分鐘時間將它「移植」到4.0版本。幸運的是,這很容易。我對它進行了簡化,否則代碼庫基本上沒有改變。

https://github.com/chinshaw/google-gin