You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Jay Chalfant <jc...@outbackinc.com> on 2000/08/19 02:11:22 UTC

odd classpath error == bug?

This is quite possibly a configuration anomaly but it is odd enough that
I think I should report it. I hope that this is the correct channel.

Short explanation:
When I try to start tomcat with a struts.jar in my classpath that is
other than ~/struts-example/WEB-INF/lib/struts.jar, I get a class not
found error on class org.apache.struts.example.User. If I clear the
classpath and start tomcat, the error goes away. This strikes me as odd
since the example package is not in struts.jar (confirmed).

Longer answer:
Below is a copy of a console sequence in which I view the env, try to
start tomcat, get the error, clear the CLASSPATH, start tomcat, get no
error.

==
[tomcat]$ env
(snip)
CLASSPATH=/projects/jakarta/jakarta-struts/lib/struts.jar
(snip)

[tomcat]$ tomcat.sh stop
Using classpath:
.:/projects/tomcat/lib/ant.jar:/projects/tomcat/lib/jasper.jar:/projects/tomcat/lib/servlet.jar:/projects/tomcat/lib/test:/projects/tomcat/lib/webserver.jar:/projects/tomcat/lib/xml.jar:/projects/jdk1.2.2/lib/tools.jar:/projects/jakarta/jakarta-struts/lib/struts.jar

Stop tomcat

[tomcat]$ tomcat.sh start
Using classpath:
.:/projects/tomcat/lib/ant.jar:/projects/tomcat/lib/jasper.jar:/projects/tomcat/lib/servlet.jar:/projects/tomcat/lib/test:/projects/tomcat/lib/webserver.jar:/projects/tomcat/lib/xml.jar:/projects/jdk1.2.2/lib/tools.jar:/projects/jakarta/jakarta-struts/lib/struts.jar

[tomcat]$ Context log: path="/examples" Adding context path="/examples"
docBase="webapps/examples"
Context log: path="" Adding context path=""  docBase="webapps/ROOT"
Context log: path="/test" Adding context path="/test"
docBase="webapps/test"
Starting tomcat. Check logs/tomcat.log for error messages
Starting tomcat install="/projects/tomcat" home="/projects/tomcat"
classPath=".:/projects/tomcat/lib/ant.jar:/projects/tomcat/lib/jasper.jar:/projects/tomcat/lib/servlet.jar:/projects/tomcat/lib/test:/projects/tomcat/lib/webserver.jar:/projects/tomcat/lib/xml.jar:/projects/jdk1.2.2/lib/tools.jar:/projects/jakarta/jakarta-struts/lib/struts.jar"

Context log: path="/admin" Automatic context load
docBase="/projects/tomcat/webapps/admin"
Context log: path="/admin" Adding context path="/admin"
docBase="/projects/tomcat/webapps/admin"
Context log: path="/struts-documentation" Automatic context load
docBase="/projects/tomcat/webapps/struts-documentation"
Context log: path="/struts-documentation" Adding context
path="/struts-documentation"
docBase="/projects/tomcat/webapps/struts-documentation"
Context log: path="/struts-example" Automatic context load
docBase="/projects/tomcat/webapps/struts-example"
Context log: path="/struts-example" Adding context
path="/struts-example"
docBase="/projects/tomcat/webapps/struts-example"
New org.apache.struts.example.User
Begin event threw exception
java.lang.ClassNotFoundException: org.apache.struts.example.User
        at java.net.URLClassLoader$1.run(URLClassLoader.java, Compiled
Code)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java,
Compiled Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled
Code)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java,
Compiled Code)
        at java.lang.ClassLoader.loadClass(ClassLoader.java, Compiled
Code)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java, Compiled Code)
        at
org.apache.struts.digester.ObjectCreateRule.begin(ObjectCreateRule.java,
Compiled Code)
        at
org.apache.struts.digester.Digester.startElement(Digester.java, Compiled
Code)
        at com.sun.xml.parser.Parser.maybeElement(Parser.java, Compiled
Code)
        at com.sun.xml.parser.Parser.content(Parser.java, Compiled Code)

        at com.sun.xml.parser.Parser.maybeElement(Parser.java, Compiled
Code)
        at com.sun.xml.parser.Parser.parseInternal(Parser.java, Compiled
Code)
        at com.sun.xml.parser.Parser.parse(Parser.java, Compiled Code)
        at javax.xml.parsers.SAXParser.parse(SAXParser.java, Compiled
Code)
        at javax.xml.parsers.SAXParser.parse(SAXParser.java, Compiled
Code)
        at org.apache.struts.digester.Digester.parse(Digester.java,
Compiled Code)
        at
org.apache.struts.example.DatabaseServlet.load(DatabaseServlet.java,
Compiled Code)
        at
org.apache.struts.example.DatabaseServlet.init(DatabaseServlet.java,
Compiled Code)
        at javax.servlet.GenericServlet.init(GenericServlet.java,
Compiled Code)
        at
org.apache.tomcat.core.ServletWrapper.initServlet(ServletWrapper.java,
Compiled Code)
        at
