我在使用 ear 文件时遇到问题,无法在多个位置获取相同的库并因此产生冲突。问题是我们使用了很多我们根本无法控制的第 3 方库。所以,我们最终到处都抛出了很多排除项,这对我来说似乎不对,它有点容易出错,而且我们也没有在本地安装的 jboss 上检测到问题。
所以,我想执行某种预打包步骤,简单地删除重复的 jar 文件。如果部署在两个地方,请删除那些在依赖项目中的。例如 jboss-seam.jar 包含在我们使用的几个项目中。其中一些依赖项是通用的,包含在 parent.pom 中。一些依赖项是特定于 ejb 或特定于 web 的,因此包含在 ejb 和/或 web 项目中。在 ear 文件中,jboss-seam.jar 被包含在三个地方,并扰乱了类加载器。所以应该有一些机制来简单地检查一些简单的规则,比如,如果在耳边,不应该在 war 中,而不是必须创建带有排除的 xml-hell。
有没有更好的方法来处理这个问题?
最佳答案
听起来您正在使用 Maven 来构建您的工件?如果是这样,最好的办法是 <exclusions>
标签。
使用 mvn dependency:tree
自由应用grep
可以快速找到导致传递依赖项冲突版本的第 3 方工件。
我理解你对此的看法似乎不对,在一个完美的世界中,每个人都应该更好地为他们发布的工件编写 POM,但这是一个不完美的世界......我实际上是甚至不确定它能否在所有情况下完美工作,也许对 maven 有更好了解的人可以详细说明。
在例如存在相同工件的情况下。两者 ear/lib/
和 ear/webapp/WEB-INF/lib
你可以使用 <scope>provided</scope>
在 webapp 的 POM 中:
<dependency>
<artifactId>spring-core</artifactId>
...
<scope>provided</scope>
</dependency>
至少在 Weblogic 上,如果你把 jar 放在 <earfile>/APP-INF/lib
中,默认情况下这是有效的文件夹,对于其他 EE 容器,我相信你可以实现相同的添加
<application>
<library-directory>APP-INF/lib</library-directory>
</application>
到application.xml
描述符。
希望对您有所帮助。
干杯,
关于java - 停止在 ear 文件中部署重复 jar 的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14643905/