<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>byte bohemian &#187; EJB</title>
	<atom:link href="http://nicl.net/category/technology/java/j2ee/ejb/feed/" rel="self" type="application/rss+xml" />
	<link>http://nicl.net</link>
	<description></description>
	<lastBuildDate>Sat, 15 May 2010 20:51:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Tomcat, Glassfish and EJB &#8230; what a mess!</title>
		<link>http://nicl.net/2008/06/tomcat-glassfish-and-ejb-what-a-mess/</link>
		<comments>http://nicl.net/2008/06/tomcat-glassfish-and-ejb-what-a-mess/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 20:17:07 +0000</pubDate>
		<dc:creator>niclas</dc:creator>
				<category><![CDATA[EJB]]></category>
		<category><![CDATA[Glassfish]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://nicl.net/2008/06/27/tomcat-glassfish-and-ejb-what-a-mess/</guid>
		<description><![CDATA[I was quite busy in the last weeks, we are starting couple of new projects for a long time customer so I had lot's of work to do and very few time for blogging. On the other hand side I have some new topics to blog about, so it was quite a fair deal.
The last [...]]]></description>
			<content:encoded><![CDATA[<p>I was quite busy in the last weeks, we are starting couple of new projects for a long time customer so I had lot's of work to do and very few time for blogging. On the other hand side I have some new topics to blog about, so it was quite a fair deal.</p>
<p>The last days I had some fun trying to access some Glassfish EJB from a Tomcat web container. Some of you will now start to suggest to use only the Glassfish, so that is the whole story: There is a service layer which provides access to services on the different backend systems. This service layer is provided by our customer using the Glassfish J2EE container. Our application is planned to run on a Tomcat 6 web container - which is some kind of work horse in the company.</p>
<p><span id="more-10"></span></p>
<p>I was quite busy in the last weeks, we are starting couple of new projects for a long time customer so I had lot's of work to do and very few time for blogging. On the other hand side I have some new topics to blog about, so it was quite a fair deal.</p>
<p>The last days I had some fun trying to access some Glassfish EJB from a Tomcat web container. Some of you will now start to suggest to use only the Glassfish, so that is the whole story: There is a service layer which provides access to services on the different backend systems. This service layer is provided by our customer using the Glassfish J2EE container. Our application is planned to run on a Tomcat 6 web container - which is some kind of work horse in the company.</p>
<p>I would like to say this is a quit typical setup for EJB usage in the last years (EJB 1.x / EJB 2.x) so I didn't expect any problems. I confess it was quit a time ago I used EJB, but I fooled around with EJB in BEA and JBoss a couple of years ago.</p>
<p>So we started very naive deploying the <code>appserv-rt.jar</code> and the dependencies into <code>WEB-INF/lib</code> directory of our web application automatically with the maven build. It turned out to be a bad idea. The Tomcat kind of started but the web application could not access any JNDI resources.<br />
As a first fix we moved the Glassfish jars to the <code>$TOMCAT_HOME/lib</code> with basically the same result. So where is the glitch?</p>
<p>I decided to take a closer look to the <code>appserv-rt.jar</code> of the glassfish. I first thought this jar contains some kind of client runtime. You may imagine my ... suprise ... when I realized that this jar contains the application server runtime, which is almost the whole application server. At this point I decided to have a break and go home.</p>
<p>Some times the best ideas come, when you are distracted. So this morning under the shower I thougt that I have an idea who the bad guy is. I suspected the <code>jndi.properties</code> in the <code>appserv-rt.jar</code> to confuse the JNDI initialisation of the Tomcat.<br />
The first thing I tried in the office, was to remove the file from the <code>appserv-rt.jar</code> but it didn't work out. So I really stated to wonder. So consulted to web again and found a nice <a href="http://technology.amis.nl/blog/?p=1368">blog entry</a> concerning the topic, the only difference was the Tomcat version (6 vs. 5.5). It proved my theory on one hand but it doesn't work with the Tomcat 6. So I had to compare the two setups and elaborate the key differences.</p>
<p>In the Tomcat 5.5 the Glassfish jar files had to be put into the <code>$TOMCAT_HOME/shared/lib</code> folder. The Tomcat 6 only provides one library folder at <code>$TOMCAT_HOME/lib</code>. A very imporant difference to the classloading behaviuor between the two Tomcat versions. The Tomcat 5.5 classloader hierachy is to load from the tomcat common lib classloader first and use the shared lib classloader "afterwards". In this configuration the classloader which is responsible for loading the Tomcat system classes has a higher priority to the classloader which loads the glassfish classes, so the JNDI startup could be performed by the Tomcat properly.<br />
The Tomcat 6 doesn't seem to have this mechanism an longer, but why are the glassfish classes are preferred? The answer to this question is as simple as it is painflul. The Glassfish libraries are beginning the the letter <code>a</code> (i.e. <code>appserv-rt.jar</code>) the tomcat libraries are starting the the letters <code>c</code> or <code>t</code> so that the glassfish libraries are earlier in the classpath and preffered to the Tomcat libraries.<br />
This insight was the key to solving the problem. I renamed the <code>appserv-rt.jar</code> (and the dependencies) to <code>xappserv-rt.jar</code> and voilá it worked.</p>
<p>Edit: Sometimes later I discovered <a href="http://nicl.net/2008/07/19/tomcat-6x-doing-it-the-right-way/">a better way</a> to combine the Glassfish EJBs and the Tomcat Webcontainer.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicl.net/2008/06/tomcat-glassfish-and-ejb-what-a-mess/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
