如何修复包内包的 "NoClassDefFoundError"
How to fix "NoClassDefFoundError" for a package inside a package
Java 计划
文件位置:..\new1\packageEG\B.java
package packageEG ;
public class B
{
public void display()
{
System.out.println("B") ;
}
}
文件位置:..\new1\C.java
package new1 ;
import packageEG.B ;
public class C
{
public void display()
{
B b = new B() ;
b.display() ;
}
}
文件位置:..\A.java
import new1.C ;
public class A
{
public static void main(String[] args)
{
C c = new C() ;
c.display() ;
}
}
文件夹视图
../
A.java
new1/
C.java
packageEG/
B.java
它有嵌套包,一个包在另一个包里。
当我编译 main class 即“A”时,它编译成功但是当我 运行 这个程序时它显示以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: packageEG/B
at new1.C.display(C.java:7)
at A.main(A.java:7)
Caused by: java.lang.ClassNotFoundException: packageEG.B
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 2 more
请帮我解决这个错误。
解决您的问题的一个简单方法是重组您的目录。将源文件和 类 存储在单独的目录中是一个很好的做法,通常是“src”和“类”。然后使用 --class-path
选项编译。
以您的情况为例,我们可以将您的项目结构视为(我们也可以将 A.java
放在 src
目录中,但为了与您的代码结构保持一些相似性,让我们考虑这个):
tree
.
├── A.java
└── src
└── com
└── xyz
├── B.java
└── C.java
使用JDK编译源码,需要使用-d
选项指定编译后的基目录类,即classes
,如下:
javac -d classes src/com/xyz/B.java src/com/xyz/C.java
现在编译 A.java
使用 -cp
或 --class-path
选项指定包 com.xyz
的基本目录以便找到 com.xyz.C
.
javac -cp ./classes/ A.java
现在目录结构如下:
tree
.
├── A.class
├── A.java
├── classes
│ └── com
│ └── xyz
│ ├── B.class
│ └── C.class
└── src
└── com
└── xyz
├── B.java
└── C.java
到 运行,显式设置 CLASSPATH
变量以包括 CLASSPATH
中的当前目录(使用 '.' 表示)以及包的基本目录 com.xyz
在 linux 或 ';' 上用 ':' 分隔在 windows 上。
Linux:
java -cp .:./classes A
Windows:
java -cp .;d:\path\to\directory\classes A
Java 计划
文件位置:..\new1\packageEG\B.java
package packageEG ;
public class B
{
public void display()
{
System.out.println("B") ;
}
}
文件位置:..\new1\C.java
package new1 ;
import packageEG.B ;
public class C
{
public void display()
{
B b = new B() ;
b.display() ;
}
}
文件位置:..\A.java
import new1.C ;
public class A
{
public static void main(String[] args)
{
C c = new C() ;
c.display() ;
}
}
文件夹视图
../
A.java
new1/
C.java
packageEG/
B.java
它有嵌套包,一个包在另一个包里。
当我编译 main class 即“A”时,它编译成功但是当我 运行 这个程序时它显示以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: packageEG/B
at new1.C.display(C.java:7)
at A.main(A.java:7)
Caused by: java.lang.ClassNotFoundException: packageEG.B
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 2 more
请帮我解决这个错误。
解决您的问题的一个简单方法是重组您的目录。将源文件和 类 存储在单独的目录中是一个很好的做法,通常是“src”和“类”。然后使用 --class-path
选项编译。
以您的情况为例,我们可以将您的项目结构视为(我们也可以将 A.java
放在 src
目录中,但为了与您的代码结构保持一些相似性,让我们考虑这个):
tree
.
├── A.java
└── src
└── com
└── xyz
├── B.java
└── C.java
使用JDK编译源码,需要使用-d
选项指定编译后的基目录类,即classes
,如下:
javac -d classes src/com/xyz/B.java src/com/xyz/C.java
现在编译 A.java
使用 -cp
或 --class-path
选项指定包 com.xyz
的基本目录以便找到 com.xyz.C
.
javac -cp ./classes/ A.java
现在目录结构如下:
tree
.
├── A.class
├── A.java
├── classes
│ └── com
│ └── xyz
│ ├── B.class
│ └── C.class
└── src
└── com
└── xyz
├── B.java
└── C.java
到 运行,显式设置 CLASSPATH
变量以包括 CLASSPATH
中的当前目录(使用 '.' 表示)以及包的基本目录 com.xyz
在 linux 或 ';' 上用 ':' 分隔在 windows 上。
Linux:
java -cp .:./classes A
Windows:
java -cp .;d:\path\to\directory\classes A