Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java fails to load classes from CLASSPATH [duplicate]

Tags:

java

classpath

I have a jar file with the contents ($ unzip -l output.jar):

Archive:  output.jar
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2013-07-08 17:57   META-INF/
      120  2013-07-08 17:57   META-INF/MANIFEST.MF
        0  2013-07-08 17:43   some/
        0  2013-07-08 17:43   some/package/
     1247  2013-07-08 17:57   some/package/Main.class
     2032  2013-07-08 17:57   some/package/plsql_o12_lexer$DFA22.class
     8022  2013-07-08 17:57   some/package/plsql_o12_lexer$DFA23.class
   212573  2013-07-08 17:57   some/package/plsql_o12_lexer.class
---------                     -------
   223994                     11 files

Contents of META-INF/MANIFEST.MF is:

Manifest-Version: 1.0
Created-By: 1.6.0_27 (Sun Microsystems Inc.)
Main-Class: some.package.Main

However, running the command $ echo $CLASSPATH; java -jar output.jar. Notice the CLASSPATH variable is set.

/usr/share/java/antlr3-runtime-3.2.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/antlr/runtime/CharStream
Caused by: java.lang.ClassNotFoundException: org.antlr.runtime.CharStream
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: some.package.Main. Program will exit.

Running the command $ java -classpath /usr/share/java/antlr3-runtime-3.2.jar -jar output.jar yields the exact same result. I have also tried .:/usr/share/java/antlr3-runtime-3.2.jar and .:./output.jar:/usr/share/java/antlr3-runtime-3.2.jar as classpaths, same result. The file antlr3-runtime-3.2.jar DOES contain the class org.antlr.runtime.CharStream, I have checked.

However, running java -verbose -jar output.jar gives result that contains the line:

[Loaded some.package.Main from file:/home/jan/projects/antlr-plsql/output.jar]

My java is:

java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.5) (6b27-1.12.5-0ubuntu0.12.04.1)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)

Why doesn't Java work the way it is supposed to?

like image 644
Honza Avatar asked May 04 '26 11:05

Honza


2 Answers

Other classpath settings are ignored if the -jar switch is used as per the doc.

like image 103
McDowell Avatar answered May 06 '26 02:05

McDowell


Add the JAR to the Class-Path entry of the MANIFEST.MF, or add both JARs to your CLASSPATH variable and don't use the -jar flag.

like image 44
davidfmatheson Avatar answered May 06 '26 02:05

davidfmatheson