使用Maven排除文件不起作用

时间:2013-05-19 19:08:26

标签: android maven junit jmockit

在将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中并将其安装到本地存储库中。这样做。但我仍然会对更专业的解决方案感兴趣)

2 个答案:

答案 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>