【问题标题】:Does not use library from another module of same project in Idea不使用 Idea 中同一项目的另一个模块中的库
【发布时间】:2016-04-08 09:35:34
【问题描述】:

我有一个相当小的项目,由一个无状态 EJB + 一个 servlet 组成。 EJB 应该从 MongoDB 收集数据。 Servlet 应该注入这些 EJB。 就是这样。

我已将 mongo-java-driver 包含在项目库中。一切都编译得很好,但是在部署阶段,其中一个模块失败了

Caused by: java.lang.ClassNotFoundException: org.bson.conversions.Bson

这个类位于 mongo-java-driver。

Idea 生成两个工件:一个具有 META-INF 和两个类(servlet 和 ejb)。第二个工件包含 WEB-INF 以及两个类和带有 mongo-java-driver 的 lib 目录。

我应该以某种方式将 mongo-java-driver 添加到第一个工件吗?或者扩大驱动程序对第一个工件可用的范围?

尝试手动添加 META-INF/lib/mongo-java-driver.jar - 它没有帮助。

如果删除 EJB 并从 servlet 使用 mongo - 一切都很好。

【问题讨论】:

  • 您有机会发布您的项目吗?

标签: jakarta-ee intellij-idea wildfly


【解决方案1】:

您需要从 ejb 模块中导入 mongo-java-driver。 WAR类是隔离的,所以ejb模块cannot use them

ear-subdeployments-isolated 元素值对 .war 文件的隔离类加载器。即无论是否 此标志设置为 true 或 false,.ear 中的 .war 将具有 .ear 中的隔离类加载器和其他子部署将 无法从该 .war 访问类。这符合规范。

如果您将 ejb 和 war 模块都打包到 ear - mongo-java-driver.jar 的正确位置是 <ear-root>/lib

另见:Class Loading in Deployments

【讨论】:

  • 我找不到如何“从 Idea 中的 ejb 模块导入 mongo-java-driver。但是将两个工件打包到单个 EAR 解决了这个问题,并且 Idea 使用 mongo-driver 自动添加了 lib 目录. 非常感谢!
  • 当您有一个 maven 项目并将 ejb 和 war 打包到一个耳朵中时 - 您有 3 个 pom.xml 文件:ear 的父文件和 ejb 和 war 的子文件。因此,您可以将依赖项添加到 ejb 的 pom.xml 或 war 的 pom.xml。在后一种情况下,ejb 模块不能使用此依赖项,因为它将打包到 war 并隔离。这就是为什么我建议“从 ejb 模块导入 mongo-java-driver”。
  • 我还没有使用 maven,因为它重复了 Idea 的功能并且非常不友好。幸运的是,您的建议帮助解决了 Idea 的问题。
  • 事实上,idea 与 maven 集成得非常好——它可以导入 maven 项目并在运行时将其设置与 pom.xml 同步。如果您使用 maven - 您不依赖任何特定的 ide(假设您的同事喜欢 eclipse :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2021-10-17
  • 1970-01-01
  • 2021-11-20
  • 2013-07-24
相关资源
最近更新 更多