从子文件夹导入包:线程中的异常" main" java.lang.NoClassDefFoundError

时间:2016-03-28 12:33:42

标签: java compilation javac

我有这个目录结构:

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

2 个答案:

答案 0 :(得分:1)

与compile命令类似,run命令也需要类路径上的jar文件

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

Example.java移至新目录src/com/something

答案 1 :(得分:1)

如果在MyPackageFile1.java包中声明MyPackageFile1.javacom.example,则会出现三个问题:

  1. 您的源目录结构错误。它应该是这样的:

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

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

    java -cp vendor/something.jar:src:. Example
    
  4. 然而,这一切都非常黑客。

    • 除非您的代码库需要模块化为多个代码树,否则您应该将您的示例源代码放入src目录; e.g。

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

      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
      
    • 您应该使用某种构建工具......如果您希望构建一致且可重现。