<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body link="#355491" alink="#4262a1" vlink="#355491" style="background: #e2e2e2; margin: 0; padding: 20px;">

<div>
        <table cellpadding="0" bgcolor="#FFFFFF" border="0" cellspacing="0" style="border: 1px solid #dadada; margin-bottom: 30px; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                <tbody>
                        <tr>

                                <td>

                                        <table border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" style="border: solid 2px #ccc; background: #dadada; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                                                <tbody>
                                                        <tr>
                                                                <td bgcolor="#000000" valign="middle" height="58px" style="border-bottom: 1px solid #ccc; padding: 20px; -moz-border-radius-topleft: 3px; -moz-border-radius-topright: 3px; -webkit-border-top-right-radius: 5px; -webkit-border-top-left-radius: 5px;">
                                                                        <h1 style="color: #333333; font: bold 22px Arial, Helvetica, sans-serif; margin: 0; display: block !important;">
                                                                        <!-- To have a header image/logo replace the name below with your img tag -->
                                                                        <!-- Email clients will render the images when the message is read so any image -->
                                                                        <!-- must be made available on a public server, so that all recipients can load the image. -->
                                                                        <a href="http://community.jboss.org/index.jspa" style="text-decoration: none; color: #E1E1E1">JBoss Community</a></h1>
                                                                </td>

                                                        </tr>
                                                        <tr>
                                                                <td bgcolor="#FFFFFF" style="font: normal 12px Arial, Helvetica, sans-serif; color:#333333; padding: 20px;  -moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 5px; -webkit-border-bottom-left-radius: 5px;"><h3 style="margin: 10px 0 5px; font-size: 17px; font-weight: normal;">
    Re: Dynamic classloading issue
</h3>
<span style="margin-bottom: 10px;">
    created by <a href="http://community.jboss.org/people/ron.sigal%40jboss.com">Ron Sigal</a> in <i>JBoss Remoting</i> - <a href="http://community.jboss.org/message/563767#563767">View the full discussion</a>
</span>
<hr style="margin: 20px 0; border: none; background-color: #dadada; height: 1px;">

