maven-ear-plugin - How to manipulate Manifest.MF of webModule and ejbModule?
===

I have a multimodule maven project with the following structure:

        app (parent)
        -- pom.xml
        -- app-ear
           -- pom.xml
        -- app-ejb
           -- src
           -- pom.xml
        -- app-web
           -- src
           -- pom.xml

This is my **app/pom.xml** (parent project) where I put all my application dependencies:

	<?xml version="1.0" encoding="UTF-8"?>
	<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
		<modelVersion>4.0.0</modelVersion>
	
		<groupId>com.mycompany</groupId>
		<artifactId>app</artifactId>
		<version>0.0.1-SNAPSHOT</version>
		<packaging>pom</packaging>
	
		<name>app</name>
		<url>http://maven.apache.org</url>
	
		<modules>
			<module>app-ejb</module>
			<module>app-web</module>
			<module>app-ear</module>
		</modules>
	
		<dependencies>
			<dependency>
				<groupId>javax.ejb</groupId>
				<artifactId>ejb-api</artifactId>
				<version>3.0</version>
				<scope>provided</scope>
			</dependency>
			<dependency>
				<groupId>javaee</groupId>
				<artifactId>javaee-api</artifactId>
				<version>5</version>
				<scope>provided</scope>
			</dependency>
			<dependency>
				<groupId>org.glassfish</groupId>
				<artifactId>javax.faces</artifactId>
				<version>2.0.9</version>
				<scope>provided</scope>
			</dependency>
			<dependency>
				<groupId>org.richfaces.ui</groupId>
				<artifactId>richfaces-components-ui</artifactId>
			</dependency>
			<dependency>
				<groupId>org.richfaces.core</groupId>
				<artifactId>richfaces-core-impl</artifactId>
			</dependency>
		</dependencies>
	
		<dependencyManagement>
			<dependencies>
				<dependency>
					<groupId>org.richfaces</groupId>
					<artifactId>richfaces-bom</artifactId>
					<version>4.2.0.Final</version>
					<scope>import</scope>
					<type>pom</type>
				</dependency>
			</dependencies>
		</dependencyManagement>
	
		<build>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>2.4</version>
					<configuration>
						<source>1.6</source>
						<target>1.6</target>
					</configuration>
				</plugin>
			</plugins>
		</build>

	</project>

This is my **app-ejb/pom.xml**:

	<?xml version="1.0" encoding="UTF-8"?>
	<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
		<modelVersion>4.0.0</modelVersion>
		<parent>
			<artifactId>app</artifactId>
			<groupId>com.mycompany</groupId>
			<version>0.0.1-SNAPSHOT</version>
		</parent>
	
		<artifactId>app-ejb</artifactId>
		<packaging>ejb</packaging>
	
		<build>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-ejb-plugin</artifactId>
					<version>2.3</version>
					<configuration>
						<ejbVersion>3.0</ejbVersion>
					</configuration>
				</plugin>
			</plugins>
		</build>
	</project>

This is my **app-web/pom.xml**:

	<?xml version="1.0" encoding="UTF-8"?>
	<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
		<modelVersion>4.0.0</modelVersion>
		<parent>
			<artifactId>app</artifactId>
			<groupId>com.mycompany</groupId>
			<version>0.0.1-SNAPSHOT</version>
		</parent>
	
		<artifactId>app-web</artifactId>
		<packaging>war</packaging>
	
		<dependencies>
			<dependency>
				<groupId>${project.groupId}</groupId>
				<artifactId>app-ejb</artifactId>
				<version>${project.version}</version>
				<scope>provided</scope>
			</dependency>
		</dependencies>
	
		<build>
			<finalName>app-web</finalName>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-war-plugin</artifactId>
					<version>2.2</version>
				</plugin>
			</plugins>
		</build>
	
	</project>

