You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2006/11/14 13:29:44 UTC

svn commit: r474765 - in /incubator/openejb/trunk/openejb3: container/openejb-core/src/main/java/org/apache/openejb/alt/config/ container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/ container/openejb-core/src/main/java/or...

Author: dblevins
Date: Tue Nov 14 04:29:43 2006
New Revision: 474765

URL: http://svn.apache.org/viewvc?view=rev&rev=474765
Log:
reworked deployment again. uses revised ResourceFinder, pulls in all libs from APP-INF/lib or META-INF/lib.  hack for castor to allow for beans in different classloaders

Added:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AppModule.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java
Modified:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ClientModule.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ConfigurationFactory.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/DeploymentLoader.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/EjbJarInfoBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCMP11_EntityContainer.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/JDOManagerBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainerSystemInfo.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainersBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/util/resources/Messages.properties
    incubator/openejb/trunk/openejb3/itests/openejb-itests-app/pom.xml

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AppModule.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AppModule.java?view=auto&rev=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AppModule.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AppModule.java Tue Nov 14 04:29:43 2006
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.alt.config;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.net.URL;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class AppModule implements DeploymentModule {
+    private final List<URL> additionalLibraries = new ArrayList();
+    private final List<ClientModule> clientModules = new ArrayList();
+    private final List<EjbModule> ejbModules = new ArrayList();
+    private final String jarLocation;
+    private final ClassLoader classLoader;
+
+    public AppModule(ClassLoader classLoader, String jarLocation) {
+        this.classLoader = classLoader;
+        this.jarLocation = jarLocation;
+    }
+
+    public ClassLoader getClassLoader() {
+        return classLoader;
+    }
+
+    public List<ClientModule> getClientModules() {
+        return clientModules;
+    }
+
+    public List<EjbModule> getEjbModules() {
+        return ejbModules;
+    }
+
+    public String getJarLocation() {
+        return jarLocation;
+    }
+
+    public List<URL> getAdditionalLibraries() {
+        return additionalLibraries;
+    }
+}

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ClientModule.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ClientModule.java?view=diff&rev=474765&r1=474764&r2=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ClientModule.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ClientModule.java Tue Nov 14 04:29:43 2006
@@ -18,6 +18,9 @@
 
 import org.apache.openejb.jee.ApplicationClient;
 
+import java.util.List;
+import java.util.ArrayList;
+
 /**
  * @version $Rev$ $Date$
  */
@@ -49,4 +52,5 @@
     public String getMainClass() {
         return mainClass;
     }
+
 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ConfigurationFactory.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ConfigurationFactory.java?view=diff&rev=474765&r1=474764&r2=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ConfigurationFactory.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ConfigurationFactory.java Tue Nov 14 04:29:43 2006
@@ -54,6 +54,7 @@
 import org.apache.openejb.assembler.classic.TransactionServiceInfo;
 import org.apache.openejb.assembler.classic.JndiEncInfo;
 import org.apache.openejb.assembler.classic.ClientInfo;
+import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.Messages;
 
@@ -65,6 +66,7 @@
 import java.util.Properties;
 import java.util.Vector;
 import java.io.File;
