Java Ninja Chronicles By Norris Shelton

Things I learned in the pursuit of code

I never really understood the use of the bundleFileName in the maven-ear-plugin. Who looks inside the .ear anyway. Well, there is a reason it is there.

I had to set the finalName property in the build section of several Maven modules across several projects. I learned the hard way that Maven modules do not talk to each other. The maven-ear-plugin assumes that the name of the artifacts is the default name. If you use finalName to change the name of the artifact, it is not aware. It configures your ear, but the file that it points to for the ejb or war module will not be there. Doh!

Example of finalName usage in an ejb module:

    <build>
        <finalName>isgwebsupport</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-ejb-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <ejbVersion>3.0</ejbVersion>
                    <generateClient>true</generateClient>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

Example of finalName usage in a war module:

    <build>
        <finalName>isgwebsupport</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <!--
                        Needed for skinny war
                        http://maven.apache.org/plugins/maven-war-plugin/examples/skinny-wars.html
                    -->
                    <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

So, if you set the finalName of an ejb module or a web module, you must also set the bundleFileName in the ear module.

NOTE: You must specify the file extension when you use bundleFileName.

Example of the usage of bundleFileName in an ear module:

    <build>
        <finalName>isgwebsupport</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <version>5</version>
                    <description>ISGWebSupport</description>
                    <displayName>ISGWebSupport</displayName>
                    <defaultLibBundleDir>/lib</defaultLibBundleDir>
                    <skinnyWars>true</skinnyWars>
                    <modules>
                         <webModule>
							<groupId>${project.groupId}</groupId>
                            <artifactId>websupport-war</artifactId>
                            <contextRoot>/giswebsupport</contextRoot>
							<bundleFileName>isgwebsupport.war</bundleFileName>
                        </webModule>
                        <ejbModule>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>websupport-ejb</artifactId>
                            <bundleFileName>isgwebsupport.jar</bundleFileName>
                        </ejbModule>
                    </modules>
                </configuration>
            </plugin>
        </plugins>
    </build>

Lesson learned.

January 18th, 2013

Posted In: Maven

Tags: , , , , , , , , , ,

6 Comments

WP to LinkedIn Auto Publish Powered By : XYZScripts.com