2012-03-14 109 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