在将JMockit与JUnit和Android一起使用时,我在Maven编译时遇到了问题:
[INFO]意外的顶级例外:[INFO] java.lang.IllegalArgumentException:已添加: Ljunit /框架/ TestResult中$ 1;
至少JUnit和JMockit包含TestResult,所以我考虑使用shade插件来排除这些文件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>com.googlecode.jmockit:jmockit</artifact>
<excludes>
<exclude>junit/framework/**</exclude>
</excludes>
</filter>
<filter>
<artifact>junit:junit</artifact>
<excludes>
<exclude>junit/framework/**</exclude>
</excludes>
</filter>
</filters>
<minimizeJar>true</minimizeJar>
</configuration>
</execution>
</executions>
</plugin>
不幸的是我仍然遇到这些错误。任何想法在这里有什么问题或者我误解了这个插件的含义?或者你可能知道一个更好的解决方案来消除与Maven的多个包冲突?
(与此同时,我从jar中手动解压缩并删除了冲突的依赖项,并将所有包重新打包到一个超级jar中并将其安装到本地存储库中。这样做。但我仍然会对更专业的解决方案感兴趣)
答案 0 :(得分:1)
据我所知,没有好办法解决你的问题。通常在Maven中,您将从JMockit框架中排除对Junit的有问题的传递依赖性。然而,JMockit有一些maven第三方罐子有同样的问题。他们在JMockit jar中包含了Junit依赖项,而不是在JMockit的pom中声明依赖项。请参阅exclude dependencies当JMockit打包得更友好时,如何使用maven解决这个问题。
但是没有办法指定你想用maven依赖机制从JMockit依赖项中删除一些类。
因此,您已经选择了正确的方法来创建正确的jar文件并将其放入存储库中。唯一可能更好的是不要手动完成。创建一个新的maven模块,为你创建这个模块,并在你的android项目中将其用作依赖。
新模块只依赖于Junit和JMockit而没有源代码,并且会有以下的插件插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
由于这个模块是jar模块而不是用Android编译,所以它没有任何重复类的问题,而shang插件只会打包一个TestResult类。如果你想确保打包正确的一个,你仍然可以使用过滤来排除JMockit类并依赖JUnit一次。
使用额外的模块,您可以确保将该过程记录为pom文件,您可以轻松切换到较新的JUnit或JMockit版本。此外,您不会依赖安装在本地存储库中的文件,该文件可能被意外删除或在其他PC上丢失。
答案 1 :(得分:0)
不确定你是什么意思,你在maven编译期间遇到错误?
无论如何,我相信你根本不应该将你的JUnit依赖包装到“uber-jar”,你应该只在maven测试范围中使用它们:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.vesrion}</version>
<scope>test</scope>
<dependency>
<dependency>
<groupId>com.googlecode.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>${jmockit.vesrion}</version>
<scope>test</scope>
<dependency>