2012-08-13 74 views
0

我有一個multimodule maven項目。項目佈局如下描述:在多模塊項目中使用配置文件

PARENT 
    |-CHILD1 
    |-CHILD2 

父項目有聚甲醛包裝類型和聲明CHILD1CHILD2項目爲模塊。另外PARENT項目聲明配置文件dev其中聲明瞭一些屬性。 CHILD1項目通過添加一些依賴項(例如依賴於commons-collections)具有jar包裝類型並「覆蓋」父項dev配置文件。 CHILD2項目具有戰爭包裝類型並且依賴於CHILD1項目。此外,CHILD2通過添加其他依賴項(例如,依賴於commons-io,我的意思是與項目CHILD1中的依賴項無關)來「覆蓋」父級dev配置文件。 然後當我運行mvn clean install -Pdev maven不把commons-collections.jar(在CHILD1項目中聲明的依賴項)放到CHILD2項目的WEB-INF/lib,但是commons-io.jar在那裏。

所以,問題是:如果目標項目在該配置文件中聲明瞭另一組依賴項,爲什麼不從在目標項目的從屬項目中聲明的配置文件放置依賴項?

其實我有更多的項目和更多的依賴項,在不同的配置文件中有所不同。我想在該項目pom.xml中聲明項目特定的依賴關係(假設在項目中聲明配置文件將「覆蓋」父配置文件聲明)

+2

添加依賴關係是**主要反模式**並且不應該在原始POM格式規範中被允許。 – 2012-08-14 08:15:49

+0

如何在不同配置文件中需要不同配置的情況下采取行動?我需要排除某些配置文件中的某些依賴關係 – maks 2012-08-14 08:30:24

+0

使用不同的模塊和webapp疊加層將模塊通過配置文件添加到反應器中。 IOW您將擁有三個或四個webapp模塊,除了基本webapp和您需要的附加依賴關係之外,其餘所有模塊都將爲'空' – 2012-08-14 08:36:45

回答

2

我假設您希望能夠在開發時測試本地,針對暫存環境進行更改並最終部署到生產環境。

需要牢記的關鍵是,當工件部署到本地/遠程存儲庫時,活動配置文件不是部署的部分,因此當通過配置文件添加依賴關係時,事情變得非常危險因爲您無法知道該Web應用程序是否是在DEV配置文件處於活動狀態或PROD配置文件處於活動狀態的情況下構建的,然後當將構建的工件部署到生產環境中時,您可能會被嚴格控制。

所以缺點是你確保你的工件獨立於部署環境。

這意味着,例如,你會撿起配置:

  • 文件在classpath
  • 系統屬性
  • JNDI條目

因此,舉例來說,如果部署到Tomcat,你可能會把一個configuration.properties放入$CATALINA_HOME/lib

啓動時的web應用程序將使用getClass().getResource('/configuration.properties')來解析屬性文件,如果文件丟失(故障快速),則無法啓動

您可以通過將測試版本放入您的設備/集成測試中來使用其他配置configuration.properties中的src/test/resources

對應用程序的<scope>provided</scope>樣式依賴關係使用相同的原則。換句話說,集裝箱與提供合同的依賴關係應該由集裝箱提供。因此,您可以使用Maven爲自己構建生產版本的tomcat/jetty,並將所需的依賴項添加到該程序集中。這將是生產版本使用MySQL數據庫的情況,所以您需要將mysql-jdbc驅動程序添加到$CATALINA_HOME/lib。使用程序集插件執行此操作相對容易,因爲您實際上只是重新包裝了一些包含某些位的zip文件,而另一些則排除了該zip文件。

當您在本地進行測試時,您會希望使用幫助插件'run的目標,如jetty:runtomcat:run。這裏的解決方案是,通過配置文件提供這些插件依賴關係沒有任何問題,因爲您不會影響工件的依賴關係,因此您隻影響插件的類路徑。

例如

<project> 
    <!-- ... some stuff .. --> 
    <profiles> 
    <profile> 
     <id>DEV</id> 
     <build> 
     <plugins> 
      <plugin> 
      <groupId>org.mortbay.jetty</groupId> 
      <artifactId>jetty-maven-plugin</artifactId> 
      <dependencies> 
       <dependency> 
       <groupId>commons-dbcp</groupId> 
       <artifactId>commons-dbcp</artifactId> 
       <version>1.4</version> 
       </dependency> 
       <dependency> 
       <groupId>mysql</groupId> 
       <artifactId>mysql-connector-java</artifactId> 
       <version>5.1.18</version> 
       </dependency> 
      </dependencies> 
      </plugin> 
     </plugins> 
     </build> 
    </profile> 
    </profiles> 
</project> 

您還可以配置系統屬性或類路徑添加以提取所需的配置文件。

所有這一切的最終結果是神器保持環境獨立,可以針對不同的環境中輕鬆地測試

希望這回答了你的問題(即使橫向)的輪廓

+0

它不依賴於環境。我只想排除一些依賴關係或提供依賴關係,而不使用某些傳遞性或基於(例如)maven build命令的輸入參數爲不同的作用域提供依賴關係。爲了提供有關配置文件信息的工件,我可以使用分類器並在不同的配置文件中激活它(分類器)。所以問題仍然是開放的 – maks 2012-08-14 15:14:00

+1

分類器具有與主要工件相同的依賴關係,因此分類器是一個錯誤的解決方案。 Maven很自以爲是,你正在試圖做一件它堅決認爲是「壞事」的事情,所以最終的結果是你會一路戰鬥......祝你好運....祝你好運6個月後,試圖弄清楚你做了什麼! – 2012-08-14 16:25:28

相關問題