org.apache.tomcat.core.ServletWrapper.loadServlet(ServletWrapper.java,
Compiled Code)
        at
org.apache.tomcat.context.LoadOnStartupInterceptor.contextInit(LoadOnStartupInterceptor.java,
Compiled Code)
        at
org.apache.tomcat.core.ContextManager.initContext(ContextManager.java,
Compiled Code)
        at
org.apache.tomcat.core.ContextManager.init(ContextManager.java, Compiled
Code)
        at org.apache.tomcat.startup.Tomcat.execute(Tomcat.java,
Compiled Code)
        at org.apache.tomcat.startup.Tomcat.main(Tomcat.java, Compiled
Code)


[tomcat]$ CLASSPATH=

[tomcat]$ export CLASSPATH

[tomcat]$ tomcat.sh stop
Using classpath:
.:/projects/tomcat/lib/ant.jar:/projects/tomcat/lib/jasper.jar:/projects/tomcat/lib/servlet.jar:/projects/tomcat/lib/test:/projects/tomcat/lib/webserver.jar:/projects/tomcat/lib/xml.jar:/projects/jdk1.2.2/lib/tools.jar

Stop tomcat

[tomcat]$ tomcat.sh start
Using classpath:
.:/projects/tomcat/lib/ant.jar:/projects/tomcat/lib/jasper.jar:/projects/tomcat/lib/servlet.jar:/projects/tomcat/lib/test:/projects/tomcat/lib/webserver.jar:/projects/tomcat/lib/xml.jar:/projects/jdk1.2.2/lib/tools.jar

[tomcat]$ Context log: path="/examples" Adding context path="/examples"
docBase="webapps/examples"
Context log: path="" Adding context path=""  docBase="webapps/ROOT"
Context log: path="/test" Adding context path="/test"
docBase="webapps/test"
Starting tomcat. Check logs/tomcat.log for error messages
Starting tomcat install="/projects/tomcat" home="/projects/tomcat"
classPath=".:/projects/tomcat/lib/ant.jar:/projects/tomcat/lib/jasper.jar:/projects/tomcat/lib/servlet.jar:/projects/tomcat/lib/test:/projects/tomcat/lib/webserver.jar:/projects/tomcat/lib/xml.jar:/projects/jdk1.2.2/lib/tools.jar"

Context log: path="/admin" Automatic context load
docBase="/projects/tomcat/webapps/admin"
Context log: path="/admin" Adding context path="/admin"
docBase="/projects/tomcat/webapps/admin"
Context log: path="/struts-documentation" Automatic context load
docBase="/projects/tomcat/webapps/struts-documentation"
Context log: path="/struts-documentation" Adding context
path="/struts-documentation"
docBase="/projects/tomcat/webapps/struts-documentation"
Context log: path="/struts-example" Automatic context load
docBase="/projects/tomcat/webapps/struts-example"
Context log: path="/struts-example" Adding context
path="/struts-example"
docBase="/projects/tomcat/webapps/struts-example"
New org.apache.struts.example.User
Set org.apache.struts.example.User properties
New org.apache.struts.example.Subscription
Set org.apache.struts.example.Subscription properties
Call
org.apache.struts.example.Subscription.setUser(org.apache.struts.example.User@ff33861d)

Pop org.apache.struts.example.Subscription
New org.apache.struts.example.Subscription
Set org.apache.struts.example.Subscription properties
Call
org.apache.struts.example.Subscription.setUser(org.apache.struts.example.User@ff33861d)

Pop org.apache.struts.example.Subscription
Call
org.apache.struts.example.DatabaseServlet.addUser(org.apache.struts.example.User@ff33861d)

Pop org.apache.struts.example.User

[tomcat]$
==

Please advise if anyone needs more info.

-J



Re: odd classpath error == bug?

Posted by Hans Gerwitz <ja...@phobia.com>.
> Short explanation:
> When I try to start tomcat with a struts.jar in my classpath that is
> other than ~/struts-example/WEB-INF/lib/struts.jar, I get a class not
> found error on class org.apache.struts.example.User. If I clear the
> classpath and start tomcat, the error goes away. This strikes me as odd
> since the example package is not in struts.jar (confirmed).

You didn't specify which version of Tomcat you're using, but 3.1 and
previous are known to have various difficulties loading classes that appear
in the "standard" J2EE paths (WEB-INF/lib and  WEB-INF/classes) *and* in the
system classpath.  The moral: don't place anything from the web application
classpaths in the "proper" classpath for the JVM that Tomcat runs in.

The behavior you experienced was a symptom of Tomcat not being able to load
struts.jar classes (because they were in the classpath... ironic, no?), and
it merely surfaced when the example appplication (which loads a servlet on
startup) attempted to use an org.apache.struts class [moral II:
ClassNotFoundExceptions are usually thrown by the class looking for a
missing class, not the missing class itself :-) ]

Someone correct me if I'm leading Jay astray here...
-- 
Hans Gerwitz
hans@phobia.com