[jbossts-issues] [JBoss JIRA] (JBTM-2189) Bootstrapping from Complex Classloader (OneJar)

Chris Pheby (JIRA) issues at jboss.org
Tue Jun 10 12:23:15 EDT 2014


Chris Pheby created JBTM-2189:
---------------------------------

             Summary: Bootstrapping from Complex Classloader (OneJar)
                 Key: JBTM-2189
                 URL: https://issues.jboss.org/browse/JBTM-2189
             Project: JBoss Transaction Manager
          Issue Type: Feature Request
      Security Level: Public (Everyone can see)
          Components: Common
    Affects Versions: 5.0.1
         Environment: JDK 8, OneJar 0.97
            Reporter: Chris Pheby
            Assignee: Tom Jenkinson


I am using Narayana within a JavaSE application. The application is compiled into a single Jar. When executing, Narayana fails to bootstrap properly.

The first problem is within com.arjuna.common.util.ConfigurationInfo.

Lines 111-115 aim to load the MANIFEST file from the classpath:

        String pathToManifest = basePath+"/META-INF/MANIFEST.MF";

        InputStream is = null;
        try {
            is = new URL(pathToManifest).openStream();

I replaced this with:

        InputStream is = null;

        // BEGIN - WORKAROUND FOR ONE-JAR
        try {
        	String targetPrefix = pathToThisClass.substring(0, pathToThisClass.length() - "/com/arjuna/common/util/ConfigurationInfo.class".length());
            Enumeration<URL> resources = ConfigurationInfo.class.getClassLoader().getResources("META-INF/MANIFEST.MF");
            while (resources.hasMoreElements()) {
            	URL next = resources.nextElement();
            	if (next.toString().startsWith(targetPrefix)) {
            		is = next.openStream();
            		break;
            	}
            }        	
        // END - WORKAROUND FOR ONE-JAR

This should work for all environments.

Changes are also required in com.arjuna.common.util.propertyservice.AbstractPropertiesFactory to attempt loading from classpath as well as file system:

The last line of initDefaultProperties (195) needed changing to:

        defaultProperties = getPropertiesFromClasspath(propertyFileName, PropertiesFactoryStax.class.getClassLoader());
        if (defaultProperties == null) {
        	defaultProperties = getPropertiesFromFile(propertyFileName, PropertiesFactoryStax.class.getClassLoader()); 
        }
    }

and the following methods added / replaced:

    /**
     * Returns the config properties read from a specified relative location on the classpath.
     *
     * @param propertyFileName the file name relative to the classpath root. 
     * @return the Properties loaded from the specified source.
     */
    public Properties getPropertiesFromClasspath(String propertyFileName, ClassLoader classLoader) {

    	Properties properties = null;
    	
    	try {
            Enumeration<URL> resources = ConfigurationInfo.class.getClassLoader().getResources(propertyFileName);
            while (resources.hasMoreElements()) {
            	URL next = resources.nextElement();
            	
            	properties = loadFromStream(next.openStream());
            	return properties;
            }        	
        } catch(Exception e) {
            return null;
        }

        return properties;
    }
    
    /**
     * Returns the config properties read from a specified location.
     *
     * @param propertyFileName the file name. If relative, this is located using the FileLocator algorithm.
     * @return the Properties loaded from the specified source.
     */
    public Properties getPropertiesFromFile(String propertyFileName, ClassLoader classLoader) {
        String propertiesSourceUri = null;
        try
        {
            // This is the point where the search path is applied - user.dir (pwd), user.home, java.home, classpath
            propertiesSourceUri = com.arjuna.common.util.propertyservice.FileLocator.locateFile(propertyFileName, classLoader);
        }
        catch(FileNotFoundException fileNotFoundException)
        {
            // try falling back to a default file built into the .jar
            // Note the default- prefix on the name, to avoid finding it from the .jar at the previous stage
            // in cases where the .jar comes before the etc dir on the classpath.
            URL url = AbstractPropertiesFactory.class.getResource("/default-"+propertyFileName);
            if(url == null) {
                throw new RuntimeException("missing property file "+propertyFileName);
            } else {
                propertiesSourceUri = url.toString();
            }
        }
        catch (IOException e)
        {
            throw new RuntimeException("invalid property file "+propertiesSourceUri, e);
        }

        Properties properties = null;

        try {
            properties = loadFromFile(propertiesSourceUri);
            properties = applySystemProperties(properties);

        } catch(Exception e) {
            throw new RuntimeException("unable to load properties from "+propertiesSourceUri, e);
        }

        return properties;
    }


    private Properties loadFromStream(InputStream inputStream) throws IOException {

    	Properties inputProperties = new Properties();
        Properties outputProperties = new Properties();

        try {
            loadFromXML(inputProperties,inputStream);
        } finally {
            inputStream.close();
        }

        Enumeration namesEnumeration = inputProperties.propertyNames();
        while(namesEnumeration.hasMoreElements()) {
            String propertyName = (String)namesEnumeration.nextElement();
            String propertyValue = inputProperties.getProperty(propertyName);

            propertyValue = propertyValue.trim();

            // perform JBossAS style property substitutions. JBTM-369
            propertyValue = StringPropertyReplacer.replaceProperties(propertyValue);

            outputProperties.setProperty(propertyName, propertyValue);
        }

        return outputProperties;
    }




--
This message was sent by Atlassian JIRA
(v6.2.3#6260)


More information about the jbossts-issues mailing list