【问题标题】:General Maven bugginess一般 Maven 错误
【发布时间】:2012-03-14 11:08:09
【问题描述】:

所以我发现我使用 Maven 的次数越多,我发现它就越容易出错,尤其是在使用不同的 Maven 版本构建同一个项目时。这是意料之中的吗?

几个例子:

我有一个要部署到 JBoss 的 .ear。当我在类路径中引入 wsdls、xsds 和生成的类时,我将 .jar 作为依赖项引入,然后将其解压缩到 .ear 中。为此,我使用了 unpack dependencies 目标。看起来像这样……

<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 版本以构建项目时发现这样的错误吗?

【问题讨论】:

  • 请为您的单独问题打开单独的问题。另请记住,您使用的是不同的主要版本, 2.x 与 3.x 。预计会有一些行为差异。别介意 Maven 2.0.9 是在 四年 前发布的。
  • 不应再使用 Maven 2.0.9。如果有人必须坚持使用 Maven 2.0,它应该是 2.0.11。

标签: maven maven-plugin maven-release-plugin


【解决方案1】:

首先,您似乎不了解像耳朵这样的 maven 方式,因为在 EAR 中您必须添加应该放入 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 使用正确的配置。

根据您提供的信息,我预计会有一个多模块构建,其中包含将打包到 EAR 中的不同模块(如 web-part、wsdl-part 等)。这将导致如下结构:

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

此外,您似乎需要研究诸如多模块项目之类的项目的组织结构。这是这样的example。关于 Maven 的 documentation 是一个很好的开始和最后但并非最不重要的方式 Maven by Example

关于你的问题我不能承认这一点,因为我在一个非常大的项目(100 个模块 +)中使用 Maven 工作了很长时间......此外,我想知道它在哪里声明这个插件有效使用 1.0 版。

尽管看起来不像您阅读了发行说明。 Maven 版本之间存在大量差异,特别是 Maven 2.0.X、2.2.X 和 3.0.X 之间。如果您真的需要使用不同的 Maven 版本(如 2.0、2.2 和 3.0)运行构建。这可以完成并且正在工作,但是基于技术细节,特别是在 2.2.X 和 3.0.X 之间存在一些缺点(报告是)。我建议只使用一个 Maven 版本来构建您的工件(当前为 3.0.3/3.0.4)。另一个提示是,适用于 Maven 2/3 的 Maven 构建永远不会与 Maven 1 一起运行,因为 POM 已发生巨大变化。

【讨论】:

  • 很好的答案,但是我确实认为这里的问题是为什么它是在一个版本的 Maven 中构建而不是另一个版本。在一个完美的世界里,我会使用一个版本的 Maven,但是我继承了这些已经构建在不同版本中并且必须处理它们的项目。因此,我不认为 Maven 的向后兼容性支持有任何好处,因此在更广泛的意义上,“pom”的概念是多余的。
  • 例如,如果您在 .svn 中找到了一个必须构建的项目,但不知道最初构建它时使用的是哪个版本的 maven,您应该猜测吗?在这种情况下,pom 变得毫无用处,因为您需要确切知道最初用于构建项目的 Maven 版本,以免您开始遇到我遇到的问题。
  • 不是真的,因为 POM 有一个 modelVersion,它给出了一个小提示......在这种情况下,它必须至少是 Maven 2,因为 Maven 1 有 modelVersion 3。此外,我会使用 Maven 3。如果我必须坚持使用 Maven 2.0,我将使用最新的 2.0.11 (AFAIK)。另一个提示可能是在 pom 中定义的插件版本,它可以给我另一个提示,我必须使用哪个特定版本去吧。
  • Maven 2.2.1和Maven 3.0.X的兼容性很好。因为我正在用两个版本为我的客户测试我的许多项目,因为他们不喜欢升级,但这是一个不同的故事。并且这些差异可以简单地通过说明站点生成差异的配置文件来解决。
  • 好吧,我想我只能接受非向后兼容性问题了。正如我所说,我会升级到 Maven 3,但是当它在 svn 中标记版本时,我发现发布准备插件被破坏了。真的没有时间坐下来找出原因,感谢所有帮助。
猜你喜欢
  • 1970-01-01
  • 2016-07-25
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2011-12-29
  • 2012-10-24
  • 1970-01-01
相关资源
最近更新 更多