2012-03-14 111 views
0

所以我發現我使用Maven的越多,buggier我發現它是使用不同版本的Maven構建同一項目時尤其如此。這是預期的嗎?一般Bug多多的Maven

幾個例子:

我有一個的.ear我部署到JBoss。正如我帶來的WSDL,XSD文件,並帶來了在類路徑上生成的類,我帶來的.jar作爲一個依賴接着解開入的.ear。爲此,我使用解包依賴關係目標。看起來像這樣...

<plugin>    
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
       <version>2.4</version> 
      <executions> 
       <execution> 
        <id>unpack-wsimport</id> 
        <phase>prepare-package</phase> 
       <goals> 
        <goal>unpack-dependencies</goal> 
       </goals> 
        <configuration> 
         <includeGroupIds>url.projectName</includeGroupIds> 
         <includeArtifactIds>projectName-wsimport</includeArtifactIds> 
         <outputDirectory>${project.build.outputDirectory}</outputDirectory> 
        </configuration> 
       </execution> 
      </executions> 
</plugin> 

使用Maven 3.0.3(這是什麼項目最初內置),這工作正常。切換到Maven 2.0.9,突然間它沒有。在Maven網站上,它說這個插件自1.0版以來一直受到支持,那爲什麼它不工作?

本着同樣的精神,但是反過來,當我試圖做這個項目的Maven的版本,使用Maven 2.0.9將準備並正確執行,但是3.0.3不會在某些文件時複製在SVN中標記版本。

任何人的Maven的版本構建項目之間切換時,發現這樣的錯誤?

+0

請您不同的問題打開獨立的問題。另外請記住,您正在使用不同的主要版本,2.x和3.x。預計行爲有些差異。沒關係的事實,即Maven 2.0。9年前發佈。 – 2012-03-14 13:13:34

+0

Maven 2.0.9不應再使用。如果有人堅持使用Maven 2.0,它應該是2.0.11。 – khmarbaise 2012-03-14 13:25:13

回答

0

首先,它看起來像你不明白阿耳內做這樣的事情的耳朵,原因Maven的方式,你必須添加不應該通過你必須使用的依賴,插件被放入EAR的依賴性他們作爲依賴而代之。

例如:

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-ear-plugin</artifactId> 
     <version>2.6</version> 
     </plugin> 
    </plugins> 
    </build> 

    <dependencies> 
    <dependency> 
     <groupId>${project.groupId}</groupId> 
     <artifactId>webgui</artifactId> 
     <version>${project.version}</version> 
     <type>war</type> 
    </dependency> 
    <dependency> 
     <groupId>${project.groupId}</groupId> 
     <artifactId>service</artifactId> 
     <version>${project.version}</version> 
     <type>ejb</type> 
    </dependency> 
    </dependencies> 

但更好的方法是使用正確的配置爲maven-ear-plugin

根據您給出的信息,我預計會有一個包含您的不同模塊(如web-part,wsdl-part等)的多模塊構建,這些模塊將打包到EAR中。這將導致到類似下面的結構:

+-- root 
     +-- pom.xml 
     +-- war 
      +-- pom.xml 
     +-- wsdl 
      +-- pom.xml 
     +-- ... 
     +-- ejb 
      +-- pom.xml 
     +-- ear 
      +-- pom.xml 

此外,它看起來像你需要尋找到像多模塊項目的項目orginization。這是一個這樣的example。該documentation關於Maven是開始和最後但並非最不重要Maven by Example的好辦法。

關於你的問題,我不能承認這一點,因爲我很長一段時間在Maven工作很大的項目(100個模塊+)...此外,我想知道它在哪裏說,這個插件適用於1.0版本。

儘管它並不像looke您閱讀發行說明。有大量的特別Maven的2.0.X,2.2.X和3.0.x的..如果你們之間真的需要用differernt Maven的版本,例如2.0,2.2和3.0運行構建Maven的版本之間的差異。這是可以做到和工作,但也有基於特別2.2.X和3.0.x中的技術細節一些缺點(報告的)。我建議只使用一個版本的Maven構建您的工件(目前是3.0.3/3.0.4)。另一個暗示是Maven 2/3的Maven構建永遠不會運行Maven 1,因此POM已經發生了巨大的變化。

+0

好的答案,但我認爲這裏的問題是爲什麼它是在一個版本的Maven而不是其他的。在一個完美的世界中,我將使用一個版本的Maven,但是我繼承了這些已經以不同版本構建並且必須處理它們的項目。因此,我認爲Maven的後向兼容性支持不是什麼好東西,因此在更廣泛的意義上使得「pom」類型的概念變得多餘。 – user898465 2012-03-14 13:10:52

+0

例如,如果您在.svn中找到了一個您必須構建的項目,但不知道最初使用的是哪個版本的maven,那麼您是否應該猜測?在這種情況下,pom變得毫無用處,因爲您需要確切知道Maven最初用於構建項目的是哪個版本,以免您開始遇到我遇到的問題。 – user898465 2012-03-14 13:15:52

+0

不是真的,導致POM有一個modelVersion,它給出了一個小提示...在這種情況下,它必須至少Maven 2,導致Maven 1有modelVersion 3.此外,我會使用Maven 3.如果我必須堅持使用Maven 2.0我會使用最新的2.0.11(AFAIK)..另外一個提示可能是在pom中定義的插件版本,它可以給我一個其他特定版本的提示。 – khmarbaise 2012-03-14 13:20:34