Multi-module maven build : different result from parent and from module

Posted by Albaku on Stack Overflow See other posts from Stack Overflow or by Albaku
Published on 2012-11-29T10:30:09Z Indexed on 2012/11/29 11:04 UTC
Read the original article Hit count: 287

Filed under:
|

I am migrating an application from ant build to maven 3 build. This app is composed by :

  • A parent project specifying all the modules to build
  • A project generating classes with jaxb and building a jar with them
  • A project building an ejb project
  • 3 projects building war modules
  • 1 project building an ear

Here is an extract from my parent 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>

I have several problems which I think have the same origin, probably a dependency management issue that I cannot figure out :

  • The generated modules are different depending on if I build from the parent pom or a single module. Typically if I build PImport only, the generated war is similar to what I had with my ant build and if I build from the parent pom, my war took 20MB, a lot of dependencies from other modules had been added. Both wars are running well.

  • My project PWebService has unit tests to be executed during the build. It is using mock-ejb which has cglib as dependency. Having a problem of ClassNotFound with this one, I had to exclude it and add a dependency to cglib-nodep (see last pom extract). If I then build only this module, it is working well. But if I build from the parent project, it fails because other dependencies in other modules also had an implicit dependency on cglib. I had to exclude it in every modules pom and add the dependency to cglib-nodep everywhere to make it run.

Do I miss something important in my configuration ?

The PValidation pom extract :

It is creating a jar containing an ejb with interfaces generated by xdoclet, as well as a client 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>
            ...

The PImport pom extract :

It depends on both Jaxb generated jar and the ejb client 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>

The PWebService pom extract :

<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>

Many thanks

© Stack Overflow or respective owner

Related posts about maven

Related posts about maven-3