Re: How come I can't seem to load a jar file successfully?
Jim wrote:
I'm probably going to kick myself, but here's what's happening.
The referenced jar has the AsyncTimeoutException class.
jim@blackie:~/panel$ jar tf /opt/jdk1.5.0_15/jre/lib/ibmaio.jar | grep
AsyncTimeout
com/ibm/io/async/AsyncTimeout.class
com/ibm/io/async/AsyncTimeoutException.class
However for some reason my program doesn't see it. Why?
jim@blackie:~/panel$ java -classpath /opt/jdk1.5.0_15/jre/lib/ibmaio.jar
-jar /home/jwl/panel/dist/lib/PanelProbe-20080623.jar
Exception in thread "main" java.lang.NoClassDefFoundError:
com/ibm/io/async/AsyncTimeoutException
at
com.fayettedigital.panelprobe.main.PanelProbe.testGECom(Unknown Source)
at com.fayettedigital.panelprobe.main.PanelProbe.main(Unknown
Source)
When you invoke 'java' with the '-jar' option it ignores the '-classpath'
option and takes all its classpath from the target JAR manifest, in this case
that of PanelProbe-20080623.jar.
Unless ibmaio.jar came with the JDK distribution itelf, it does not belong in
/opt/jdk1.5.0_15/jre/lib/. That directory is for the libraries that make up
the Java platform per se.
When using a tool like the 'java' command, it is best to RTFM:
<http://java.sun.com/javase/6/docs/technotes/tools/solaris/java.html>
-jar
When you use this option, the JAR file is the source of all user classes,
and other user class path settings are ignored.
This is a subtle point and one which has burned all of us. The reason
requires further digging in TFM:
<http://java.sun.com/javase/6/docs/technotes/guides/jar/index.html>
for starters.
We want to know if we're ignoring the classpath, how the heck do we tell our
app where the heck things are, eh?
The answer, my friend, is blowing in the manifest:
<http://java.sun.com/docs/books/tutorial/deployment/jar/manifestindex.html>
Yay! A tutorial.
We set the entry point, i.e., who's got the main()?
<http://java.sun.com/docs/books/tutorial/deployment/jar/appman.html>
and co-deploy the ibmlmao (substitute your name here) JAR(s) *in the same
directory as the app JAR*.
The manifest specifies the class path in the 'Class-Path: ' directive.
<http://java.sun.com/docs/books/tutorial/deployment/jar/downman.html>
Class-Path: ibmlmao.jar
The path is relative to the location of the app JAR.
--
Lew