【问题标题】:Can't solve java NoClassDefFoundError but everything looks right... any ideas?无法解决 java NoClassDefFoundError 但一切看起来都正确......有什么想法吗?
【发布时间】:2011-05-09 03:24:52
【问题描述】:

如果我没有提供足够的信息或不清楚任何事情,请提前抱歉,这是我第一次尝试使用 .bat.config 文件。

我正在使用一款学术软件,并尝试添加和运行我自己的组件。系统使用配置文件来启动系统所需的组件(类)列表,使用如下代码:

semaine.components = \
eu.semaine.examples.swimmer.SwimmerDisplay| \

系统正常运行,指定组件已初始化。

我使用以下代码将自己的组件添加到现有组件列表中:

eu.semaine.examples.TestPackage.MyTest| \

但是我得到以下错误:

java.lang.NoClassDefFoundError:eu/semaine/examples/TestPackage/MyTest(错误名称:TestPackage/MyTest)

我环顾四周,在我看来,我没有做任何通常会导致此错误的事情,例如我的类名与其存储的文件名匹配(公共类MyTest存储在MyTest.java中),MyTest在包TestPackage中并且文件结构中的文件夹也命名为TestPackage

任何想法或建议将不胜感激。

【问题讨论】:

    标签: java jar package directory


    【解决方案1】:

    你要求

    eu.semaine.examples.TestPackage.MyTest
    

    但假设您已将文件放在名为 TestPackage 的目录中。

    仔细查看批处理文件中指定的类路径。我的猜测是,对于初始冲突,您有一个像这样的目录层次结构,植根于指定的类路径

    eu
      semaine
        examples
            swimmer
               SwimmerDisplay
    

    在说 eu.semaine.examples.TestPackage.MyTest 时,您是说包将是“eu.semaine.examples.TestPackage”,目录层次结构现在将是

    eu
      semaine
        examples
            swimmer
               SwimmerDisplay.class
            TestPackage
               MyTest.class
    

    我想你打算改为:

    eu
      semaine
        examples
            swimmer
               SwimmerDisplay.class
    TestPackage
      MyTest.class
    

    并且说这个类只是

    TestPackage.MyTest
    

    不是

    eu.semaine.examples.TestPackage.MyTest
    

    [顺便说一句,我同意通常的约定是不将包名大写,但我不相信 Java 从大写中推断和语义。]

    【讨论】:

    • 嗨,我把所有东西都放在一个 jar 中,文件夹层次结构如下:myJar>eu>semaine>examples。示例包含游泳者文件夹(包含 SwimmerDisplay.class)和 TestPackage 文件夹(包含 MyTest.class)。我将尝试将包名称更改为小写以防万一。
    • 我认为您的 TestPackage 文件夹不应位于示例目录中,而应位于 Jar 的根目录中,并且您应该调整引用它的方式,如我在回答中所示。看看你的代码,如果它说包“TestPackage”那么我很确定我是对的。
    【解决方案2】:

    听起来您的类在启动时不在应用程序的类路径中。你提到.bat 文件。如果这就是您启动应用程序的方式,那么它应该包含一个组装类路径的部分。它必须包含 TestPackage 文件夹的父文件夹,以便 JVM 知道在哪里可以找到您的类文件。

    【讨论】:

      【解决方案3】:

      命名约定规定包名必须全部小写,参见http://download.oracle.com/javase/tutorial/java/package/namingpkgs.html

      我猜 jvm 认为 TestPackage 是一个类,而 MyTest 是一个内部类。

      【讨论】:

      • 更改了大小写,使其显示为“testpackage”,但这没有帮助。
      猜你喜欢
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 2021-09-25
      • 2022-01-28
      相关资源
      最近更新 更多