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