NoClassDefFound when running a jar

天大地大妈咪最大 提交于 2019-12-12 04:55:22

问题


I built a jar using IntelliJ, setting the main class properly.

When I run "java -jar foo.jar" from the command line (Windows), I get an exception that claims the main file is missing. The main class looks something like:

package mypackage;

public class LockUtil {
  public static void main(String[] args) {
  ...

I'm getting the following exception:

Exception in thread "main" java.lang.NoClassDefFoundError: mypackage/LockUtil
Caused by: java.lang.ClassNotFoundException: mypackage.LockUtil
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: mypackage.LockUtil. Program will exit.

The manifest file contains:

Manifest-Version: 1.0
Created-By: IntelliJ IDEA
Main-Class: mypackage.LockUtil

And the jar contains the appropriate directory structure with the .class file.


回答1:


If you do java -tf foo.jar, do you see something like this?

META-INF/
META-INF/MANIFEST.MF
mypackage/
mypackage/LockUtil.class

Could it be that there is another directory level in there somewhere?

You can be sure that Java knows the main file is there by building the jar file with something like this:

jar cfe foo.jar mypackage.LockUtil mypackage/LockUtil.class



回答2:


You're trying to execute mypackage.LockUtil, but you should use mypackage.locking.LockUtil (note the package statement at the beginning of the class.).

Another possibility is that you have moved the class and forgot the update the package statement.




回答3:


Does LockUtil have a dependency on another class that is not resolvable, thereby not allowing LockUtil to load?




回答4:


It seems that the name of your package is mypackage.locking and not only mypackage




回答5:


It appears that your main-class definition in your manifest is pointing at mypackage/LockUtil rather than mypackage/locking/LockUtil.

-Rick



来源:https://stackoverflow.com/questions/1074955/noclassdeffound-when-running-a-jar

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!