Skip to content

Transitive dependencies in Maven 2 Pom with JBoss, Seam, Richfaces

If you use Maven for builing Hibernate/Spring or JBoss Seam based projects and you refer to an external Maven2 repository like JBoss, you will sure run into the most hated feature of Maven2 — Transitive Dependencies.

Lets say you refer to Seam jars via an external pom, it not only gets Seam but also all the it’s non-optional dependencies which you don’t really require because you probably have them in your App, Server (In my case JBoss). Most of the apache commons jars, log4j, xerces and several other reusable jars are not really needed. Even worse, sometimes your app already has included it via another Jar and you don’t want to end up having multiple jars of same versions! With Transitive dependencies, this is exactly what happens. I use JBoss with ear deployement. So, when I directly used the pom structure for Seam, Richfaces, it stuffed in around 15 jars into my ear packaging which _I_dont_really_need. Luckily, there is a work around, ie., by adding “exclusions” in each of these dependencies. It’s a pain, I know but someone’s got to do it.

I’ve done job for you, so if you’re project is using the latest Seam, Hibernate, Richfaces on a JEE5 environment onJBoss 4.2.x and you need the right Maven 2 Repository pom structure with ear packaging, copy paste the following dependencies and customize it with your app. It should work like a charm. (I didn’t copy my entire pom as it has lot of other stuff in it)

Firstly, update your maven settings.xml to refer to JBoss Maven2 Repository. If you’re using JBoss Seam, rest assured, all your jars can be found in this exhaustive link. Even if you change versions in the near future, you’d not need to update the pom (except for the version property) as JBoss always refreshes the latest maven builds.

<profile>
  <id>your repo</id>
  <repositories>
	<repository>
	  <id>jboss-maven2-repository</id>
	  <name>JBoss Maven 2 Repository</name>
	  <url>http://repository.jboss.com/maven2</url>
	</repository>
  </repositories>
</profile>

Ear packaging is tricky, I hate it but JEE5 insists on ear even for simple webapps (someone please tell them!).
Michale Yuan did a great job of documenting the pom structure for ear deployement here. My structure is the same except that I ppint JBoss Repository to automatically download all jars.

ear.pom.xml – includes the ejbs, web projects

<dependencies>
	<!-- 3rd Party Artifacts -->
	<dependency>
		<groupid>org.jboss.seam</groupid>
		<artifactid>jboss-seam</artifactid>
		<version>${seam.version}</version>
		<exclusions>
			<exclusion>
				<groupid>javassist</groupid>
				<artifactid>javassist</artifactid>
			</exclusion>
			<exclusion>
				<groupid>org.jboss.el</groupid>
				<artifactid>jboss-el</artifactid>
			</exclusion>
			<exclusion>
				<groupid>dom4j</groupid>
				<artifactid>dom4j</artifactid>
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>
		<groupid>org.jboss.seam</groupid>
		<artifactid>jboss-el</artifactid>
		<version>2.0.0.GA</version>
		<exclusions>
			<exclusion>
				<groupid>javax.el</groupid>
				<artifactid>el-api</artifactid>
			</exclusion>
		</exclusions>
	</dependency>

	<dependency>
		<groupid>commons-digester</groupid>
		<artifactid>commons-digester</artifactid>
		<version>1.8</version>
	</dependency>

	<dependency>
		<groupid>commons-beanutils</groupid>
		<artifactid>commons-beanutils</artifactid>
		<version>1.7.0</version>
	</dependency>

	<dependency>
		<groupid>commons-logging</groupid>
		<artifactid>commons-logging</artifactid>
		<version>1.0.4</version>
		<scope>provided</scope>
	</dependency>

	<dependency>
		<groupid>com.reverttoconsole.sample</groupid>
		<artifactid>web</artifactid>
		<version>1.0</version>
		<type>war</type>
	</dependency>

	<dependency>
		<groupid>com.reverttoconsole.sample</groupid>
		<artifactid>ejbs</artifactid>
		<version>1.0</version>
		<type>ejb</type>
	</dependency>

	<dependency>
		<groupid>org.testng</groupid>
		<artifactid>testng</artifactid>
		<version>4.7</version>
		<scope>test</scope>
		<classifier>jdk15</classifier>
	</dependency>

	<dependency>
		<groupid>org.richfaces.framework</groupid>
		<artifactid>richfaces-api</artifactid>
		<version>${richfaces.version}</version>
		<exclusions>
			<exclusion>
				<groupid>commons-collections</groupid>
				<artifactid>commons-collections</artifactid>
			</exclusion>
			<exclusion>
				<groupid>commons-beanutils</groupid>
				<artifactid>commons-beanutils</artifactid>
			</exclusion>
		</exclusions>
	</dependency>
