多模块maven构建:来自父模块和模块的不同结果

时间:2012-11-29 10:30:10

标签: maven maven-3

我正在将应用程序从ant build迁移到maven 3 build。 这个应用程序由:

组成
  • 指定要构建的所有模块的父项目
  • 使用jaxb生成类并使用它们构建jar的项目
  • 构建ejb项目的项目
  • 建立战争模块的3个项目
  • 1个建设耳朵的项目

以下是我父pom的摘录:

<groupId>com.test</groupId>
<artifactId>P</artifactId>
<packaging>pom</packaging>
<version>04.01.00</version>

<modules>
    <module>../PValidationJaxb</module> <-- jar
    <module>../PValidation</module> <-- ejb
    <module>../PImport</module> <-- war
    <module>../PTerminal</module> <-- war
    <module>../PWebService</module> <-- war
    <module>../PEAR</module> <-- ear
</modules>

我有几个问题,我认为它们有相同的起源,可能是我无法弄清楚的依赖管理问题:

  • 生成的模块会有所不同,具体取决于我是从父pom还是单个模块构建的。通常情况下,如果我只构建PImport,生成的战争类似于我对我的ant构建的战争,如果我从父pom构建,我的战争需要20MB,其他模块的许多依赖项已被添加。两场战争都运转良好。

  • 我的项目PWebService具有在构建期间执行的单元测试。它使用的是mock-ejb,它将cglib作为依赖。有这个问题的ClassNotFound,我不得不排除它并添加一个依赖到cglib-nodep(参见最后一个pom提取)。如果我然后只构建这个模块,它运行良好。但是,如果我从父项目构建,它会失败,因为其他模块中的其他依赖项也对cglib具有隐式依赖性。我不得不在每个模块pom中排除它,并将依赖项添加到cglib-nodep到处运行。

我是否会错过配置中的重要内容?

PValidation pom提取物:

它正在创建一个包含ejb的jar,其中包含xdoclet生成的接口以及客户端jar。

<parent>
    <groupId>com.test</groupId>
    <artifactId>P</artifactId>
    <version>04.01.00</version>
</parent>
<artifactId>P-validation</artifactId>
<packaging>ejb</packaging>

<dependencies>
    <dependency>
        <groupId>com.test</groupId>
        <artifactId>P-jaxb</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate</artifactId>
        <version>3.2.5.ga</version>
        <exclusions>
            <exclusion>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib-nodep</artifactId>
        <version>2.2.2</version>
    </dependency>
    ...
    [other libs]
    ...
</dependencies>

<build>
    ...
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ejb-plugin</artifactId>
            <configuration>
                <ejbVersion>2.0</ejbVersion>
                <generateClient>true</generateClient>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>xdoclet-maven-plugin</artifactId>
            ...

PImport pom提取物:

它取决于Jaxb生成的jar和ejb客户端jar。

<parent>
    <groupId>com.test</groupId>
    <artifactId>P</artifactId>
    <version>04.01.00</version>
</parent>
<artifactId>P-import</artifactId>
<packaging>war</packaging>

<dependencies>
    <dependency>
        <groupId>com.test</groupId>
        <artifactId>P-jaxb</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>com.test</groupId>
        <artifactId>P-validation</artifactId>
        <version>${project.version}</version>
        <type>ejb-client</type>
    </dependency>
    ...
    [other libs]
    ...
</dependencies>

PWebService pom提取:

<parent>
    <groupId>com.test</groupId>
    <artifactId>P</artifactId>
    <version>04.01.00</version>
</parent>

<artifactId>P-webservice</artifactId>
<packaging>war</packaging>

<properties>
    <jersey.version>1.14</jersey.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-servlet</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>com.rte.etso</groupId>
        <artifactId>etso-validation</artifactId>
        <version>${project.version}</version>
        <type>ejb-client</type>
    </dependency>
    ...
    [other libs]
    ...
    <dependency>
        <groupId>org.mockejb</groupId>
        <artifactId>mockejb</artifactId>
        <version>0.6-beta2</version>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>cglib</groupId>
                <artifactId>cglib-full</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib-nodep</artifactId>
        <version>2.2.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

非常感谢

修改配置后的解决方案:

当我已经对项目进行了规范化时,它并没有尊重文件夹布局约定,但是因为它在pom中声明了在哪里找到源代码,我认为它会起作用。 无论如何,我改变它以匹配推荐的结构。

要构建单个模块,我直接在其级别执行mvn clean install。正是这种方式我获得了不同的结果(实际上是我想要的结果)。

无论如何,我的问题已经解决,我把PValidation项目的所有依赖项都提供了,因为我只在其他模块中包含生成的客户端,并且它们不需要实现所需的全部内容。

但我仍然不明白为什么我对同一配置有不同的结果。

1 个答案:

答案 0 :(得分:2)

第一件重要的事情是你应该创建适合于模块结构的项目结构,这意味着具有以下文件夹结构:

+-- parent
      +-- PValidationJaxb
      +-- PValidation
      +-- PImport
      +-- PTerminal
      +-- PWebService
      +-- PEAR

这意味着拥有一个pom.xml,其中包含父文件夹中的模块定义。 如果您遵循上述建议,您可以将模块列表简化为以下内容:

<modules>
    <module>PValidationJaxb</module> <-- jar
    <module>PValidation</module> <-- ejb
    <module>PImport</module> <-- war
    <module>PTerminal</module> <-- war
    <module>PWebService</module> <-- war
    <module>PEAR</module> <-- ear
</modules>

此外,Maven的最佳做法是使用小写工件,这意味着在您的情况下 pvalidationjaxb 而不是 PValidationJaxb

另一个重要的事情是你的版本不遵循Maven conventions。此外,您的版本将从Maven的角度出发,而不是您正在进行开发的情况。在Maven中,您应该使用所谓的 SNAPSHOT 来实现1.0.0-SNAPSHOT等目的。

我希望您已按照folder layout recommendation of Maven说明将生产代码(将打包到生成的jar中)放入 src / main / java ,而将测试代码放入的src /测试/ JAVA

您描述的具有不同依赖关系的问题听起来很受欢迎。问题是你是如何尝试构建单一模块的?这通常可以通过在父位置使用以下内容来实现:

mvn -pl module clean package

你的单元测试的问题听起来像是缺少依赖等等。但是这里有一些问题你是如何尝试运行单元测试并且你配置了maven-surefire-plugin?或者你有集成测试?这只是猜测,因为我没有在你的poms中看到Maven插件的任何配置。