[jboss-jira] [JBoss JIRA] Created: (JBAS-6912) If current class loader is a URLClassLoader then spaces anywhere in the url list causes MalformedURLExceptions to be reported on JNDI lookup

David Crighton (JIRA) jira-events at lists.jboss.org
Wed May 13 12:29:46 EDT 2009


If current class loader is a URLClassLoader then spaces anywhere in the url list causes MalformedURLExceptions to be reported on JNDI lookup
--------------------------------------------------------------------------------------------------------------------------------------------

                 Key: JBAS-6912
                 URL: https://jira.jboss.org/jira/browse/JBAS-6912
             Project: JBoss Application Server
          Issue Type: Bug
      Security Level: Public (Everyone can see)
          Components: Naming
    Affects Versions: JBossAS-4.2.1.GA
         Environment: Observed on Windows
            Reporter: David Crighton
            Assignee: Scott M Stark


Our product (Websphere Message Broker) integrates with several JMS providers. We recently got a customer reporting excepetions on JBoss 4.2.1 which we tracked down to be during JNDI lookup of the JMS Destinations from JBoss. It turns out that if the threads classloader is a URLClassLoader and any of its URLs contain a space then the following exception is observed:

javax.naming.CommunicationException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
	java.net.MalformedURLException: no protocol: files/jboss/jboss-4.2.1.GA/client/blah.jar]
com.ibm.mqst.broker.jmsService.BrokerJMSService::handleNamingException: Rethrowing for application level handling
javax.naming.CommunicationException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
	java.net.MalformedURLException: no protocol: files/jboss/jboss-4.2.1.GA/client/blah.jar]
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:724)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:589)
	at javax.naming.InitialContext.lookup(InitialContext.java:363)
	at com.ibm.mqst.broker.jmsService.BrokerJMSService.<init>(BrokerJMSService.java:402)
	at com.ibm.mqst.broker.jmsService.JBossConnector.main(JBossConnector.java:52)
Caused by: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
	java.net.MalformedURLException: no protocol: files/jboss/jboss-4.2.1.GA/client/blah.jar
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:341)
	at sun.rmi.transport.Transport$1.run(Transport.java:171)
	at java.security.AccessController.doPrivileged(AccessController.java:284)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:167)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:547)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:802)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:661)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:896)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at java.lang.Thread.run(Thread.java:735)
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:263)
	at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:239)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:141)
	at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
	... 4 more
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
	java.net.MalformedURLException: no protocol: files/jboss/jboss-4.2.1.GA/client/blah.jar
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:298)
	at sun.rmi.transport.Transport$1.run(Transport.java:171)
	at java.security.AccessController.doPrivileged(AccessController.java:284)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:167)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:547)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:802)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:661)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:896)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at java.lang.Thread.run(Thread.java:735)
Caused by: java.net.MalformedURLException: no protocol: files/jboss/jboss-4.2.1.GA/client/blah.jar
	at java.lang.Throwable.<init>(Throwable.java:67)
	at java.net.URL.<init>(URL.java:489)
	at java.net.URL.<init>(URL.java:464)
	at java.net.URL.<init>(URL.java:413)
	at sun.rmi.server.LoaderHandler.pathToURLs(LoaderHandler.java:751)
	at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:147)
	at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:631)
	at org.jboss.system.JBossRMIClassLoader.loadClass(JBossRMIClassLoader.java:91)
	at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:258)
	at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:209)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1586)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1507)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1743)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1340)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:362)
	at javax.naming.CompoundName.readObject(CompoundName.java:796)
	at sun.reflect.GeneratedMethodAccessor70.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
	at java.lang.reflect.Method.invoke(Method.java:599)
	at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:985)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1860)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1764)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1340)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:362)
	at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:318)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:295)
	... 9 more

The customer was able to recreate outside the broker using the following code:

URL[] urls = new URL[4];
		try {
			File file1 = new File("c:\\program files\\jboss\\jboss-4.2.1.GA\\client\\blah.jar");
			File file2 = new File("c:\\temp\\jboss\\jboss-4.2.1.GA\\client\\jbossall-client.jar");
			File file3 = new File("c:\\program files\\jboss\\jboss-4.2.1.GA\\client\\blah.jar");
			File file4 = new File("c:\\program files\\jboss\\jboss-4.2.1.GA\\client\\blah.jar");
			
			System.out.println("example url: " + file1.toURL().toExternalForm() + "--" + file1.toURI().toURL().toExternalForm());
			urls[0] = file1.toURL();
			urls[1] = file2.toURL();
			urls[2] = file3.toURL();
			urls[3] = file4.toURL();
			
		} catch (MalformedURLException e1) {
			// TODO Auto-generated catch block
                        System.println("Malformed URI for JRE");
			e1.printStackTrace();
			System.exit(-1);
		}
		URLClassLoader cl = new URLClassLoader(urls);
		Thread.currentThread().setContextClassLoader(cl);
		
		
		Hashtable environment = new Hashtable();
        environment.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        environment.put(Context.PROVIDER_URL, "jnp://server_address:1099");
        environment.put(Context.REFERRAL, "throw");
        try{
        	Context c =  new InitialDirContext(environment);
        	ConnectionFactory connectionFactory = (ConnectionFactory) c.lookup("ConnectionFactory");
        }
        catch(Exception e){
               //this is where we catch the NamingException
        	e.printStackTrace();
        }

Escaping the spaces resolves problem ie/

urls[0] = file1.toURI().toURL();

We will be using this workaround in our product so impact can be considered small.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the jboss-jira mailing list