当我们在 Eclipse 中执行 Java Web 应用程序时出现 NoClassDefFoundError

问题描述 投票:0回答:1

我有一个问题要提交,因为我很确定它存在一个简单的解决方案。

精度:

  • 我是系统管理员
  • 我发布此消息是因为我试图帮助我的同事开发人员暂时没有成功

我们有一个自制的共享库,我们将其称为“myLibrary”:它是一个 Java 库(构建时为 JAR),我们在许多独立应用程序(不是模块化应用程序)之间共享。

例如,该库提供了一个自制的抽象类来连接到 MongoDB。 在其 pom.xml 中:

  • 我们有很多依赖关系
  • 这些依赖项之一是 mongodb-driver-sync:
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.9.1</version>
</dependency>

我们的应用程序之一是 Java Web 服务器:

  • 我们将其称为“myApplication”
  • 在生产中,我们将应用程序部署在 Tomcat 服务器中

在myApplication的pom.xml中:

  • 我们明确声明了许多依赖项
  • 我们依赖于明确声明的“myLibrary”

当我们构建 WAR 时(借助 Eclipse 的“Maven Build”功能和/或通过我们的 CI/CD 管道),我们得到了一个 WAR,其中包含:

  • 显式声明所有依赖项
  • 明确声明的库 myLibrary
  • 我们隐式地获得了 myLibrary 的依赖项:因此,在 WEB-INF/lib 中,我们有 mongodb-driver-sync 的 JAR 文件

在这个级别,它工作得非常完美。

但是当我们尝试直接在 Eclipse 中执行此应用程序(实时开发会话/调试)时,我们遇到了问题。

在此上下文中,我们收到与 MongoDB 相关的错误 NoClassDefFoundError。 我们分析了很多,结果是这样的:

  • 当我们在 Eclipse 中执行应用程序时,Eclipse 会将应用程序部署到某个地方。我们找到了部署应用程序的目录:
    • 该目录包含一个目录WEB-INF/lib
      • 此 WEB-INF/lib 目录仅包含在 myApplication 的 pom.xml 中显式声明的依赖项:未嵌入 myLibrary 的依赖项
      • 如果我们手动添加缺少的 JAR(例如:MongoDB 驱动程序):它可以工作

我们测试了很多东西,但似乎没有任何效果,除非我们在 myApplication 的 pom.xml 中显式添加依赖项:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.9.1</version>
</dependency>

出于多种原因,我们希望避免这种情况。

有关我们环境的详细信息:

  • 日食:2023-03
  • JDK:1.8
  • Maven:3.8.7

有人有想法可以建议吗?

非常感谢。

我们尝试执行 mvn [...] eclipse:eclipse 但它失败了+我们在 Eclipse 中破坏了我们的项目。

我们尝试使用“Java Build Path”功能:

  • 添加“Maven 依赖项”
  • 删除“Maven 依赖项” -> 它失败了,但也许我们错过了一些东西

我们尝试使用“部署组装”功能:

  • 添加“我的图书馆”
  • 删除“我的图书馆” -> 它失败了,但也许我们错过了一些东西
java eclipse maven tomcat pom.xml
1个回答
0
投票

我找到了目前有效的解决方案。

在 myLibrary 的 pom.xml 中,我有这个:

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <revision>${revision}</revision>
[...]
    </properties>

解决方案是将变量 ${revision} 替换为硬编码值:

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <revision>1.0</revision>
[...]
    </properties>

现在看来它有效了。

© www.soinside.com 2019 - 2024. All rights reserved.