maven 在Eclipse中执行Java Web应用程序时出现NoClassDefFoundError

k4ymrczo  于 12个月前  发布在  Maven
关注(0)|答案(1)|浏览(104)

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

  • 我是系统管理员
  • 我发布这条消息是因为我试图帮助我的同事开发商没有成功的时刻

我们有一个自制的共享库,我们称之为“myLibrary”:它是一个Java库(构建时是一个编译器),我们在许多独立应用程序(而不是模块化应用程序)之间共享它。
例如,这个库提供了一个自制的抽象类来连接到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文件

在这个层面上,它工作得很完美。
但是当我们试图直接在Eclipse中执行这个应用程序时(实时开发会话/调试),我们遇到了一个问题。
在这个上下文中,我们得到了一个与MongoDB相关的错误NoClassDefFoundError。我们分析了很多,结果是这样的:

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

我们测试了很多东西,但似乎没有什么工作,除非我们在myApplication的pom.xml中显式地添加依赖项:

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

我们希望避免这种情况,原因有很多。
关于我们的环境:

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

请问有人有想法建议吗?
非常感谢
我们尝试执行mvn [...] eclipse:eclipse,但失败了,我们在Eclipse中破坏了我们的项目。
我们尝试使用“Java Build Path”功能:

  • 添加“Maven认证”
  • 删除“Maven的重复”->它失败了,但也许我们错过了一些东西

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

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

au9on6nz1#

我找到了一个暂时有效的解决办法。
在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>

现在看来,它的工作。

相关问题