Java 1.6 change/fix in classloader.loadClass breaks JSF (and some other things)

Description

Chat fails to startup in java 1.6 with the given error:

2009-07-23 14:48:57,191 INFO main org.apache.catalina.startup.HostConfig - Deploying web application archive sakai-chat-tool.war
java.lang.ClassNotFoundException: [Ljava.lang.String;
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1359)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1205)
at com.sun.faces.config.ConfigureListener.configure(ConfigureListener.java:615)
at com.sun.faces.config.ConfigureListener.configure(ConfigureListener.java:402)
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:328)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3764)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4216)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:740)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:544)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:825)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:714)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:490)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1022)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:448)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
2009-07-23 14:49:00,185 ERROR main org.apache.catalina.core.ContainerBase.[Catalina].[localhost]./sakai-chat-tool - Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener
javax.faces.FacesException: java.lang.ClassNotFoundException: [Ljava.lang.String;
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:334)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3764)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4216)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:740)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:544)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:825)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:714)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:490)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1022)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:448)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
Caused by: java.lang.ClassNotFoundException: [Ljava.lang.String;
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1359)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1205)
at com.sun.faces.config.ConfigureListener.configure(ConfigureListener.java:615)
at com.sun.faces.config.ConfigureListener.configure(ConfigureListener.java:402)
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:328)
... 24 more
2009-07-23 14:49:00,185 INFO main org.sakaiproject.util.ToolListener - registering tools from resource: /tools/sakai.chat.deleteMessage.xml
2009-07-23 14:49:00,192 INFO main org.sakaiproject.util.ToolListener - registering tools from resource: /tools/sakai.synoptic.chat.xml
2009-07-23 14:49:00,194 INFO main org.sakaiproject.util.ToolListener - registering tools from resource: /tools/sakai.chat.xml
2009-07-23 14:49:00,203 ERROR main org.apache.catalina.core.StandardContext - Error listenerStart
2009-07-23 14:49:00,203 ERROR main org.apache.catalina.core.StandardContext - Context /sakai-chat-tool startup failed due to previous errors

is related to

Activity

Show:

Matthew Buckett September 16, 2015 at 8:42 AM

Based on Aaron's comment I've flagged that this argument was no longer needed as of 2.9.0 which was released a year after the comment.

Aaron Zeckoski November 4, 2011 at 3:38 PM

The sun.lang.ClassLoader.allowArraySyntax=true flag is no longer needed for trunk.

Noah Botimer November 4, 2011 at 8:50 AM

A follow up to Aaron's details... The fix is actually easy where it happens. It's a simple change from ClassLoader.loadClass to Class.forName. See: http://bugs.sun.com/view_bug.do?bug_id=6500212

The biggest issue is that the reference implementation of JSF 1.1 (from Sun) will not be released with the fix. See: http://java.net/jira/browse/JAVASERVERFACES-680

IIRC, some of our tools have not yet been upgraded to support JSF 1.2. It may actually be a breaking change that needs to be coordinated across much of the application. The migration appears to be straightforward and isolated to components/taglibs:

http://java.sun.com/javaee/javaserverfaces/docs/ReleaseNotes.html#migrating

The other option is to use an alternate JSF 1.1 implementation. None of these is especially attractive.

Aaron Zeckoski November 4, 2011 at 7:16 AM

I think it is time to reopen this because it should be fixed in the newer JSF libraries and if it exists in our code it should DEFINITELY be fixed

Aaron Zeckoski November 4, 2011 at 7:15 AM

extra notes on this:
Class Loading Errors with Array Syntax
Problem
ClassLoader.loadClass() throws java.lang.ClassNotFoundException: [Ljava.lang.String;
Note in particular the [ character in the class name, referring to an array (of strings, in this case).
Reason
This problem can easily reproduced with a simple test program:
EXAMPLE
public class test {
public static void main(String[] args) throws Exception {

String[] s = new String[] { "123" };
String clName = s.getClass().getName();
test.class.getClassLoader().loadClass(clName);
}
}
The program runs without any problems on JDK 5, but throws this exception on JDK 6:
EXAMPLE
Exception in thread "main" java.lang.ClassNotFoundException: [Ljava.lang.String;
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at test.main(test.java:7)

This happens because the class name in clName is in array syntax (with a leading [). According to Sun documentation, it was not intentional that this syntax worked before and there were cases, where it failed even in older releases. For JDK 6 the array syntax was disallowed on purpose.
Solution
The recommended solution is to fix the custom class loading code so it depend not on the array syntax. If this is not possible, or as a short-time workaround, the following system property can be set to enable the old behavior without checks for array syntax:
EXAMPLE
sun.lang.ClassLoader.allowArraySyntax=true

Fixed

Details

Priority

Affects versions

Fix versions

Components

Assignee

Reporter

Environment

java version "1.6.0_13" Java(TM) SE Runtime Environment (build 1.6.0_13-b03-211) Java HotSpot(TM) 64-Bit Server VM (build 11.3-b02-83, mixed mode) OSX 10.5.3
Created July 23, 2009 at 6:55 AM
Updated September 16, 2015 at 8:42 AM
Resolved November 4, 2011 at 3:39 PM