</dependencies>

ejbs.pom.xml

<dependencies>
	<!-- By default, the test script for this starter project uses SeamTest which uses TestNG -->
	<dependency>
		<groupid>org.jboss.seam</groupid>
		<artifactid>jboss-seam</artifactid>
		<version>${seam.version}</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupid>org.jboss.seam</groupid>
		<artifactid>jboss-el</artifactid>
		<version>2.0.0.GA</version>
		<scope>compiler</scope>
		<exclusions>
			<exclusion>
				<groupid>javax.el</groupid>
				<artifactid>el-api</artifactid>
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>
		<groupid>org.hibernate</groupid>
		<artifactid>hibernate</artifactid>
		<version>${hibernate.version}</version>
		<exclusions>
			<exclusion>
				<groupid>commons-collections</groupid>
				<artifactid>commons-collections</artifactid>
			</exclusion>
			<exclusion>
				<groupid>commons-logging</groupid>
				<artifactid>commons-logging</artifactid>
			</exclusion>
			<exclusion>
				<groupid>net.sf.ehcache</groupid>
				<artifactid>ehcache</artifactid>
			</exclusion>
			<exclusion>
				<groupid>junit</groupid>
				<artifactid>junit</artifactid>
			</exclusion>
			<exclusion>
				<groupid>javax.transaction</groupid>
				<artifactid>jta</artifactid>
			</exclusion>
			 <exclusion>
				<groupid>asm</groupid>
				<artifactid>asm</artifactid>
			</exclusion>
			<exclusion>
				<groupid>asm</groupid>
				<artifactid>asm-attrs</artifactid>
			</exclusion>
			<exclusion>
				<groupid>dom4j</groupid>
				<artifactid>dom4j</artifactid>
			</exclusion>
			<exclusion>
				<groupid>antlr</groupid>
				<artifactid>antlr</artifactid>
			</exclusion>
			<exclusion>
				<groupid>cglib</groupid>
				<artifactid>cglib</artifactid>
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>
		<groupid>org.hibernate</groupid>
		<artifactid>hibernate-validator</artifactid>
		<version>3.0.0.ga</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupid>javax.transaction</groupid>
		<artifactid>jta</artifactid>
		<version>1.0.1B</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupid>javax.persistence</groupid>
		<artifactid>ejb3-persistence</artifactid>
		<version>1.0</version>
		<scope>compile</scope>
	</dependency>

	<!-- EJB 3.0 Session beans - Annotations and API's -->
	<dependency>
		<groupid>javax.ejb</groupid>
		<artifactid>ejb-api</artifactid>
		<version>3.0</version>
		<scope>compile</scope>
	</dependency>
	<!-- JBoss-EJB3 infrastructure -->
	<!-- JBoss EJB3 Microcontainer for testing -->
	<dependency>
		<groupid>org.jboss.seam.embedded</groupid>
		<artifactid>hibernate-all</artifactid>
		<version>beta3</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupid>org.jboss.seam.embedded</groupid>
		<artifactid>jboss-embedded-all</artifactid>
		<version>beta3</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupid>org.jboss.seam.embedded</groupid>
		<artifactid>thirdparty-all</artifactid>
		<version>beta3</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<!-- required to boot jboss embedded -->
		<groupid>org.jboss.seam.embedded</groupid>
		<artifactid>jboss-embedded-api</artifactid>
		<version>beta3</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<!-- required to boot jboss embedded -->
		<groupid>org.hibernate</groupid>
		<artifactid>hibernate-commons-annotations</artifactid>
		<version>3.3.0.ga</version>
		<scope>test</scope>
	</dependency>
	<!-- JBoss-EJB3 infrastructure -->
	<!-- Servlets 2.5 -->
	<dependency>
		<groupid>javax.servlet</groupid>
		<artifactid>servlet-api</artifactid>
		<version>2.5</version>
		<scope>test</scope>
	</dependency>
	<!-- JSF 1.2 -->
	<dependency>
		<groupid>javax.faces</groupid>
		<artifactid>jsf-api</artifactid>
		<version>1.2_04</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupid>javax.faces</groupid>
		<artifactid>jsf-impl</artifactid>
		<version>1.2_04</version>
		<scope>provided</scope>
	</dependency>
	<!-- EL (expression language) -->
	<dependency>
		<groupid>javax.servlet</groupid>
		<artifactid>el-api</artifactid>
		<version>2.1wFacelets1.1.4</version>
		<scope>provided</scope>
		<!-- downloaded w. Facelets 1.1.4 Milestone Release -->
	</dependency>
	<dependency>
		<groupid>javax.servlet</groupid>
		<artifactid>el-ri</artifactid>
		<version>2.1wFacelets1.1.4</version>
		<scope>provided</scope>
		<!-- downloaded w. Facelets 1.1.4 Milestone Release -->
	</dependency>
	<!-- JavaMail API's -->
	<dependency>
		<groupid>javax.mail</groupid>
		<artifactid>mail</artifactid>
		<version>1.4</version>
		<scope>provided</scope>
	</dependency>
	<!-- JBoss-EJB3 infrastructure -->
	<!-- Servlets 2.5 -->
	<dependency>
		<groupid>javax.servlet</groupid>
		<artifactid>servlet-api</artifactid>
		<version>2.5</version>
		<scope>test</scope>
	</dependency>

	<dependency>
		<groupid>javax.servlet</groupid>
		<artifactid>servlet-api</artifactid>
		<version>2.5</version>
		<scope>provided</scope>
	</dependency>

	<!-- JSF 1.2 -->
	<dependency>
		<groupid>javax.faces</groupid>
		<artifactid>jsf-api</artifactid>
		<version>1.2_04</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupid>javax.faces</groupid>
		<artifactid>jsf-impl</artifactid>
		<version>1.2_04</version>
		<scope>provided</scope>
	</dependency>
	<!-- JDBC Driver(s) -->
	<!-- Pick or add the correct JDBC Driver(s) for your project tests here -->
	<!--  <dependency>
		<groupId>com.mysql</groupId>
		<artifactId>mysql-connector</artifactId>
		<version>5.0.8</version>
		<scope>test</scope>
	</dependency>
	-->
	<dependency>
		<groupid>oracle-jdbc</groupid>
		<artifactid>ojdbc14</artifactid>
		<version>10.2.0.2</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupid>org.richfaces.framework</groupid>
		<artifactid>richfaces-api</artifactid>
		<version>${richfaces.version}</version>
		<exclusions>
			<exclusion>
				<groupid>commons-collections</groupid>
				<artifactid>commons-collections</artifactid>
			</exclusion>
			<exclusion>
				<groupid>commons-beanutils</groupid>
				<artifactid>commons-beanutils</artifactid>
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>
		<groupid>org.richfaces.framework</groupid>
		<artifactid>richfaces-impl</artifactid>
		<version>${richfaces.version}</version>
		<exclusions>
			<exclusion>
				<groupid>commons-digester</groupid>
				<artifactid>commons-digester</artifactid>
			</exclusion>
			<exclusion>
				<groupid>commons-logging</groupid>
				<artifactid>commons-logging</artifactid>
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>
		<groupid>org.richfaces.ui</groupid>
		<artifactid>richfaces-ui</artifactid>
		<version>${richfaces.version}</version>
	</dependency>
	<!-- Hypersonic JDBC Driver -->
	<!--dependency>
		<groupId>hsqldb</groupId>
		<artifactId>hsqldb</artifactId>
		<version>1.8.0.9</version>
		<scope>test</scope>
		</dependency-->

	<!-- By Default, we'll write TestNG-style tests for our EJB's -->
	<dependency>
		<groupid>org.testng</groupid>
		<artifactid>testng</artifactid>
		<version>5.6</version>
		<scope>test</scope>
		<classifier>jdk15</classifier>
	</dependency>