+import java.net.URL;
 
 public class ConfigurationFactory implements OpenEjbConfigurationFactory, ProviderDefaults {
 
@@ -166,60 +168,96 @@
         sys.containerSystem.statefulContainers = sfsbContainers;
         sys.containerSystem.statelessContainers = slsbContainers;
 
-        ArrayList<EnterpriseBeanInfo> ejbs = new ArrayList();
-        ArrayList<EjbJarInfo> ejbJars = new ArrayList();
+        List<AppInfo> appInfos = new ArrayList();
+        {
+            ArrayList<EjbJarInfo> ejbJars = new ArrayList();
 
-        for (DeploymentModule jar : jars) {
-            if (!(jar instanceof EjbModule)) {
-                continue;
-            }
-            EjbModule ejbModule = (EjbModule) jar;
-            try {
-                EjbJarInfo ejbJarInfo = ejbJarInfoBuilder.buildInfo(ejbModule);
-                if (ejbJarInfo == null) {
+            for (DeploymentModule jar : jars) {
+                if (!(jar instanceof EjbModule)) {
                     continue;
                 }
-                assignBeansToContainers(ejbJarInfo.enterpriseBeans, ejbModule.getOpenejbJar().getDeploymentsByEjbName());
-                ejbJars.add(ejbJarInfo);
-                ejbs.addAll(Arrays.asList(ejbJarInfo.enterpriseBeans));
-            } catch (Exception e) {
-                e.printStackTrace();
-                ConfigUtils.logger.i18n.warning("conf.0004", ejbModule.getJarURI(), e.getMessage());
+                EjbModule ejbModule = (EjbModule) jar;
+                try {
+                    EjbJarInfo ejbJarInfo = ejbJarInfoBuilder.buildInfo(ejbModule);
+                    if (ejbJarInfo == null) {
+                        continue;
+                    }
+                    assignBeansToContainers(ejbJarInfo.enterpriseBeans, ejbModule.getOpenejbJar().getDeploymentsByEjbName());
+                    ejbJars.add(ejbJarInfo);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    ConfigUtils.logger.i18n.warning("conf.0004", ejbModule.getJarURI(), e.getMessage());
+                }
             }
-        }
 
-        sys.containerSystem.enterpriseBeans = ejbs.toArray(new EnterpriseBeanInfo[]{});
-        sys.containerSystem.ejbJars = ejbJars.toArray(new EjbJarInfo[]{});
+            AppInfo appInfo = new AppInfo();
+            appInfo.clients = new ClientInfo[]{};
+            appInfo.libs = new String[]{};
+            appInfo.ejbJars = ejbJars.toArray(new EjbJarInfo[]{});
+            appInfos.add(appInfo);
+        }
 
-        List<ClientInfo> clientInfos = new ArrayList();
         for (DeploymentModule module : jars) {
-            if (!(module instanceof ClientModule)) {
+            if (!(module instanceof AppModule)) {
                 continue;
             }
-            ClientModule clientModule = (ClientModule) module;
+            AppModule appModule = (AppModule) module;
 
-            Map<String, EnterpriseBeanInfo> infos = new HashMap();
-            for (EjbJarInfo ejbJarInfo : ejbJars) {
-                for (EnterpriseBeanInfo beanInfo : ejbJarInfo.enterpriseBeans) {
-                    infos.put(beanInfo.ejbName, beanInfo);
+            ArrayList<EjbJarInfo> ejbJars = new ArrayList();
+            for (EjbModule ejbModule : appModule.getEjbModules()) {
+                try {
+                    EjbJarInfo ejbJarInfo = ejbJarInfoBuilder.buildInfo(ejbModule);
+                    if (ejbJarInfo == null) {
+                        continue;
+                    }
+                    assignBeansToContainers(ejbJarInfo.enterpriseBeans, ejbModule.getOpenejbJar().getDeploymentsByEjbName());
+                    ejbJars.add(ejbJarInfo);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    ConfigUtils.logger.i18n.warning("conf.0004", ejbModule.getJarURI(), e.getMessage());
                 }
             }
 
-            ApplicationClient applicationClient = clientModule.getApplicationClient();
-            ClientInfo clientInfo = new ClientInfo();
-            clientInfo.description = applicationClient.getDescription();
-            clientInfo.displayName = applicationClient.getDisplayName();
-            clientInfo.codebase = clientModule.getJarLocation();
-            clientInfo.mainClass = applicationClient.getMainClass();
-            clientInfo.moduleId = getClientModuleId(clientModule);
-
-            JndiEncInfoBuilder jndiEncInfoBuilder = new JndiEncInfoBuilder(infos);
-            JndiEncInfo jndiEncInfo = jndiEncInfoBuilder.build(applicationClient, clientModule.getJarLocation());
-            clientInfo.jndiEnc = jndiEncInfo;
-            clientInfos.add(clientInfo);
+            List<ClientInfo> clientInfos = new ArrayList();
+            for (ClientModule clientModule : appModule.getClientModules()) {
+                Map<String, EnterpriseBeanInfo> infos = new HashMap();
+                for (EjbJarInfo ejbJarInfo : ejbJars) {
+                    for (EnterpriseBeanInfo beanInfo : ejbJarInfo.enterpriseBeans) {
+                        infos.put(beanInfo.ejbName, beanInfo);
+                    }
+                }
+
+                ApplicationClient applicationClient = clientModule.getApplicationClient();
+                ClientInfo clientInfo = new ClientInfo();
+                clientInfo.description = applicationClient.getDescription();
+                clientInfo.displayName = applicationClient.getDisplayName();
+                clientInfo.codebase = clientModule.getJarLocation();
+                clientInfo.mainClass = applicationClient.getMainClass();
+                clientInfo.moduleId = getClientModuleId(clientModule);
+
+                JndiEncInfoBuilder jndiEncInfoBuilder = new JndiEncInfoBuilder(infos);
+                JndiEncInfo jndiEncInfo = jndiEncInfoBuilder.build(applicationClient, clientModule.getJarLocation());
+                clientInfo.jndiEnc = jndiEncInfo;
+                clientInfos.add(clientInfo);
+            }
+
+            AppInfo appInfo = new AppInfo();
+            appInfo.clients = clientInfos.toArray(new ClientInfo[]{});
+            appInfo.ejbJars = ejbJars.toArray(new EjbJarInfo[]{});
+            appInfo.jarPath = appModule.getJarLocation();
+            List<URL> additionalLibraries = appModule.getAdditionalLibraries();
+            List<String> libs = new ArrayList();
+            for (URL url : additionalLibraries) {
+                File file = new File(url.getPath());
+                libs.add(file.getAbsolutePath());
+            }
+            appInfo.libs = libs.toArray(new String[]{});
+            appInfos.add(appInfo);
         }
 
-        sys.containerSystem.clients = clientInfos.toArray(new ClientInfo[]{});
+        sys.containerSystem.applications = appInfos.toArray(new AppInfo[]{});
+
+        sys.containerSystem.clients = new ClientInfo[]{};
 
         SecurityRoleInfo defaultRole = new SecurityRoleInfo();
         defaultRole.description = "The role applied to recurity references that are not linked.";

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/DeploymentLoader.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/DeploymentLoader.java?view=diff&rev=474765&r1=474764&r2=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/DeploymentLoader.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/DeploymentLoader.java Tue Nov 14 04:29:43 2006
@@ -19,13 +19,19 @@
 
 import org.apache.openejb.OpenEJB;
 import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.alt.config.ejb.OpenejbJar;
 import org.apache.openejb.alt.config.ejb.EjbDeployment;
+import org.apache.openejb.alt.config.ejb.OpenejbJar;
 import org.apache.openejb.alt.config.sys.Deployments;
-import org.apache.openejb.jee.*;
+import org.apache.openejb.jee.Application;
+import org.apache.openejb.jee.ApplicationClient;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.EnterpriseBean;
+import org.apache.openejb.jee.Module;
+import org.apache.openejb.jee.RemoteBean;
 import org.apache.openejb.loader.FileUtils;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.Logger;
+import org.apache.xbean.finder.ResourceFinder;
 
 import java.io.BufferedOutputStream;
 import java.io.File;
@@ -41,9 +47,9 @@
 import java.nio.channels.FileChannel;
 import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.HashMap;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 
@@ -210,23 +216,29 @@
 
             String pathname = jarsToLoad[i];
 
-            logger.debug("Beginning load: "+pathname);
+            logger.debug("Beginning load: " + pathname);
 
             File jarFile = new File(pathname);
 
             try {
 
+
                 ClassLoader classLoader = getClassLoader(jarFile);
 
                 URL baseUrl = getFileUrl(jarFile);
 
-                URL appXml = getResource(baseUrl, classLoader, "META-INF/application.xml");
+                ResourceFinder finder = new ResourceFinder("", classLoader, baseUrl);
 
-                if (appXml == null){
-                    logger.debug("No \"META-INF/application.xml\" found.");
+                Map<String, URL> descriptors = null;
+                try {
+                    descriptors = finder.getResourcesMap("META-INF");
+                } catch (IOException e) {
+                    throw new OpenEJBException("Unable to determine descriptors in jar: " + baseUrl.toExternalForm(), e);
                 }
 
-                if (appXml != null) {
+                if (descriptors.containsKey("application.xml")) {
+
+                    URL appXml = descriptors.get("application.xml");
 
                     jarFile = unpack(appXml, jarFile);
 
@@ -234,75 +246,116 @@
 
                     classLoader = new URLClassLoader(new URL[]{baseUrl}, OpenEJB.class.getClassLoader());
 
+                    finder = new ResourceFinder("", classLoader, baseUrl);
+
                     try {
+                        descriptors = finder.getResourcesMap("META-INF");
+                    } catch (IOException e) {
+                        throw new OpenEJBException("Unable to determine descriptors in jar: " + baseUrl.toExternalForm(), e);
+                    }
 
-                        Application application = unmarshal(Application.class, "META-INF/application.xml", classLoader, baseUrl);
-                        
-                        String[] files = jarFile.list(new FilenameFilter() {
-                            public boolean accept(File dir, String name) {
-                                return name.endsWith(".jar") || name.endsWith(".zip");
-                            }
-                        });
+                    try {
 
-                        List<URL> appUrls = new ArrayList();
-                        for (String fileName : files) {
-                            File lib = new File(jarFile, fileName);
-                            try {
-                                appUrls.add(lib.toURL());
-                            } catch (MalformedURLException e) {
-                                logger.error("Bad resource in classpath.  Unable to search for entries. ", e);
-                            }
+                        URL applicationXmlUrl = descriptors.get("application.xml");
+
+                        if (applicationXmlUrl == null) {
+                            throw new OpenEJBException("META-INF/application.xml" + " not found.");
                         }
 
-                        ClassLoader appClassLoader = new URLClassLoader(appUrls.toArray(new URL[]{}), OpenEJB.class.getClassLoader());
+                        Application application = unmarshal(Application.class, "META-INF/application.xml", applicationXmlUrl);
 
-                        for (Module module : application.getModule()) {
-                            if (module.getEjb() != null) {
-                                try {
-                                    URL ejbUrl = new File(jarFile, module.getEjb()).toURL();
 
-                                    EjbJar ejbJar = unmarshal(EjbJar.class, "META-INF/ejb-jar.xml", appClassLoader, ejbUrl);
+                        List<URL> extraLibs = new ArrayList();
+
+                        try {
+                            Map<String, URL> libs = finder.getResourcesMap("APP-INF/lib/");
+                            extraLibs.addAll(libs.values());
+                        } catch (IOException e) {
+                            logger.warning("Cannot load libs from 'APP-INF/lib/' : " + e.getMessage(), e);
+                        }
+
+                        try {
+                            Map<String, URL> libs = finder.getResourcesMap("META-INF/lib/");
+                            extraLibs.addAll(libs.values());
+                        } catch (IOException e) {
+                            logger.warning("Cannot load libs from 'META-INF/lib/' : " + e.getMessage(), e);
+                        }
+
+                        Map<String,URL> ejbModules = new HashMap();
+                        Map<String,URL> clientModules = new HashMap();
+                        for (Module module : application.getModule()) {
+                            try {
+                                if (module.getEjb() != null) {
+                                    URL url = finder.find(module.getEjb());
+                                    ejbModules.put(module.getEjb(), url);
+                                } else if (module.getJava() != null) {
+                                    URL url = finder.find(module.getJava());
+                                    clientModules.put(module.getConnector(), url);
+                                }
+                            } catch (IOException e) {
+                                throw new OpenEJBException("Invalid path to module " + e.getMessage(), e);
+                            }
+                        }
 
-                                    OpenejbJar openejbJar = null;
+                        List<URL> classPath = new ArrayList();
+                        classPath.addAll(ejbModules.values());
+                        classPath.addAll(clientModules.values());
+                        classPath.addAll(extraLibs);
+                        ClassLoader appClassLoader = new URLClassLoader(classPath.toArray(new URL[]{}), OpenEJB.class.getClassLoader());
 
-                                    URL openejbjarUrl = getResource(ejbUrl, appClassLoader, "META-INF/openejb-jar.xml");
 
-                                    if (openejbjarUrl != null) {
+                        AppModule appModule = new AppModule(appClassLoader, jarFile.getAbsolutePath());
+                        appModule.getAdditionalLibraries().addAll(extraLibs);
+
+                        for (String moduleName : ejbModules.keySet()) {
+                            URL ejbUrl = ejbModules.get(moduleName);
+                            File ejbFile = new File(ejbUrl.getPath());
+                            try {
+                                ResourceFinder ejbFinder = new ResourceFinder(ejbUrl);
 
-                                        openejbJar = unmarshal(OpenejbJar.class, "META-INF/openejb-jar.xml", appClassLoader, ejbUrl);
+                                Map<String, URL> ejbDescriptors = null;
+                                try {
+                                    ejbDescriptors = ejbFinder.getResourcesMap("META-INF/");
+                                } catch (IOException e) {
+                                    throw new OpenEJBException("Unable to determine descriptors in jar.", e);
+                                }
 
-                                    }
+                                if (!ejbDescriptors.containsKey("ejb-jar.xml")) {
+                                    throw new OpenEJBException("META-INF/ejb-jar.xml not found.");
+                                }
 
-                                    String jarPath = new File(ejbUrl.getFile()).getAbsolutePath();
+                                EjbJar ejbJar = unmarshal(EjbJar.class, "META-INF/ejb-jar.xml", ejbDescriptors.get("ejb-jar.xml"));
 
-                                    EjbModule ejbModule = new EjbModule(appClassLoader, jarPath, ejbJar, openejbJar);
+                                OpenejbJar openejbJar = null;
 
-                                    deployedJars.add(ejbModule);
-                                    
-                                } catch (OpenEJBException e) {
-                                    logger.error("Unable to load EJBs from EAR: " + jarFile.getAbsolutePath() + ", module: " + module.getEjb() + ". Exception: " + e.getMessage(), e);
-                                } catch (MalformedURLException e) {
-                                    logger.error("Bad resource in classpath.  Unable to search for entries. ", e);
+                                if (ejbDescriptors.containsKey("openejb-jar.xml")) {
+                                    openejbJar = unmarshal(OpenejbJar.class, "META-INF/openejb-jar.xml", ejbDescriptors.get("openejb-jar.xml"));
                                 }
-                            } else if (module.getJava() != null) {
-                                try {
-                                    URL clientUrl = new File(jarFile, module.getJava()).toURL();
 
-                                    ApplicationClient applicationClient = unmarshal(ApplicationClient.class, "META-INF/application-client.xml", appClassLoader, clientUrl);
+                                EjbModule ejbModule = new EjbModule(appClassLoader, ejbFile.getAbsolutePath(), ejbJar, openejbJar);
+                                appModule.getEjbModules().add(ejbModule);
+                            } catch (OpenEJBException e) {
+                                logger.error("Unable to load EJBs from EAR: " + jarFile.getAbsolutePath() + ", module: " + moduleName + ". Exception: " + e.getMessage(), e);
+                            }
+                        }
+                        for (String moduleName : clientModules.keySet()) {
+                            URL clientUrl = clientModules.get(moduleName);
+                            File clientFile = new File(clientUrl.getPath());
+                            try {
+                                ResourceFinder clientFinder = new ResourceFinder(clientUrl);
 
-                                    String jarPath = new File(clientUrl.getFile()).getAbsolutePath();
+                                URL appClientXmlUrl = clientFinder.find("META-INF/application-client.xml");
 
-                                    ClientModule clientModule = new ClientModule(applicationClient, appClassLoader, jarPath, null);
+                                ApplicationClient applicationClient = unmarshal(ApplicationClient.class, "META-INF/application-client.xml", appClientXmlUrl);
 
-                                    deployedJars.add(clientModule);
+                                ClientModule clientModule = new ClientModule(applicationClient, appClassLoader, clientFile.getAbsolutePath(), null);
 
-                                } catch (OpenEJBException e) {
-                                    logger.error("Unable to load App Client from EAR: " + jarFile.getAbsolutePath() + ", module: " + module.getJava() + ". Exception: " + e.getMessage(), e);
-                                } catch (MalformedURLException e) {
-                                    logger.error("Bad resource in classpath.  Unable to search for entries. ", e);
-                                }
+                                appModule.getClientModules().add(clientModule);
+                            } catch (Exception e) {
+                                logger.error("Unable to load App Client from EAR: " + jarFile.getAbsolutePath() + ", module: " + moduleName + ". Exception: " + e.getMessage(), e);
                             }
                         }
+                        deployedJars.add(appModule);
                     } catch (OpenEJBException e) {
                         logger.error("Unable to load EAR: " + appXml.toExternalForm(), e);
                     }
@@ -335,7 +388,7 @@
         for (EnterpriseBean b : enterpriseBeans) {
             count++;
 
-            System.out.println("<!-- " + b.getEjbName() +" -->");
+            System.out.println("<!-- " + b.getEjbName() + " -->");
 
             if (!(b instanceof RemoteBean)) {
                 continue;
@@ -352,14 +405,14 @@
             EjbDeployment deployment = deployments.get(bean.getEjbName());
             String deploymentId = deployment.getDeploymentId();
 
-            if (bean.getHome() != null){
+            if (bean.getHome() != null) {
                 StringBuilder sb = new StringBuilder();
                 sb.append("  <ejb-ref>\n");
-                sb.append("    <ejb-ref-name>"+deploymentId +"</ejb-ref-name>\n");
-                sb.append("    <ejb-ref-type>"+beanType+"</ejb-ref-type>\n");
-                sb.append("    <home>"+bean.getHome() +"</home>\n");
-                sb.append("    <remote>"+bean.getRemote()+"</remote>\n");
-                sb.append("    <ejb-link>"+bean.getEjbName()+"</ejb-link>\n");
+                sb.append("    <ejb-ref-name>" + deploymentId + "</ejb-ref-name>\n");
+                sb.append("    <ejb-ref-type>" + beanType + "</ejb-ref-type>\n");
+                sb.append("    <home>" + bean.getHome() + "</home>\n");
+                sb.append("    <remote>" + bean.getRemote() + "</remote>\n");
+                sb.append("    <ejb-link>" + bean.getEjbName() + "</ejb-link>\n");
                 sb.append("  </ejb-ref>");
                 System.out.println(sb.toString());
             }
@@ -367,32 +420,22 @@
             if (!(bean instanceof org.apache.openejb.jee.SessionBean)) {
                 continue;
             }
-            org.apache.openejb.jee.SessionBean sbean =  (org.apache.openejb.jee.SessionBean) bean;
+            org.apache.openejb.jee.SessionBean sbean = (org.apache.openejb.jee.SessionBean) bean;
 
-            if (sbean.getBusinessRemote() != null){
+            if (sbean.getBusinessRemote() != null) {
                 StringBuilder sb = new StringBuilder();
                 sb.append("  <ejb-ref>\n");
-                sb.append("    <ejb-ref-name>"+deploymentId +"BusinessRemote</ejb-ref-name>\n");
-                sb.append("    <ejb-ref-type>"+beanType+"</ejb-ref-type>\n");
-                sb.append("    <remote>"+sbean.getBusinessRemote()+"</remote>\n");
-                sb.append("    <ejb-link>"+sbean.getEjbName()+"</ejb-link>\n");
+                sb.append("    <ejb-ref-name>" + deploymentId + "BusinessRemote</ejb-ref-name>\n");
+                sb.append("    <ejb-ref-type>" + beanType + "</ejb-ref-type>\n");
+                sb.append("    <remote>" + sbean.getBusinessRemote() + "</remote>\n");
+                sb.append("    <ejb-link>" + sbean.getEjbName() + "</ejb-link>\n");
                 sb.append("  </ejb-ref>");
                 System.out.println(sb.toString());
             }
         }
     }
 
-    private final Map<Class,JaxbUnmarshaller> unmarshallers = new HashMap();
-
-    private <T> T unmarshal(Class<T> type, String descriptor, ClassLoader classLoader, URL jarUrl) throws OpenEJBException {
-        URL descriptorUrl = getResource(jarUrl, classLoader, descriptor);
-
-        if (descriptorUrl == null) {
-            throw new OpenEJBException(descriptor + " not found.");
-        }
-
-        return unmarshal(type, descriptor, descriptorUrl);
-    }
+    private final Map<Class, JaxbUnmarshaller> unmarshallers = new HashMap();
 
     private <T>T unmarshal(Class<T> type, String descriptor, URL descriptorUrl) throws OpenEJBException {
         JaxbUnmarshaller unmarshaller = unmarshallers.get(type);
@@ -437,14 +480,14 @@
     private ClassLoader getClassLoader(File jarFile) throws OpenEJBException {
         ClassLoader classLoader;
 //        if (jarFile.isDirectory()) {
-            try {
-                URL[] urls = new URL[]{jarFile.toURL()};
-                classLoader = new URLClassLoader(urls, OpenEJB.class.getClassLoader());
-                //                        classLoader = new URLClassLoader(urls, this.getClass().getClassLoader());
-                return classLoader;
-            } catch (MalformedURLException e) {
-                throw new OpenEJBException(ConfigurationFactory.messages.format("cl0001", jarFile.getAbsolutePath(), e.getMessage()));
-            }
+        try {
+            URL[] urls = new URL[]{jarFile.toURL()};
+            classLoader = new URLClassLoader(urls, OpenEJB.class.getClassLoader());
+            //                        classLoader = new URLClassLoader(urls, this.getClass().getClassLoader());
+            return classLoader;
+        } catch (MalformedURLException e) {
+            throw new OpenEJBException(ConfigurationFactory.messages.format("cl0001", jarFile.getAbsolutePath(), e.getMessage()));
+        }
 //        } else {
 //            TempCodebase tempCodebase = new TempCodebase(jarFile.getAbsolutePath());
 //            classLoader = tempCodebase.getClassLoader();

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/EjbJarInfoBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/EjbJarInfoBuilder.java?view=diff&rev=474765&r1=474764&r2=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/EjbJarInfoBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/EjbJarInfoBuilder.java Tue Nov 14 04:29:43 2006
@@ -133,7 +133,7 @@
             try {
                 File jarFile = new File(jar.getJarURI());
 
-                SystemInstance.get().getClassPath().addJarToPath(jarFile.toURL());
+//                SystemInstance.get().getClassPath().addJarToPath(jarFile.toURL());
             } catch (Exception e) {
                 e.printStackTrace();
             }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCMP11_EntityContainer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCMP11_EntityContainer.java?view=diff&rev=474765&r1=474764&r2=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCMP11_EntityContainer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/CastorCMP11_EntityContainer.java Tue Nov 14 04:29:43 2006
@@ -64,6 +64,7 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Enumeration;
+import java.util.List;
 import java.net.URL;
 import java.net.MalformedURLException;
 
@@ -232,7 +233,7 @@
 
 
         try {
-            JDOManagerBuilder jdoManagerBuilder = new JDOManagerBuilder(engine, transactionManagerJndiName);
+            JDOManagerBuilder jdoManagerBuilder = new JDOManagerBuilder(engine, transactionManagerJndiName, new JoinedClassLoader(deploys));
 //            File mappingFile = new File("/Users/dblevins/work/openejb3/container/openejb-core/target/test-classes/conf/default.cmp_mapping.xml");
 
             Collection<URL> urls = mappings.values();
@@ -258,6 +259,24 @@
         buildResetMap();
     }
 
+    public static class JoinedClassLoader extends ClassLoader {
+        private final DeploymentInfo[] deploymentInfos;
+
+        public JoinedClassLoader(DeploymentInfo[] deploymentInfos) {
+            this.deploymentInfos = deploymentInfos;
+        }
+
+        protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
+            for (DeploymentInfo info : deploymentInfos) {
+                try {
+                    ClassLoader classLoader = info.getBeanClass().getClassLoader();
+                    return classLoader.loadClass(name);
+                } catch (ClassNotFoundException keepTrying) {
+                }
+            }
+            throw new ClassNotFoundException(name);
+        }
+    }
     private TransactionManager getTransactionManager() {
         return transactionManager;
     }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/JDOManagerBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/JDOManagerBuilder.java?view=diff&rev=474765&r1=474764&r2=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/JDOManagerBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/containers/castor_cmp11/JDOManagerBuilder.java Tue Nov 14 04:29:43 2006
@@ -57,10 +57,12 @@
     private final String engine;
     private final String transactionManagerJndiName;
     private final List<Mapping> mappings = new ArrayList<Mapping>();
+    private ClassLoader classLoader;
 
-    public JDOManagerBuilder(String engine, String transactionManagerJndiName) {
+    public JDOManagerBuilder(String engine, String transactionManagerJndiName, ClassLoader classLoader) {
         this.engine = engine;
         this.transactionManagerJndiName = transactionManagerJndiName;
+        this.classLoader = classLoader;
     }
 
     public void addMapping(URL location){
@@ -125,7 +127,7 @@
         transactionDemarcation.setTransactionManager(transactionManager);
         jdoConf.setTransactionDemarcation(transactionDemarcation);
 
-        JDOManager.loadConfiguration(jdoConf);
+        JDOManager.loadConfiguration(jdoConf, null, classLoader);
 
         // Construct a new JDOManager for the database
         return JDOManager.createInstance(database.getName());
@@ -204,7 +206,7 @@
 
         jdoConf.setTransactionDemarcation(transactionDemarcation);
 
-        JDOManager.loadConfiguration(jdoConf);
+        JDOManager.loadConfiguration(jdoConf, null, classLoader);
 
         // Construct a new JDOManager for the database
         return JDOManager.createInstance(database.getName());

Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java?view=auto&rev=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java Tue Nov 14 04:29:43 2006
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.assembler.classic;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class AppInfo extends InfoObject {
+    public String jarPath;
+    public ClientInfo[] clients;
+    public EjbJarInfo[] ejbJars;
+    public String[] libs;
+}

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?view=diff&rev=474765&r1=474764&r2=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Tue Nov 14 04:29:43 2006
@@ -19,6 +19,7 @@
 import org.apache.openejb.EnvProps;
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.Container;
+import org.apache.openejb.DeploymentInfo;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.core.ConnectorReference;
 import org.apache.openejb.core.CoreDeploymentInfo;
@@ -36,9 +37,12 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Properties;
 import java.util.List;
+import java.net.URL;
+import java.net.MalformedURLException;
+import java.net.URLClassLoader;
+import java.io.File;
 
 public class Assembler extends AssemblerTool implements org.apache.openejb.spi.Assembler {
 
@@ -224,9 +228,33 @@
 
         JndiBuilder jndiBuilder = new JndiBuilder(containerSystem.getJNDIContext());
 
-        /*[4] Apply method permissions, role refs, and tx attributes ////////////////////////////////////*/
+        HashMap<String, DeploymentInfo> deployments2 = new HashMap();
+        for (AppInfo appInfo : containerSystemInfo.applications) {
+            List<URL> jars = new ArrayList();
+            for (EjbJarInfo info : appInfo.ejbJars) jars.add(toUrl(info.jarPath));
+            for (ClientInfo info : appInfo.clients) jars.add(toUrl(info.codebase));
+            for (String jarPath : appInfo.libs) jars.add(toUrl(jarPath));
+
+            ClassLoader classLoader = new URLClassLoader(jars.toArray(new URL[]{}), org.apache.openejb.OpenEJB.class.getClassLoader());
+
+            EjbJarBuilder ejbJarBuilder = new EjbJarBuilder(classLoader);
+
+            for (EjbJarInfo ejbJar : appInfo.ejbJars) {
+                deployments2.putAll(ejbJarBuilder.build(ejbJar));
+            }
+
+            for (ClientInfo clientInfo : appInfo.clients) {
+                JndiEncBuilder jndiEncBuilder = new JndiEncBuilder(clientInfo.jndiEnc);
+                Context context = jndiEncBuilder.build();
+                containerSystem.getJNDIContext().bind("java:openejb/client/"+clientInfo.moduleId+"/path", clientInfo.codebase);
+                containerSystem.getJNDIContext().bind("java:openejb/client/"+clientInfo.moduleId+"/mainClass", clientInfo.mainClass);
+                containerSystem.getJNDIContext().bind("java:openejb/client/"+clientInfo.moduleId+"/enc", context);
+            }
+        }
+
+
         ContainersBuilder containersBuilder = new ContainersBuilder(containerSystemInfo, ((AssemblerTool)this).props);
-        List containers = (List) containersBuilder.build();
+        List containers = (List) containersBuilder.buildContainers(deployments2);
         for (int i1 = 0; i1 < containers.size(); i1++) {
             Container container1 = (Container) containers.get(i1);
             containerSystem.addContainer(container1.getContainerID(), container1);
@@ -238,15 +266,6 @@
             }
         }
 
-        ClientInfo[] clients = containerSystemInfo.clients;
-        for (ClientInfo clientInfo : clients) {
-            JndiEncBuilder jndiEncBuilder = new JndiEncBuilder(clientInfo.jndiEnc);
-            Context context = jndiEncBuilder.build();
-            containerSystem.getJNDIContext().bind("java:openejb/client/"+clientInfo.moduleId+"/path", clientInfo.codebase);
-            containerSystem.getJNDIContext().bind("java:openejb/client/"+clientInfo.moduleId+"/mainClass", clientInfo.mainClass);
-            containerSystem.getJNDIContext().bind("java:openejb/client/"+clientInfo.moduleId+"/enc", context);
-        }
-
         // roleMapping used later in buildMethodPermissions
         AssemblerTool.RoleMapping roleMapping = new AssemblerTool.RoleMapping(configInfo.facilities.securityService.roleMappings);
         org.apache.openejb.DeploymentInfo [] deployments = containerSystem.deployments();
@@ -275,6 +294,14 @@
         }
 
         return containerSystem;
+    }
+
+    private URL toUrl(String jarPath) throws OpenEJBException {
+        try {
+            return new File(jarPath).toURL();
+        } catch (MalformedURLException e) {
+            throw new OpenEJBException(messages.format("cl0001", jarPath, e.getMessage()));
+        }
     }
 
     private void createSecurityService(OpenEjbConfiguration configInfo) throws Exception {

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainerSystemInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainerSystemInfo.java?view=diff&rev=474765&r1=474764&r2=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainerSystemInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainerSystemInfo.java Tue Nov 14 04:29:43 2006
@@ -19,8 +19,9 @@
 public class ContainerSystemInfo extends InfoObject {
 
     public ContainerInfo[] containers;
-    public EnterpriseBeanInfo[] enterpriseBeans;
-    public ClientInfo[] clients; 
+//    public EnterpriseBeanInfo[] enterpriseBeans;
+    public AppInfo[] applications; 
+    public ClientInfo[] clients;
     public EjbJarInfo[] ejbJars;
 
     public EntityContainerInfo[] entityContainers;

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainersBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainersBuilder.java?view=diff&rev=474765&r1=474764&r2=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainersBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainersBuilder.java Tue Nov 14 04:29:43 2006
@@ -48,39 +48,18 @@
     private static final Logger logger = Logger.getInstance("OpenEJB", "org.apache.openejb.util.resources");
 
     private final Properties props;
-    private final EjbJarInfo[] ejbJars;
     private final ContainerInfo[] containerInfos;
     private final String[] decorators;
 
     public ContainersBuilder(ContainerSystemInfo containerSystemInfo, Properties props) {
         this.props = props;
-        this.ejbJars = containerSystemInfo.ejbJars;
         this.containerInfos = containerSystemInfo.containers;
         String decorators = props.getProperty("openejb.container.decorators");
         this.decorators = (decorators == null) ? new String[]{} : decorators.split(":");
 
     }
 
-    public Object build() throws OpenEJBException {
-        URL[] jars = new URL[this.ejbJars.length];
-        for (int i = 0; i < this.ejbJars.length; i++) {
-            try {
-                jars[i] = new File(this.ejbJars[i].jarPath).toURL();
-            } catch (MalformedURLException e) {
-                throw new OpenEJBException(AssemblerTool.messages.format("cl0001", ejbJars[i].jarPath, e.getMessage()));
-            }
-        }
-
-        ClassLoader classLoader = new URLClassLoader(jars, org.apache.openejb.OpenEJB.class.getClassLoader());
-        EjbJarBuilder ejbJarBuilder = new EjbJarBuilder(classLoader);
-
-        HashMap<String,DeploymentInfo> deployments = new HashMap();
-        for (int i = 0; i < this.ejbJars.length; i++) {
-            EjbJarInfo ejbJar = this.ejbJars[i];
-
-            deployments.putAll(ejbJarBuilder.build(ejbJar));
-        }
-
+    public Object buildContainers(HashMap<String, DeploymentInfo> deployments) throws OpenEJBException {
         List containers = new ArrayList();
         for (int i = 0; i < containerInfos.length; i++) {
             ContainerInfo containerInfo = containerInfos[i];
@@ -95,16 +74,16 @@
             Container container = buildContainer(containerInfo, deploymentsList);
             container = wrapContainer(container);
 
-            org.apache.openejb.DeploymentInfo [] deploys = container.deployments();
+            DeploymentInfo [] deploys = container.deployments();
             for (int x = 0; x < deploys.length; x++) {
-                org.apache.openejb.core.CoreDeploymentInfo di = (org.apache.openejb.core.CoreDeploymentInfo) deploys[x];
+                CoreDeploymentInfo di = (CoreDeploymentInfo) deploys[x];
                 di.setContainer(container);
             }
             containers.add(container);
         }
         return containers;
     }
-    
+
     private Container buildContainer(ContainerInfo containerInfo, HashMap deploymentsList) throws OpenEJBException {
         String containerName = containerInfo.containerName;
         ContainerInfo service = containerInfo;

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java?view=diff&rev=474765&r1=474764&r2=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarBuilder.java Tue Nov 14 04:29:43 2006
@@ -21,12 +21,15 @@
 
 import org.apache.openejb.DeploymentInfo;
 import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.util.Messages;
 import org.apache.openejb.core.CoreDeploymentInfo;
 
 /**
  * @version $Revision$ $Date$
  */
 public class EjbJarBuilder {
+    protected static final Messages messages = new Messages("org.apache.openejb.util.resources");
+
     private final ClassLoader classLoader;
 
     public EjbJarBuilder(ClassLoader classLoader) {
@@ -36,12 +39,15 @@
     public HashMap<String, DeploymentInfo> build(EjbJarInfo ejbJar) throws OpenEJBException {
         HashMap<String, DeploymentInfo> deployments = new HashMap();
         EnterpriseBeanInfo[] ejbs = ejbJar.enterpriseBeans;
-        for (int j = 0; j < ejbs.length; j++) {
-            EnterpriseBeanInfo ejbInfo = ejbs[j];
-            EnterpriseBeanBuilder deploymentBuilder = new EnterpriseBeanBuilder(classLoader, ejbInfo);
-            CoreDeploymentInfo deployment = (CoreDeploymentInfo) deploymentBuilder.build();
-            deployment.setJarPath(ejbJar.jarPath);
-            deployments.put(ejbInfo.ejbDeploymentId, deployment);
+        for (EnterpriseBeanInfo ejbInfo: ejbs) {
+            try {
+                EnterpriseBeanBuilder deploymentBuilder = new EnterpriseBeanBuilder(classLoader, ejbInfo);
+                CoreDeploymentInfo deployment = (CoreDeploymentInfo) deploymentBuilder.build();
+                deployment.setJarPath(ejbJar.jarPath);
+                deployments.put(ejbInfo.ejbDeploymentId, deployment);
+            } catch (Throwable e) {
+                throw new OpenEJBException("Error building bean '"+ejbInfo.ejbName+"'.  Exception: "+e.getClass()+": "+e.getMessage(), e);                
+            }
         }
         return deployments;
     }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java?view=diff&rev=474765&r1=474764&r2=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java Tue Nov 14 04:29:43 2006
@@ -199,9 +199,28 @@
     }
 
     private Class loadClass(String className, String messageCode) throws OpenEJBException {
+        Class clazz = load(className, messageCode);
+        try {
+            clazz.getDeclaredMethods();
+            clazz.getDeclaredFields();
+            clazz.getDeclaredConstructors();
+            clazz.getInterfaces();
+            return clazz;
+        } catch (NoClassDefFoundError e) {
+            if (clazz.getClassLoader() != cl){
+                String message = SafeToolkit.messages.format("cl0008", className, clazz.getClassLoader(), cl, e.getMessage());
+                throw new OpenEJBException(AssemblerTool.messages.format(messageCode, className, bean.ejbDeploymentId, message),e);
+            } else {
+                String message = SafeToolkit.messages.format("cl0009", className, clazz.getClassLoader(), e.getMessage());
+                throw new OpenEJBException(AssemblerTool.messages.format(messageCode, className, bean.ejbDeploymentId, message),e);
+            }
+        }
+    }
+
+    private Class load(String className, String messageCode) throws OpenEJBException {
         try {
             return cl.loadClass(className);
-        } catch (ClassNotFoundException cnfe) {
+        } catch (ClassNotFoundException e) {
             String message = SafeToolkit.messages.format("cl0007", className, bean.codebase);
             throw new OpenEJBException(AssemblerTool.messages.format(messageCode, className, bean.ejbDeploymentId, message));
         }

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/util/resources/Messages.properties
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/util/resources/Messages.properties?view=diff&rev=474765&r1=474764&r2=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/util/resources/Messages.properties (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/util/resources/Messages.properties Tue Nov 14 04:29:43 2006
@@ -85,6 +85,8 @@
 cl0005=Error while loading bean class {0} for bean {1}. Received message: {2}
 cl0006=Error while loading primary key class {0} for bean {1}. Received message: {2}
 cl0007=Cannot locate the class {0} from the codebase [{1}]
+cl0008=Class '{0}' failed to fully resolve.  It appears that the class was loaded in a parent classloader '{1}' instead of the expected classloader '{2}' and is missing a required class '{3}'.
+cl0009=Class '{0}' failed to fully resolve.  ClassLoader: {1}, Message: {2}.
 
 classNotFound.remote=Error while loading remote interface {0} for bean {1}. Received message: {2}
 classNotFound.home=Error while loading home interface {0} for bean {1}. Received message: {2}

Modified: incubator/openejb/trunk/openejb3/itests/openejb-itests-app/pom.xml
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/itests/openejb-itests-app/pom.xml?view=diff&rev=474765&r1=474764&r2=474765
==============================================================================
--- incubator/openejb/trunk/openejb3/itests/openejb-itests-app/pom.xml (original)
+++ incubator/openejb/trunk/openejb3/itests/openejb-itests-app/pom.xml Tue Nov 14 04:29:43 2006
@@ -25,6 +25,11 @@
         </executions>
         <configuration>
           <modules>
+            <javaModule>
+              <groupId>junit</groupId>
+              <artifactId>junit</artifactId>
+              <bundleDir>META-INF/lib</bundleDir>
+            </javaModule>
             <ejbModule>
               <groupId>org.apache.openejb</groupId>
               <artifactId>openejb-itests-beans</artifactId>