在构建具有许多依赖项的Maven项目时,其中一些依赖项依赖于同一库,但使用的版本不同,这会在运行应用程序时导致错误。
例如,如果我添加两个不同的项目依赖项,A和B都依赖于apachecommonshttp客户端,但每个依赖于不同版本,则一旦类加载器加载了A的apachecommons http客户端类,B就会尝试使用它们,因为它们已经由类加载器加载。
但是B的字节码取决于所加载类的不同版本,从而在运行应用程序时引起多个问题。一个常见的方法是methodnotfound异常(因为A的http客户端版本不再使用特定的方法)。
建立避免此类冲突的总体策略是什么?是否需要手动检查依赖关系树以找出哪些公共库相互冲突?
欢迎来到maven依赖地狱,众所周知。随着项目的发展和引入更多的外部依赖关系,这在某种程度上是一个普遍的问题。
除了Apache Commons(在您的原始问题中提到)外,日志记录框架(log4j,slf4j)是另一个常见的元凶。
我同意“席子”提出的关于一旦解决冲突就如何解决冲突的建议。在及早发现这些版本冲突方面,您还可以使用maven“ enforcer”插件。请参阅“
dependencyConvergence”配置
。
使用强制实施程序插件将在版本冲突时立即使构建失败,从而使您免于手动检查。这是一种激进的策略,但是可以防止提示您问题/帖子的运行时问题类型。像其他任何东西一样,强制执行器插件也有其优点和缺点。我们在去年开始使用它,但是后来发现它既是福也是祸。许多版本的lib
/
frameworks是向后兼容的,因此在编译时和运行时都可以(直接或间接)依赖1.2.3和1.2.4两个版本。但是,强制执行程序插件将标记此冲突,并要求您准确声明所需的版本。假设依赖性冲突的数量很少,那么这不需要太多工作。但是,一旦引入了大型框架(例如SpringMVC),它就会变得讨厌。
希望这是有用的信息。
问题内容: 是否有Maven的“阶段”或“目标”来简单地执行Java类的主要方法?我有一个项目,希望通过简单地执行诸如“ mvn run”之类的操作来进行手动测试。 问题答案: 请参阅exec maven插件。你可以使用以下命令运行Java类: 调用就像插件配置在中一样简单。Mojohaus上的插件站点上有一个更详细的示例。
我正在做的项目需要同时使用Elasticsearch和一个依赖项(我没有设计也没有指定它的设计),该依赖项使用Lucene,这两个依赖项之间存在版本冲突。当我尝试启动项目时,下面的错误被吐出来 任何关于是否可以解决而不能够规定依赖或弹性搜索的设计的想法?
我正在尝试使用NuGet Package Manager控制台将更改部署到数据库。当我发出命令时,该命令失败,并显示一条错误消息: 我的项目目标。NET 4.5.2,据我所知,它提供了在版本。因此,关联库不会放在二进制输出目录中。当我下载版本(Nuget包版本4.3.2)并将其复制到二进制输出目录,以及我的DLL时,我会收到另一条错误消息: 在这两种情况下,例外情况都是并将其抛出到Microsof
我正在开发一个应用程序和一个库(Android模块)。它们在不交互时没有问题:在导入库后,Android Studio搞乱了设置,我无法恢复。 和其他98个类似的:都与主题问题有关。 还有其他消息引用值、,例如:
null 项目包括Kotlin 某些库包括Kotlin 在选项2中,我得到下一个警告: w:类路径中的运行时JAR文件应该具有相同的版本。这些文件位于类路径:/.gradle/caches/transforms-2/files-2.1/ab41544fa06f7b55dec847efe3b9899c/jetified-kotlin-stdlib-jdk7-1.3.71.JAR(版本1.3).gra
我在使用commons-codec库时遇到(NoSuchMethodError)问题,这里有我的POM:`http://maven.apache.org/xsd/maven-4.0.0.xsd“>4.0.0 我使用了exclusions和dependencyManagement,但结果是相同的 有人能告诉我更好的解决这个问题的方法吗?