如何在maven测试阶段重新定位包?

时间:2016-10-26 02:49:43

标签: maven automated-tests packaging maven-shade-plugin

我有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。

0 个答案:

没有答案