2016-03-28 72 views
0

我有这样的目录结构:导入包:异常在线程“主要” java.lang.NoClassDefFoundError

src 
    MyPackageFile1.java 
    MyPackageFile2.java 
vendor 
    something.jar 
Example.java 

注意src下的所有文件都有一个package com.example;声明,而Example.java不属于该包:它是该包的使用示例(因此它有import xyz.pushpad.*;)。

我成功编译:

javac -classpath vendor/something.jar src/*.java Example.java 

然而,当我运行:

java Example 

我得到:

Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" java.lang.NoClassDefFoundError: com/example/DeliveryException 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) 
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048) 
    at java.lang.Class.getMethod0(Class.java:3018) 
    at java.lang.Class.getMethod(Class.java:1784) 
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526) 
Caused by: java.lang.ClassNotFoundException: com.example.MyPackageFile1 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 7 more 
+0

引起:java.lang.ClassNotFoundException:com.example.MyPackageFile1 – Shark

回答

1

如果MyPackageFile1.javaMyPackageFile1.java封装com.example声明,则存在三个问题:

  1. 你的源代码目录结构是错误的。应该是这样的:

    src 
        com 
         example 
         MyPackageFile1.java 
         MyPackageFile2.java 
    
  2. 您正在使用错误的类路径分隔符。由于您使用的是Linux(基于路径名语法),因此类路径分隔符是:而不是;

  3. 您用于运行代码的类路径是错误的。该java命令行应该是这样的:

    java -cp vendor/something.jar:src:. Example 
    

然而,这一切都非常哈克。

  • 除非你的代码需要被模块化为多个代码树,那么你应该把你的示例源代码为src目录;例如

    src 
        Example.java 
        com 
         example 
         MyPackageFile1.java 
         MyPackageFile2.java 
    
  • 将源代码和编译代码放到同一个树中是一个坏主意。更好的主意是使用-d选项;例如

    mkdir bin 
    javac -cp bin:vendor/something.jar -d bin 
        src/Example.java 
        src/com/example/MyPackageFile1.java 
        src/com/example/MyPackageFile12java 
    
    java -cp bin:vendor/something.jar Example 
    
  • 您应该使用某种类型的构建工具...如果你想你的构建是一致性和可重复性。

1

类似于编译命令运行命令也需要罐子档案路径上的档案

java -cp vendor/something.jar;src com.example.Example 

其中Example.java移动到新的目录src/com/something

相关问题