<div class="jive-rendered-content"><blockquote class="jive-quote"><p>v a wrote:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p> But when I tried to load something through InitialContext.lookup the weird exception (see above) occurred.</p></blockquote><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>The JBoss JNDI implementation is completely separate from Remoting.&#160; It is based on RMI and can support remote classloading to some extent.&#160; The MBean "jboss:service=WebService" in $JBOSS_HOME/server/$CONFIG/conf/jboss-service.xml is the special purpose web server that returns classes from the server.&#160; Note, however, that it can't process jars inside of ears.</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><blockquote class="jive-quote"><p>v a wrote:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>However, I still have no idea how to deal with the isolated classloader because the example from the documentation does not work.</p></blockquote><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>I have recently learned that it's not so easy to access classloaders by name in AS 5.&#160; I have a partial solution which involves adding an object that collects references to all classloaders used in the AS and which can be used to inject classloaders into a Remoting connector.&#160; The class is called ClassloaderCatcher:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>/*<br/> * JBoss, Home of Professional Open Source.<br/> * Copyright 2010, Red Hat Middleware LLC, and individual contributors<br/> * as indicated by the @author tags. See the copyright.txt file in the<br/> * distribution for a full listing of individual contributors.<br/>&#160; *<br/> * This is free software; you can redistribute it and/or modify it<br/> * under the terms of the GNU Lesser General Public License as<br/> * published by the Free Software Foundation; either version 2.1 of<br/> * the License, or (at your option) any later version.<br/> *<br/> * This software is distributed in the hope that it will be useful,<br/> * but WITHOUT ANY WARRANTY; without even the implied warranty of<br/> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<br/> * Lesser General Public License for more details.<br/> *<br/> * You should have received a copy of the GNU Lesser General Public<br/> * License along with this software; if not, write to the Free<br/> * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA<br/><span> * 02110-1301 USA, or see the FSF site: </span><a class="jive-link-external-small" href="http://www.fsf.org" target="_blank">http://www.fsf.org</a><span>.</span><br/> */<br/>package org.jboss.deployers.classloadercatcher;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>import java.io.IOException;<br/>import java.io.InputStream;<br/>import java.net.URL;<br/>import java.util.ArrayList;<br/>import java.util.Collections;<br/>import java.util.Enumeration;<br/>import java.util.Map;<br/>import java.util.concurrent.ConcurrentHashMap;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>import org.jboss.deployers.spi.DeploymentException;<br/>import org.jboss.deployers.spi.deployer.helpers.AbstractDeployer;<br/>import org.jboss.deployers.structure.spi.DeploymentUnit;<br/>import org.jboss.logging.Logger;<br/>import org.jboss.metadata.ejb.jboss.JBossMetaData;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>/**<br/> * A ClassLoaderCatcher.<br/> * <br/><span> * @author &lt;a href="</span><a class="jive-link-email-small" href="mailto:ron.sigal@jboss.com" target="_blank">ron.sigal@jboss.com</a><span>"&gt;Ron Sigal&lt;/a&gt;</span><br/> * @version $Revision: 1.1 $<br/> *<br/> * Copyright Aug 9, 2010<br/> */<br/>public class ClassLoaderCatcher extends AbstractDeployer<br/>{</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160; // ------------------------------------------------------------------------------||<br/>&#160;&#160; // Class Members ----------------------------------------------------------------||<br/>&#160;&#160; // ------------------------------------------------------------------------------||</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160; public ClassLoader getClassLoader(String deploymentUnitName) {<br/>&#160;&#160;&#160;&#160;&#160; return new ClassLoaderWrapper(deploymentUnitName);<br/>&#160;&#160; }<br/>&#160;&#160; <br/>&#160;&#160; private static ClassLoader getActualClassLoader(String deploymentUnitName) {<br/>&#160;&#160;&#160;&#160;&#160; return map.get(deploymentUnitName);<br/>&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160;&#160; <br/>//&#160;&#160; public static <br/>&#160;&#160; private static final Logger log = Logger.getLogger(ClassLoaderCatcher.class);<br/>&#160;&#160; private static final Map&lt;String, ClassLoader&gt; map = new ConcurrentHashMap&lt;String, ClassLoader&gt;();<br/>&#160;&#160; <br/>&#160;&#160; // ------------------------------------------------------------------------------||<br/>&#160;&#160; // Instance Members -------------------------------------------------------------||,<br/>&#160;&#160; // ------------------------------------------------------------------------------||</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160; // ------------------------------------------------------------------------------||<br/>&#160;&#160; // Constructor ------------------------------------------------------------------||<br/>&#160;&#160; // ------------------------------------------------------------------------------||</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160; public ClassLoaderCatcher() {<br/>&#160;&#160;&#160;&#160;&#160; log.debug(this + " created");<br/>&#160;&#160; }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160; // ------------------------------------------------------------------------------||<br/>&#160;&#160; // Required Implementations -----------------------------------------------------||<br/>&#160;&#160; // ------------------------------------------------------------------------------||</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160; /**<br/>&#160;&#160;&#160; * {@inheritDoc}<br/>&#160;&#160;&#160; * @see org.jboss.deployers.spi.deployer.Deployer#deploy(org.jboss.deployers.structure.spi.DeploymentUnit)<br/>&#160;&#160;&#160; */<br/>&#160;&#160; public void deploy(final DeploymentUnit unit) throws DeploymentException<br/>&#160;&#160; {<br/>&#160;&#160;&#160;&#160;&#160; log.trace(this + " gets DeploymentUnit: " + unit);<br/>//&#160;&#160;&#160;&#160;&#160; if (!isEjb3Deployment(unit)) {<br/>//&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; log.trace(this + " not an EJB3");<br/>////&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return;<br/>//&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160; <br/>&#160;&#160;&#160;&#160;&#160; log.trace(this + " name: " + unit.getName());<br/>&#160;&#160;&#160;&#160;&#160;&#160; log.trace(this + " topLevel name: " + unit.getTopLevel().getName());<br/>&#160;&#160;&#160;&#160;&#160;&#160; log.trace(this + " topLevel simple name: " + unit.getTopLevel().getSimpleName());<br/>&#160;&#160;&#160;&#160;&#160; log.trace(this + " classloader: " + unit.getTopLevel().getClassLoader());<br/>&#160;&#160;&#160;&#160;&#160; <br/>&#160;&#160;&#160;&#160;&#160;&#160; DeploymentUnit topLevel = unit.getTopLevel();<br/>&#160;&#160;&#160;&#160;&#160; map.put(topLevel.getSimpleName(), topLevel.getClassLoader());<br/>&#160;&#160;&#160;&#160;&#160; log.trace(this + " map: " + map);<br/>&#160;&#160; }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160; // ------------------------------------------------------------------------------||<br/>&#160;&#160; // Helper Methods ---------------------------------------------------------------||<br/>&#160;&#160; // ------------------------------------------------------------------------------||</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160; /*<br/>&#160;&#160;&#160; * These may be overridden for testing purposes<br/>&#160;&#160;&#160; */</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160; /**<br/>&#160;&#160;&#160; * Returns whether this is an EJB3 Deployment, determining if we should take action<br/>&#160;&#160;&#160; * @param unit<br/>&#160;&#160;&#160; * @return<br/>&#160;&#160;&#160; */<br/>&#160;&#160; boolean isEjb3Deployment(final DeploymentUnit unit)<br/>&#160;&#160; {<br/>&#160;&#160;&#160;&#160;&#160; // Obtain the Merged Metadata<br/>&#160;&#160;&#160;&#160;&#160; final JBossMetaData md = unit.getAttachment(JBossMetaData.class);</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160;&#160; // If metadata's not present as an attachment, return<br/>&#160;&#160;&#160;&#160;&#160; if (md == null)<br/>&#160;&#160;&#160;&#160;&#160; {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return false;<br/>&#160;&#160;&#160;&#160;&#160; }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160;&#160; // If this is not an EJB3 Deployment, return<br/>&#160;&#160;&#160;&#160;&#160; if (!md.isEJB3x())<br/>&#160;&#160;&#160;&#160;&#160; {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return false;<br/>&#160;&#160;&#160;&#160;&#160; }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160;&#160; // Meets conditions<br/>&#160;&#160;&#160;&#160;&#160; return true;<br/>&#160;&#160; }<br/>&#160;&#160; <br/>&#160;&#160; static class ClassLoaderWrapper extends ClassLoader {<br/>&#160;&#160;&#160;&#160;&#160; private static Enumeration&lt;URL&gt; emptyEnumeration = Collections.enumeration(new ArrayList&lt;URL&gt;());<br/>&#160;&#160;&#160;&#160;&#160; private String topLevelName;<br/>&#160;&#160;&#160;&#160;&#160; private ClassLoader delegate;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160;&#160; public ClassLoaderWrapper(String topLevelName) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.topLevelName = topLevelName;<br/>&#160;&#160;&#160;&#160;&#160; }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160;&#160;&#160;&#160; public Class&lt;?&gt; loadClass(String name) throws ClassNotFoundException {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; checkClassLoader();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (delegate == null) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; throw new ClassNotFoundException("top level name not found: " + topLevelName);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return delegate.loadClass(name);<br/>&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160; <br/>&#160;&#160;&#160;&#160;&#160; public URL getResource(String name) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; checkClassLoader();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (delegate == null) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return null;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return delegate.getResource(name);<br/>&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160; <br/>&#160;&#160;&#160;&#160;&#160; public Enumeration&lt;URL&gt; getResources(String name) throws IOException {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; checkClassLoader();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (delegate == null) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return emptyEnumeration;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return delegate.getResources(name);<br/>&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160; <br/>&#160;&#160;&#160;&#160;&#160; public InputStream getResourceAsStream(String name) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; checkClassLoader();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (delegate == null) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return null;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return delegate.getResourceAsStream(name);<br/>&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160; <br/>&#160;&#160;&#160;&#160;&#160; public synchronized void setDefaultAssertionStatus(boolean enabled) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; checkClassLoader();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (delegate == null) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; delegate.setDefaultAssertionStatus(enabled);<br/>&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160; <br/>&#160;&#160;&#160;&#160;&#160; public synchronized void setPackageAssertionStatus(String packageName, boolean enabled) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; checkClassLoader();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (delegate == null) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; delegate.setPackageAssertionStatus(packageName, enabled);<br/>&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160; <br/>&#160;&#160;&#160;&#160;&#160; public synchronized void setClassAssertionStatus(String className, boolean enabled) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; checkClassLoader();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (delegate == null) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; delegate.setClassAssertionStatus(className, enabled);<br/>&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160; <br/>&#160;&#160;&#160;&#160;&#160; public synchronized void clearAssertionStatus() {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; checkClassLoader();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (delegate == null) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; delegate.clearAssertionStatus();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br/>&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160; <br/>&#160;&#160;&#160;&#160;&#160; private void checkClassLoader() {<br/>//&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (delegate == null) {<br/>//&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; delegate = TestDeployer.getActualClassLoader(topLevelName);<br/>//&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; delegate = ClassLoaderCatcher.getActualClassLoader(topLevelName);<br/>&#160;&#160;&#160;&#160;&#160; }<br/>&#160;&#160; }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>}</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>It is added to the AS by putting it in a jar and adding the following directory to $JBOSS_HOME/server/$CONFIG/deployers:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>classloader-catcher.deployer</p><p>&#160; classloader-catcher.jar</p><p>&#160; META-INF</p><p>&#160;&#160;&#160; classloader-catcher-jboss-beans.xml</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>where classloader-catcher-jboss-beans.xml is</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br/>&lt;deployment xmlns="urn:jboss:bean-deployer:2.0"&gt;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&#160;&#160; &lt;bean name="classloaderCatcher" class="org.jboss.deployers.classloadercatcher.ClassLoaderCatcher"&gt;<br/>&#160;&#160; &lt;/bean&gt;<br/>&#160;&#160;&#160;&#160;&#160; <br/>&lt;/deployment&gt;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>You then can add the following to $JBOSS_HOME/server/$CONFIG/deploy/ejb3-connectors-jboss-beans.xml:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>&lt;property name="serverParameters"&gt;<br/>&#160;&#160;&#160;&#160;&#160; &lt;map keyClass="java.lang.String" valueClass="java.lang.Object"&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;entry&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;remoteClassLoaders&lt;/key&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;value&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;list elementClass="java.lang.ClassLoader"&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;value-factory bean="classloaderCatcher" method="getClassLoader"&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;parameter&gt;Simple21EJB.ear&lt;/parameter&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/value-factory&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/list&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/value&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/entry&gt;<br/>&#160;&#160;&#160;&#160;&#160; &lt;/map&gt;<br/>&#160;&#160;&#160; &lt;/property&gt;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>where, in this case, Simple21EJB.ear is the ear with the classes I want to load.</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>It's not a foolproof solution, since there's no way to distinguish two distinct classes with the same name, but it's a step in the right direction.</p></div>

<div style="background-color: #f4f4f4; padding: 10px; margin-top: 20px;">
    <p style="margin: 0;">Reply to this message by <a href="http://community.jboss.org/message/563767#563767">going to Community</a></p>
        <p style="margin: 0;">Start a new discussion in JBoss Remoting at <a href="http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2050">Community</a></p>
</div></td>
                        </tr>
                    </tbody>
                </table>


                </td>
            </tr>
        </tbody>
    </table>

</div>

</body>
</html>