【问题标题】:How to fix "NoClassDefFoundError" for a package inside a package如何修复包内包的“NoClassDefFoundError”
【发布时间】:2021-08-17 13:20:57
【问题描述】:

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 

它有嵌套包,一个包在另一个包中。

当我编译主类时,即“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

请帮我解决这个错误。

【问题讨论】:

  • 你在同一个模块中有所有这些类吗?是否可以共享一个复制器项目?
  • 我在每个代码 sn-p 之前都提到了文件位置,为简单起见,我添加了文件夹视图。希望这能有所帮助。

标签: java package dependencies noclassdeffounderror


【解决方案1】:

解决您的问题的一个简单方法是重组您的目录。将源文件和类存储在单独的目录中是一种很好的做法,通常是“src”和“classes”。然后使用--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 上用':' 或';' 分隔在窗户上。 Linux:

java -cp .:./classes A

窗户:

java -cp .;d:\path\to\directory\classes A

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    相关资源
    最近更新 更多