我有2个依赖项,这些依赖项因彼此冲突而臭名昭着:Apache Spark& json4s。
在这个json4s问题中描述了但不是最终的详细信息:
https://github.com/json4s/json4s/issues/274
我更喜欢简单而残酷的解决方案:添加我自己的json4s依赖项,并在有JAR地狱时重新定位它们:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<outputFile>${project.build.directory}/${assembly.jar.dir}/${assembly.jar.basename}</outputFile>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<relocations>
<relocation>
<pattern>org.json4s</pattern>
<shadedPattern>org.my-project.json4s</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
不幸的是,这个插件只影响封装阶段,在封装阶段之前是测试阶段,根本不会从重定位中受益。因此,maven测试经常会抛出错误警报,而不会影响打包的全包JAR,和/或无法检测到重定位导致的错误。
我正在寻找一套一致的maven插件套件,可以保证套件的重新定位和安装。无论java程序是由maven测试还是java程序在生产中打包和部署,类加载顺序都是相同的。对于应该存在很长时间的maven构建模型来说,这似乎是一个简单而枯燥的任务。但是,当我搜索'maven relocation'时。我只能找到有限的资源,其中大部分都是指maven-shade插件。
那么我该如何才能可靠地解决这个问题并使maven测试真正有用呢? (如果它与您的生产程序无关,那么测试的重点是什么?)如果没有开箱即用的解决方案,那么编写我自己的maven插件有多难?
PS :我试图将构建工具链迁移到OSGI,但事实证明它的维护要少得多,并导致一组不同的错误和维护成本。所以我最终放弃了,回到了maven。