2009-07-02 36 views
0

我使用IntelliJ构建了一个jar,正确设置了主类。NoClassDef运行罐子时发现

当我从命令行(Windows)运行“java -jar foo.jar”时,出现声称主文件丢失的异常。主类看起来类似:

package mypackage; 

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

,我发现了以下异常:

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. 

清单文件包含:

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

而且罐子包含适当的目录结构.class文件。

回答

1

您正在尝试执行mypackage.LockUtil,但您应该使用mypackage.locking.LockUtil(请注意在课程开始处的package声明)。

另一种可能性是您已将课程搬迁并忘记更新package声明。

+0

对不起,这是一个错误张贴 - 实际包名是正确的,但...(我更新了问题) – ripper234 2009-07-02 15:11:55

0

看来,你的包的名称mypackage.locking不仅mypackage的

0

看来,你的清单你的主类的定义是在mypackage的指向/ LockUtil而不是mypackage中/锁定/ LockUtil。

-Rick

2

如果你这样做java -tf foo.jar,你看到这样的事情?

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

难道还有另外一个目录级别在那里的某个地方?

你可以确保Java知道主文件有通过构建jar文件像这样的东西:

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

确实LockUtil对另一类是无法解析的依赖,从而不允许LockUtil加载?