从子文件夹导入包:线程“main”java.lang.noclassdeffounderror中出现异常

eeq64g8w  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(409)

我有这样的目录结构:

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
fnatzsnv

fnatzsnv1#

如果 MyPackageFile1.java 以及 MyPackageFile1.java 在包中声明 com.example ,那么就有三个问题:
源目录结构错误。应该是这样的:

src
   com
      example
         MyPackageFile1.java
         MyPackageFile2.java

您使用了错误的类路径分隔符。因为您使用的是linux(基于路径名语法),所以类路径分隔符是 : 不是 ; .
用于运行代码的类路径错误。这个 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

你应该使用某种构建工具。。。如果你希望你的构建是一致的和可复制的。

tzdcorbm

tzdcorbm2#

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

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

哪里 Example.java 移动到新目录 src/com/something

相关问题