And finally this is my **app-ear/pom.xml** where I have the detais about how generate my app.ear file:

	<?xml version="1.0" encoding="UTF-8"?>
	<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
		<modelVersion>4.0.0</modelVersion>
		<parent>
			<artifactId>app</artifactId>
			<groupId>com.mycompany</groupId>
			<version>0.0.1-SNAPSHOT</version>
		</parent>
	
		<artifactId>app-ear</artifactId>
		<packaging>ear</packaging>
	
		<dependencies>
			<dependency>
				<groupId>${project.groupId}</groupId>
				<artifactId>app-ejb</artifactId>
				<type>ejb</type>
				<version>${project.version}</version>
				<scope>provided</scope>
			</dependency>
			<dependency>
				<groupId>${project.groupId}</groupId>
				<artifactId>app-web</artifactId>
				<type>war</type>
				<version>${project.version}</version>
				<scope>provided</scope>
			</dependency>
		</dependencies>
	
		<build>
			<finalName>app</finalName>
			<plugins>
				<plugin>
					<artifactId>maven-ear-plugin</artifactId>
					<version>2.7</version>
					<configuration>
						<version>5</version>
						<unpackTypes>war</unpackTypes>
						<defaultLibBundleDir>lib</defaultLibBundleDir>
						<skinnyWars>true</skinnyWars>
						<modules>
							<webModule>
								<groupId>com.mycompany</groupId>
								<artifactId>app-web</artifactId>
								<bundleFileName>app-web.war</bundleFileName>
								<contextRoot>/app</contextRoot>
							</webModule>
							<ejbModule>
								<groupId>com.mycompany</groupId>
								<artifactId>app-ejb</artifactId>
								<bundleFileName>app-ejb.jar</bundleFileName>
							</ejbModule>
							<jarModule>
								<groupId>org.glassfish</groupId>
								<artifactId>javax.faces</artifactId>
							</jarModule>
							<jarModule>
								<groupId>org.richfaces.core</groupId>
								<artifactId>richfaces-core-api</artifactId>
							</jarModule>
							<jarModule>
								<groupId>org.richfaces.core</groupId>
								<artifactId>richfaces-core-impl</artifactId>
							</jarModule>
							<jarModule>
								<groupId>org.richfaces.ui</groupId>
								<artifactId>richfaces-components-api</artifactId>
							</jarModule>
							<jarModule>
								<groupId>org.richfaces.ui</groupId>
								<artifactId>richfaces-components-ui</artifactId>
							</jarModule>
							<jarModule>
								<groupId>net.sourceforge.cssparser</groupId>
								<artifactId>cssparser</artifactId>
							</jarModule>
							<jarModule>
								<groupId>org.w3c.css</groupId>
								<artifactId>sac</artifactId>
							</jarModule>
							<jarModule>
								<groupId>com.google.guava</groupId>
								<artifactId>guava</artifactId>
							</jarModule>
						</modules>
					</configuration>
				</plugin>
			</plugins>
		</build>
	</project>

My problem is that *app.ear/app-web.war!META-INF/MANIFEST.MF* and *app.ear/app-ejb.jar!META-INF/MANIFEST.MF* looks like this:

        Manifest-Version: 1.0
        Build-Jdk: 1.6.0_24
        Class-Path: lib/javax.faces-2.0.9.jar lib/richfaces-core-api-4.2.0.Fin
         al.jar lib/richfaces-core-impl-4.2.0.Final.jar lib/richfaces-componen
         ts-api-4.2.0.Final.jar lib/richfaces-components-ui-4.2.0.Final.jar li
         b/cssparser-0.9.5.jar lib/sac-1.3.jar lib/guava-10.0.1.jar lib/jsr305
         -1.3.9.jar
        Created-By: Apache Maven
        Archiver-Version: Plexus Archiver

And I really have to remove the Class-Path entry from these MANIFEST.

Why? Because it seems that RichFaces is being loaded two times in classpath of my application. (One from app.ear/lib folder and another from app.ear/app-web.war!META-INF/MANIFEST.MF Class-Path entry). And when I try to deploy app.ear in my Application Server (Oracle Weblogic 10.3.5) I get some errors like that:

        INFO: Unsanitized stacktrace from failed start...
        java.lang.IllegalArgumentException: duplicate key: class   javax.faces.validator.RequiredValidator
	at com.google.common.base.Preconditions.checkArgument(Preconditions.java:115)
	at com.google.common.collect.RegularImmutableMap.<init>(RegularImmutableMap.java:72)
	at com.google.common.collect.ImmutableMap$Builder.fromEntryList(ImmutableMap.java:221)
	at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:207)
	at org.richfaces.javascript.ClientServiceConfigParser.parseConfig(ClientServiceConfigParser.java:53)
	at org.richfaces.application.ValidatorModule.createClientScriptService(ValidatorModule.java:65)
	at org.richfaces.application.ValidatorModule.configure(ValidatorModule.java:60)
	at org.richfaces.application.ServicesFactoryImpl.init(ServicesFactoryImpl.java:27)


It's weird that if I run `mvn package` in my **app-web** project, the Class-path entry does not go to app-web.war/META-INF/MANIFEST.MF. It only occurs when I run `mvn package` in my **app** parent project.

So, how could I remove the Class-path entry of webModule and ejbModule MANIFEST file?

I found a similar problem in [this thread][1] but without a solution.

I appreciate any help.

Thanks,
Mauricio


  [1]: http://stackoverflow.com/questions/9237485/how-to-set-up-manifest-class-path-properly-in-maven-war-plugin