0

将 JMockit 与 JUnit 和 Android 一起使用时,我在 Maven 编译时遇到了问题:

[信息] 意外的顶级异常:[信息] java.lang.IllegalArgumentException:已添加:Ljunit/framework/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 中手动解压缩并删除了冲突的依赖项,并将所有软件包重新打包到一个 uber jar 中并将其安装到本地存储库中。这可行。但我仍然对更专业的解决方案感兴趣)

4

2 回答 2

1

据我所知,没有很好的方法可以解决您的问题。通常在 Maven 中,您会从 JMockit 框架中排除对 Junit 的有问题的传递依赖。然而,JMockit 也有一些 maven 第三方 jar 的问题。他们在 JMockit jar 中包含了 Junit 依赖项,而不是在 JMockit 的 pom 中声明依赖项。当 JMockit 被打包成对 maven 更友好时,请参阅排除依赖项如何使用 maven 解决这个问题。

但是没有办法指定要使用 maven 依赖机制从 JMockit 依赖中删除一些类。

因此,您已经选择了创建正确 jar 文件并将其放入存储库的正确方法。唯一可能更好的是不要手动进行。创建一个新的 maven 模块,为您创建它并将其用作您的 android 项目中的依赖项。

新模块仅依赖于 Junit 和 JMockit,没有源代码,并且具有以下 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>
                </execution>
            </executions>
        </plugin>

由于这个模块是 jar 模块,而不是用 Android 编译的,所以没有任何重复类的问题,并且 shade 插件只会打包一个 TestResult 类。如果您想确保打包正确的,您仍然可以使用过滤来排除 JMockit 类并依赖 JUnit 一次。

使用一个额外的模块,您可以确保将流程记录为 pom 文件,并且您可以轻松切换到更新的 JUnit 或 JMockit 版本。此外,您不会依赖安装在本地存储库中的文件,该文件可能会被意外删除或在其他 PC 上丢失。

于 2013-05-19T21:13:37.187 回答
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>
于 2013-05-20T08:40:57.707 回答