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

如何在maven测试阶段重新定位包?,maven,automated-tests,packaging,maven-shade-plugin,Maven,Automated Tests,Packaging,Maven Shade Plugin,我有两个相互冲突的依赖项:apachespark和json4s 本json4s版本中描述了详细信息,但不是决定性的: 我更喜欢简单而残酷的解决方案:添加我自己的json4s依赖项,并在出现JAR地狱时重新定位它们: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin&l

我有两个相互冲突的依赖项:apachespark和json4s

本json4s版本中描述了详细信息,但不是决定性的:

我更喜欢简单而残酷的解决方案:添加我自己的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>

org.apache.maven.plugins
maven阴影插件
2.4.3
${project.build.directory}/${assembly.jar.dir}/${assembly.jar.basename}
*:*
META-INF/*.SF
META-INF/*.DSA
META-INF/*.RSA
包裹
阴凉处
假的
org.json4s
org.my-project.json4s
不幸的是,这个插件只影响包阶段,它前面是测试阶段,而测试阶段根本不能从重新定位中获益。因此,maven测试经常抛出错误警报,这些警报根本不会影响打包的全包JAR,和/或无法检测由重新定位引起的错误

我正在寻找一套一致的maven插件,它可以保证包重定位和类加载顺序是相同的,无论java程序是由maven测试的,还是java程序是在生产中打包和部署的。对于本应长期存在的maven构建模型来说,这似乎是一项简单而乏味的任务。然而,当我搜索“maven搬迁”时。我只能找到有限的资源,其中大部分是指maven shade插件

那么,我应该做些什么来可靠地解决这个问题并使maven测试真正有用呢?(如果它与您的生产程序无关,那么测试有什么意义?)如果没有现成的解决方案,那么编写自己的maven插件有多难


PS:我曾尝试将构建工具链迁移到OSGI,但结果发现它的维护性要差得多,并导致了一组不同的错误和维护成本。因此,我最终放弃了,转而求助于maven。

如果您依赖于打包,则需要在集成测试阶段而不是测试阶段将测试作为集成测试运行。此外,您所说的:
结果是,maven test经常抛出错误警报,这些警报根本不会影响打包的全包JAR,和/或无法检测由重新定位引起的错误。
。你在那里测试什么?maven测试不重新定位,打包的JAR重新定位,这在java类之间造成了差异,因此出现了一些新错误,一些旧错误消失了。说到集成测试,它从1开始就不能使用。这是一个多模块的项目&maven shade插件只在最后一个模块中使用,在这一点上可以进行的测试很少。2.spark的类加载顺序与java应用的类加载顺序完全不同,因此,它仍然不能保证成功。集成可以依靠maven shade部分来完成,而且集成测试可以作为一个独立的模块来完成,该模块依赖于适当的模块。如果您依赖于打包,则需要在集成测试阶段而不是测试阶段作为集成测试来运行测试。此外,您所说的:
结果是,maven test经常抛出错误警报,这些警报根本不会影响打包的全包JAR,和/或无法检测由重新定位引起的错误。
。你在那里测试什么?maven测试不重新定位,打包的JAR重新定位,这在java类之间造成了差异,因此出现了一些新错误,一些旧错误消失了。说到集成测试,它从1开始就不能使用。这是一个多模块的项目&maven shade插件只在最后一个模块中使用,在这一点上可以进行的测试很少。2.spark的类加载顺序与java应用程序的类加载顺序完全不同,因此仍然不能保证成功。集成可以依靠maven shade部分来完成,而且集成测试可以作为一个单独的模块来完成,依赖于适当的模块。