代码之家  ›  专栏  ›  技术社区  ›  Craig Otis

当类可用于类加载器时,在spring引导期间诊断noclassdeffounderror

  •  1
  • Craig Otis  · 技术社区  · 6 年前

    我有一个java/maven项目(基于pom),它 建造和发射都很好 使用时 java -jar 在命令行上由我的maven生成的uber jar上,使用 spring-boot-maven-plugin 以下内容:

                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <version>2.0.3.RELEASE</version>
                        <configuration>
                            <mainClass>com.company.Application</mainClass>
                        </configuration>
                        <executions>
                            <execution>
                                <goals>
                                    <goal>repackage</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
    

    这个jar被创建(~100MB),并且 按预期发射。

    但是,我无法在eclipse中使用右键单击pom中定义的主类上的run as-java应用程序配置来启动同一个应用程序。这是一个maven项目,m2e是最新的/刷新的,等等。

    错误是:

    java.lang.NoClassDefFoundError: Could not initialize class org.slf4j.LoggerFactory
    

    显然,日志框架存在一些依赖性问题。 然而: 我的第一个抓狂是, 为什么在使用cli的maven中工作,而在使用m2e的eclipse中失败?

    所以我去看了看这些路径,它们看起来一模一样。(查看eclipse中的maven依赖项列表,以及我的uber jar中包含的boot-inf目录)。

    slf4j-api        1.7.25
    log4j-over-slf4j 1.7.25
    logback-core     1.2.3
    logback-classic  1.2.3
    commons-logging  1.1.3
    

    所以,我调试了。 我在 NoClassDefFoundError ,并捕获了这个。注意,调试器在抛出异常时暂停,并且 监视表达式 在右上角是 getClass().getClassLoader().classes ,这是一个 Vector 是的。

    我们怎么可能 LoggerFactory ,即使这门课现在 ClassLoader 是吗?我下一步应该去哪里?

    enter image description here

    编辑: 因为它引起了一些混乱,eclipse在其中捕获到这个错误的类( Category.java )不是我的课。它在依赖项中(请参阅eclipse标题栏),因此无法修改。

    0 回复  |  直到 6 年前