You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@geronimo.apache.org by David Jencks <da...@yahoo.com> on 2011/05/30 18:59:34 UTC
Re: svn commit: r1129174 - in /geronimo/server/trunk: framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ plugins/client/geronimo-client-builder/src/main/java/org/apache/geronimo/client/builder/ plugins/openejb/geronimo-open...
Could you please open a jira for the ClassPathUtils changes and give examples of the incorrect behavior and correct behavior?
Have you eliminated the MFCP_STRICT flag?
thanks
david jencks
On May 30, 2011, at 6:50 AM, genspring@apache.org wrote:
> Author: genspring
> Date: Mon May 30 13:50:57 2011
> New Revision: 1129174
>
> URL: http://svn.apache.org/viewvc?rev=1129174&view=rev
> Log:
> EJB31 spec EE.8.2.1 :
> A JAR format file (such as a .jar file, .war file, or .rar file) may reference a
> .jar file or directory by naming the referenced .jar file or directory in a
> Class-Path header in the referencing JAR file’s Manifest file
>
> Modified:
> geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ClassPathUtils.java
> geronimo/server/trunk/plugins/client/geronimo-client-builder/src/main/java/org/apache/geronimo/client/builder/AppClientModuleBuilder.java
> geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModuleBuilder.java
>
> Modified: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ClassPathUtils.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ClassPathUtils.java?rev=1129174&r1=1129173&r2=1129174&view=diff
> ==============================================================================
> --- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ClassPathUtils.java (original)
> +++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ClassPathUtils.java Mon May 30 13:50:57 2011
> @@ -136,11 +136,13 @@ public class ClassPathUtils {
> if (!targetUri.getPath().endsWith("/")) {
> targetUri = URI.create(targetUri.getPath() + "/");
> }
> +
> + //1, add the directory to classpath
> + classPath.add(targetUri.getPath());
> +
> + //2, add *.jar under the directory to classpath
> for (File file : factory.listFiles(targetUri)) {
> - if (file.isDirectory()) {
> - log.debug("Sub directory [" + file.getAbsolutePath() + "] in the manifest entry directory is ignored");
> - continue;
> - }
> +
> if (!file.getName().endsWith(".jar")) {
> log.debug("Only jar files are added to classpath, file [" + file.getAbsolutePath() + "] is ignored");
> continue;
> @@ -149,15 +151,6 @@ public class ClassPathUtils {
> }
> } else {
> if (!pathUri.getPath().endsWith(".jar")) {
> - if (manifestClassLoaderMode == MFCP_STRICT) {
> - problems.add(new DeploymentException(
> - "Manifest class path entries must end with the .jar extension (J2EE 1.4 Section 8.2): path= "
> - + path + ", module= " + moduleBaseUri));
> - } else {
> - log.info("The " + manifestClassLoaderMessage + " processing mode is in effect.\n"
> - + "Therefore, a manifest classpath entry which does not end with .jar, "
> - + pathUri + " is being permitted and ignored.");
> - }
> continue;
> }
> classPath.add(targetUri.getPath());
> @@ -234,6 +227,32 @@ public class ClassPathUtils {
> }
>
> URI targetUri = moduleBaseUri.resolve(pathUri);
> +
> + try {
> + if (factory.isDirectory(targetUri)) {
> + if (!targetUri.getPath().endsWith("/")) {
> + targetUri = URI.create(targetUri.getPath() + "/");
> + }
> +
> + //1, add the directory to classpath
> + addToClassPath(moduleBaseUri, resolutionUri, targetUri, classpath, exclusions, factory, problems);
> +
> + //2, add *.jar under the directory to classpath
> + for (File file : factory.listFiles(targetUri)) {
> +
> + if (!file.getName().endsWith(".jar")) {
> + log.debug("Only jar files are added to classpath, file [" + file.getAbsolutePath() + "] is ignored");
> + continue;
> + }
> + addToClassPath(moduleBaseUri, resolutionUri, targetUri.resolve(file.getName()), classpath, exclusions, factory, problems);
> + }
> + } else {
> + if (!pathUri.getPath().endsWith(".jar")) {
> + continue;
> + }
> + addToClassPath(moduleBaseUri, resolutionUri, targetUri, classpath, exclusions, factory, problems);
> + }
> + } catch (IOException e) {}
>
> try {
> if (factory.isDirectory(targetUri)) {
> @@ -281,7 +300,7 @@ public class ClassPathUtils {
>
> private static void addToClassPath(URI moduleBaseUri, URI resolutionUri, URI targetUri, Collection<String> classpath, Collection<String> exclusions, JarFileFactory factory, List<DeploymentException> problems) throws DeploymentException {
> String targetEntry = targetUri.toString();
> - if (exclusions.contains(targetEntry)) {
> + if (exclusions!=null && exclusions.contains(targetEntry)) {
> return;
> }
> URI resolvedUri = resolutionUri.resolve(targetUri);
> @@ -291,6 +310,11 @@ public class ClassPathUtils {
> return;
> }
> classpath.add(classpathEntry);
> +
> + if (!classpathEntry.endsWith(".jar")){
> + return;
> + }
> +
> JarFile classPathJarFile;
> try {
> classPathJarFile = factory.newJarFile(targetUri);
>
> Modified: geronimo/server/trunk/plugins/client/geronimo-client-builder/src/main/java/org/apache/geronimo/client/builder/AppClientModuleBuilder.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/client/geronimo-client-builder/src/main/java/org/apache/geronimo/client/builder/AppClientModuleBuilder.java?rev=1129174&r1=1129173&r2=1129174&view=diff
> ==============================================================================
> --- geronimo/server/trunk/plugins/client/geronimo-client-builder/src/main/java/org/apache/geronimo/client/builder/AppClientModuleBuilder.java (original)
> +++ geronimo/server/trunk/plugins/client/geronimo-client-builder/src/main/java/org/apache/geronimo/client/builder/AppClientModuleBuilder.java Mon May 30 13:50:57 2011
> @@ -25,12 +25,15 @@ import java.net.URL;
> import java.util.ArrayList;
> import java.util.Collection;
> import java.util.Collections;
> +import java.util.Enumeration;
> import java.util.HashMap;
> import java.util.LinkedList;
> import java.util.List;
> import java.util.Map;
> +import java.util.Set;
> import java.util.StringTokenizer;
> import java.util.jar.Attributes;
> +import java.util.jar.JarEntry;
> import java.util.jar.JarFile;
> import java.util.jar.Manifest;
> import java.util.zip.ZipEntry;
> @@ -563,12 +566,9 @@ public class AppClientModuleBuilder impl
> appClientModule.setEarContext(appClientDeploymentContext);
> appClientModule.setRootEarContext(appClientDeploymentContext);
>
> - try {
> - appClientDeploymentContext.addIncludeAsPackedJar(URI.create(module.getTargetPath()), moduleFile);
> - } catch (IOException e) {
> - throw new DeploymentException("Unable to copy app client module jar into configuration: " + moduleFile.getName(), e);
> - }
> - if (module.getParentModule() != null) {
> +
> + if (module.getParentModule() != null) {
> +
> Collection<String> libClasspath = module.getParentModule().getClassPath();
> for (String libEntryPath : libClasspath) {
> try {
> @@ -579,12 +579,65 @@ public class AppClientModuleBuilder impl
> }
> }
> module.getClassPath().addAll(libClasspath);
> +
> +
> + Enumeration<JarEntry> ear_entries = earFile.entries();
> +
> + //Copy non archive files from ear file to appclient configuration. These
> + // files are needed when caculating dir classpath in manifest.
> + while (ear_entries.hasMoreElements()) {
> +
> + ZipEntry ear_entry = ear_entries.nextElement();
> + URI targetPath = module.getParentModule().resolve(ear_entry.getName());
> +
> + if (!ear_entry.getName().endsWith(".jar") && !ear_entry.getName().endsWith(".war")
> + && !ear_entry.getName().endsWith(".rar") && !ear_entry.getName().startsWith("META-INF"))
> + {
> + appClientDeploymentContext.addFile(targetPath, earFile, ear_entry);
> + }
> }
> +
> + Collection<String> appClientModuleClasspaths = module.getClassPath();
> +
> + try {
> + // extract the client Jar file into a standalone packed jar file and add the contents to the output
> + URI moduleBase = new URI(module.getTargetPath());
> + appClientDeploymentContext.addIncludeAsPackedJar(moduleBase, moduleFile);
> + // add manifest class path entries to the app client context
> + addManifestClassPath(appClientDeploymentContext, appClientModule.getEarFile(), moduleFile, moduleBase);
> +
> +
> + } catch (IOException e) {
> + throw new DeploymentException("Unable to copy app client module jar into configuration: " + moduleFile.getName(), e);
> + } catch (URISyntaxException e) {
> + throw new DeploymentException("Unable to get app client module base URI " + module.getTargetPath(), e);
> + }
> +
> + appClientModuleClasspaths.add(module.getTargetPath());
> + EARContext moduleContext = module.getEarContext();
> + Collection<String> moduleLocations = module.getParentModule().getModuleLocations();
> + URI baseUri = URI.create(module.getTargetPath());
> + moduleContext.getCompleteManifestClassPath(module.getDeployable(), baseUri, URI.create("."), appClientModuleClasspaths, moduleLocations);
> +
> +
> + for (String classpath: appClientModuleClasspaths){
> + appClientDeploymentContext.addToClassPath(classpath);
> +
> + //Copy needed jar from ear to appclient configuration.
> + if (classpath.endsWith(".jar")){
> +
> + NestedJarFile library = new NestedJarFile(earFile, classpath);
> + appClientDeploymentContext.addIncludeAsPackedJar(URI.create(classpath), library);
> +
> + }
> + }
> + }
> +
> } catch (DeploymentException e) {
> throw e;
> } catch (IOException e) {
> throw new DeploymentException(e);
> - }
> + }
> for (Module connectorModule : appClientModule.getModules()) {
> if (connectorModule instanceof ConnectorModule) {
> getConnectorModuleBuilder().installModule(connectorModule.getModuleFile(), appClientDeploymentContext, connectorModule, configurationStores, targetConfigurationStore, repositories);
> @@ -652,25 +705,12 @@ public class AppClientModuleBuilder impl
> }
> }
>
> - // Create a Module ID Builder defaulting to similar settings to use for any children we create
> - ModuleIDBuilder idBuilder = new ModuleIDBuilder();
> - idBuilder.setDefaultGroup(appClientModule.getEnvironment().getConfigId().getGroupId());
> - idBuilder.setDefaultVersion(appClientModule.getEnvironment().getConfigId().getVersion());
> +
> try {
> try {
>
> //register the message destinations in the app client ear context.
> namingBuilders.initContext(appClient, geronimoAppClient, appClientModule);
> - // extract the client Jar file into a standalone packed jar file and add the contents to the output
> - URI moduleBase = new URI(appClientModule.getTargetPath());
> - try {
> - appClientDeploymentContext.addIncludeAsPackedJar(moduleBase, moduleFile);
> - } catch (IOException e) {
> - throw new DeploymentException("Unable to copy app client module jar into configuration: " + moduleFile.getName(), e);
> - }
> -
> - // add manifest class path entries to the app client context
> - addManifestClassPath(appClientDeploymentContext, appClientModule.getEarFile(), moduleFile, moduleBase);
>
> // get the classloader
> Bundle appClientClassBundle = appClientDeploymentContext.getDeploymentBundle();
> @@ -896,12 +936,11 @@ public class AppClientModuleBuilder impl
> throw new DeploymentException("Invalid manifest classpath entry: jarFile=" + jarFileLocation + ", path=" + path, e);
> }
>
> - if (!pathUri.getPath().endsWith(".jar")) {
> - throw new DeploymentException("Manifest class path entries must end with the .jar extension (JAVAEE 5 Section 8.2): jarFile=" + jarFileLocation + ", path=" + path);
> - }
> if (pathUri.isAbsolute()) {
> throw new DeploymentException("Manifest class path entries must be relative (JAVAEE 5 Section 8.2): jarFile=" + jarFileLocation + ", path=" + path);
> }
> +
> + Enumeration<JarEntry> ear_entries = earFile.entries();
>
> // determine the target file
> URI classPathJarLocation = jarFileLocation.resolve(pathUri);
> @@ -915,23 +954,44 @@ public class AppClientModuleBuilder impl
> if (entry == null) {
> throw new DeploymentException("Cound not find manifest class path entry: jarFile=" + jarFileLocation + ", path=" + path);
> }
> -
> +
> try {
> - // copy the file into the output context
> - deploymentContext.addFile(classPathJarLocation, earFile, entry);
> +
> + if (!entry.getName().endsWith(".jar")) {
> +
> + while (ear_entries.hasMoreElements()) {
> + ZipEntry ear_entry = ear_entries.nextElement();
> + URI targetPath = jarFileLocation.resolve(ear_entry.getName());
> + if (ear_entry.getName().startsWith(classPathJarLocation.getPath()))
> + deploymentContext.addFile(targetPath, earFile, ear_entry);
> + }
> + } else {
> +
> + // copy the file into the output context
> + deploymentContext.addFile(classPathJarLocation, earFile, entry);
> + }
> } catch (IOException e) {
> - throw new DeploymentException("Cound not copy manifest class path entry into configuration: jarFile=" + jarFileLocation + ", path=" + path, e);
> + throw new DeploymentException(
> + "Cound not copy manifest class path entry into configuration: jarFile=" + jarFileLocation
> + + ", path=" + path, e);
> }
>
> JarFile classPathJarFile;
> - try {
> - classPathJarFile = new JarFile(classPathFile);
> - } catch (IOException e) {
> - throw new DeploymentException("Manifest class path entries must be a valid jar file (JAVAEE 5 Section 8.2): jarFile=" + jarFileLocation + ", path=" + path, e);
> - }
> +
> + if (classPathFile.getName().endsWith(".jar")) {
>
> - // add the client jars of this class path jar
> - addManifestClassPath(deploymentContext, earFile, classPathJarFile, classPathJarLocation);
> + try {
> + classPathJarFile = new JarFile(classPathFile);
> + } catch (IOException e) {
> + throw new DeploymentException(
> + "Manifest class path entries must be a valid jar file (JAVAEE 5 Section 8.2): jarFile="
> + + jarFileLocation + ", path=" + path, e);
> + }
> +
> + // add the client jars of this class path jar
> + addManifestClassPath(deploymentContext, earFile, classPathJarFile, classPathJarLocation);
> +
> + }
> }
> }
> }
>
> Modified: geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModuleBuilder.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModuleBuilder.java?rev=1129174&r1=1129173&r2=1129174&view=diff
> ==============================================================================
> --- geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModuleBuilder.java (original)
> +++ geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModuleBuilder.java Mon May 30 13:50:57 2011
> @@ -362,7 +362,7 @@ public class EjbModuleBuilder implements
>
>
>
> - detectTempClassLoader = ClassLoaderUtil.createTempClassLoader(ClassLoaderUtil.createClassLoader(jarPath, (URL[])libURLs.toArray(new URL[0]), OpenEJB.class.getClassLoader()));
> + detectTempClassLoader = ClassLoaderUtil.createTempClassLoader(ClassLoaderUtil.createClassLoader(jarPath, libURLs.toArray(new URL[0]), OpenEJB.class.getClassLoader()));
>
> ResourceFinder finder = new ResourceFinder("", detectTempClassLoader, baseUrl);
>
> @@ -397,7 +397,7 @@ public class EjbModuleBuilder implements
> libURLs.clear();
> libURLs.add(baseUrl);
>
> - ejbModuleTempClassLoader = ClassLoaderUtil.createTempClassLoader(ClassLoaderUtil.createClassLoader(jarPath, (URL[])libURLs.toArray(new URL[0]), OpenEJB.class.getClassLoader()));
> + ejbModuleTempClassLoader = ClassLoaderUtil.createTempClassLoader(ClassLoaderUtil.createClassLoader(jarPath, libURLs.toArray(new URL[0]), OpenEJB.class.getClassLoader()));
>
>
> // create the EJB Module
> @@ -670,8 +670,12 @@ public class EjbModuleBuilder implements
> // extract the ejbJar file into a standalone packed jar file and add the contents to the output
> earContext.addIncludeAsPackedJar(URI.create(module.getTargetPath()), moduleFile);
> // add manifest class path entries to the ejb module classpath
> - Set<String> EjbModuleClasspaths = module.getClassPath();
> - earContext.addManifestClassPath(moduleFile, URI.create("."), EjbModuleClasspaths);
> + Collection<String> EjbModuleClasspaths = module.getClassPath();
> + EjbModuleClasspaths.add(module.getTargetPath());
> + Collection<String> moduleLocations = module.isStandAlone() ? null : module.getParentModule()
> + .getModuleLocations();
> + URI baseUri = URI.create(module.getTargetPath());
> + earContext.getCompleteManifestClassPath(module.getDeployable(), baseUri, URI.create("."), EjbModuleClasspaths, moduleLocations);
>
> for (String classpath:EjbModuleClasspaths){
> earContext.addToClassPath(classpath);
> @@ -728,12 +732,7 @@ public class EjbModuleBuilder implements
> private void doInitContext(EARContext earContext, Module module, Bundle bundle) throws DeploymentException {
> EjbModule ejbModule = (EjbModule) module;
>
> - Collection<String> manifestcp = module.getClassPath();
> - manifestcp.add(module.getTargetPath());
> - EARContext moduleContext = module.getEarContext();
> - Collection<String> moduleLocations = EARContext.MODULE_LIST_KEY.get(module.getRootEarContext().getGeneralData());
> - URI baseUri = URI.create(module.getTargetPath());
> - moduleContext.getCompleteManifestClassPath(module.getDeployable(), baseUri, URI.create("."), manifestcp, moduleLocations);
> +
>
> GeronimoEjbInfo ejbInfo = getEjbInfo(earContext, ejbModule, bundle);
>
>
>