</dependencies>

web.pom.xml

<dependencies>
	<!-- Seam Core : Required -->
	<dependency>
		<groupid>org.jboss.seam</groupid>
		<artifactid>jboss-seam</artifactid>
		<version>${seam.version}</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupid>org.jboss.seam</groupid>
		<artifactid>jboss-el</artifactid>
		<version>2.0.0.GA</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupid>org.jboss.seam</groupid>
		<artifactid>jboss-seam-ui</artifactid>
		<version>${seam.version}</version>
	</dependency>
	<!-- Seam Debug Tools : Optional, but a reasonable requirement for a newly created project -->
	<dependency>
		<groupid>org.jboss.seam</groupid>
		<artifactid>jboss-seam-debug</artifactid>
		<version>${seam.version}</version>
	</dependency>
	<dependency>
		<groupid>org.jboss.seam</groupid>
		<artifactid>jboss-seam-mail</artifactid>
		<version>${seam.version}</version>
	</dependency>

	<!-- Seam PDF : Optional, use this if you're generating PDF reports in your project -->
	<!--dependency>
		<groupId>org.jboss.seam</groupId>
		<artifactId>jboss-seam-pdf</artifactId>
		<version>2.0.1</version>
		</dependency-->

	<!-- Seam Remoting : Optional, use this if you'ld like to use Seam's remoting support
		for Ajax functionality in your project
	-->
	<!--dependency>
		<groupId>org.jboss.seam</groupId>
		<artifactId>jboss-seam-remoting</artifactId>
		<version>2.0.1</version>
		</dependency-->

	<!-- JSF 1.2 (from https://maven-repository.dev.java.net/nonav/repository/javax.faces/jars/) -->
	<dependency>
		<groupid>javax.faces</groupid>
		<artifactid>jsf-api</artifactid>
		<version>1.2_04</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupid>javax.faces</groupid>
		<artifactid>jsf-impl</artifactid>
		<version>1.2_04</version>
		<scope>provided</scope>
	</dependency>

	<!-- Facelets (for JSF) -->
	<dependency>
		<groupid>com.sun.facelets</groupid>
		<artifactid>jsf-facelets</artifactid>
		<version>1.1.13</version>
	</dependency>

	<!-- Richfaces and dependencies : BEGIN -->
	<dependency>
		<groupid>org.richfaces.framework</groupid>
		<artifactid>richfaces-api</artifactid>
		<version>${richfaces.version}</version>
		<scope>provided</scope>
		<exclusions>
			<exclusion>
				<groupid>commons-collections</groupid>
				<artifactid>commons-collections</artifactid>
			</exclusion>
			<exclusion>
				<groupid>commons-beanutils</groupid>
				<artifactid>commons-beanutils</artifactid>
			</exclusion>
		</exclusions>
	</dependency>

	<dependency>
		<groupid>org.richfaces.framework</groupid>
		<artifactid>richfaces-impl</artifactid>
		<version>${richfaces.version}</version>
		<exclusions>
			<exclusion>
				<groupid>commons-digester</groupid>
				<artifactid>commons-digester</artifactid>
			</exclusion>
			<exclusion>
				<groupid>commons-logging</groupid>
				<artifactid>commons-logging</artifactid>
			</exclusion>
		</exclusions>
	</dependency>

	<dependency>
		<groupid>org.richfaces.ui</groupid>
		<artifactid>richfaces-ui</artifactid>
		<version>${richfaces.version}</version>
	</dependency>

	<dependency>
		<groupid>commons-logging</groupid>
		<artifactid>commons-logging</artifactid>
		<version>1.0.4</version>
		<scope>provided</scope>
	</dependency>

	<dependency>
		<groupid>commons-digester</groupid>
		<artifactid>commons-digester</artifactid>
		<version>1.8</version>
	</dependency>

	<!-- This is required by Ajax4JSF 09.24.2007 -->
	<dependency>
		<groupid>org.apache.commons.collections</groupid>
		<artifactid>commons-collections</artifactid>
		<version>3.2</version>
	</dependency>

	<!-- Servlets 2.5 -->
	<dependency>
		<groupid>javax.servlet</groupid>
		<artifactid>servlet-api</artifactid>
		<version>2.5</version>
		<scope>provided</scope>
	</dependency>

	<!-- depends on asr ejb beans  -->
	<dependency>
		<groupid>com.reverttoconsole.sample</groupid>
		<artifactid>ejbs</artifactid>
		<version>1.0</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupid>org.hibernate</groupid>
		<artifactid>hibernate-validator</artifactid>
		<version>3.0.0.ga</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupid>org.testng</groupid>
		<artifactid>testng</artifactid>
		<version>5.6</version>
		<scope>test</scope>
		<classifier>jdk15</classifier>
	</dependency>
</dependencies>

I like externalizing versions as properties like in above as it’s easy to download latest ones periodically by just changing in one place Add this in each of the poms, for instance

<properties>
       <seam.version>2.0.2.SP1</seam.version>
       <richfaces.version>3.2.1.GA</richfaces.version>
</properties>
[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*