天天看點

java指令行運作 classnotfound,運作java -jar時的java.lang.ClassNotFoundException

java指令行運作 classnotfound,運作java -jar時的java.lang.ClassNotFoundException

I'm using ant to build my build.xml file, it compiles ok, but then getting a runtime java.lang.NoClassDefFoundError when running the resulting jar via "java -jar my_jar.jar". It seems like this comes up a lot but none of the related questions' solutions worked for me.

My classpath for javac contains only "/usr/local/lib/libthrift.jar" and the main .java file imports a bunch of thrift packages such as org.apache.thrift.transport.TTransportException.

When I try running the program via:

java -jar MyClass.jar

, I get the error:

Exception in thread "main" **java.lang.NoClassDefFoundError**: org/apache/thrift/transport/TTransportException

Caused by: java.lang.ClassNotFoundException: org.apache.thrift.transport.TTransportException

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:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

Could not find the main class: **MyClass**. Program will exit.

Here are the things I've tried so far that don't work:

adding a flag on the command line like "java -cp /usr/local/lib/libthrift.jar -jar my_jar.jar", the result is the same error as above

adding <attribute name="Class-Path" value="./:/usr/local/lib/libthrift.jar"/> inside my jar's manifest> tag, the result is the same error as above

adding -Xbootclasspath/a:/usr/local/lib/libthrift.jar:./ to the java command line. it solves the first error but a different error comes up:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger

at org.apache.thrift.transport.TServerSocket.(TServerSocket.java:36)

at MyClass.start(Unknown Source)

at MyClass.main(Unknown Source)

EDIT:

If I comment out the code that instantiates the missing classes but leave the imports, the code executes fine.

EDIT:

I moved my java classes to a server and referenced the MainClass with the server in the manifest attribute, but that didn't fix anything.

解決方案

Could not find the main class: MyClass

The error seems actually related to your MANIFEST which:

may not have a complete classpath Class-Path: see this HowTo

The best solution when you have a jar is to try to include the required jars into the manifest declaration.

Manifest-Version: 1.0

Class-Path:

customer_client.jar

mailer_client.jar

signon_client.jar

or may not define adequately the MainClass within your 'my_jar.jar'.

basedir="."

includes="**/*.class"

manifest="MANIFEST.MF"

/>

the needs to specify the full path (packages) of the MainClass, not just MainClass.

If your main class is in the default package (the unnamed package), I am not sure it can be referenced by the loader (see this SO question)

So move your JarRunner into a package, and declare it appropriately in the element.