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 では、問題のある Junit への推移的な依存関係を JMockit フレームワークから除外します。ただし、JMockit には一部の maven サードパーティ jar と同じ問題があります。彼らは、JMockit の pom で依存関係を宣言する代わりに、JMockit jar に Junit 依存関係を含めました。JMockit がより Maven フレンドリーにパッケージ化される場合に、maven でこれを解決する方法については、依存関係の除外を参照してください。

ただし、maven 依存関係メカニズムを使用して JMockit 依存関係からいくつかのクラスを削除するように指定する方法はありません。

したがって、正しいjarファイルを作成してリポジトリに配置する正しい方法をすでに選択しています。唯一の改善策は、手動で行わないことです。これを作成する新しい Maven モジュールを作成し、Android プロジェクトで依存関係として使用します。

新しいモジュールは Junit と JMockit のみに依存し、ソース コードには依存せず、次のシェード プラグイン conf を持ちます。

            <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 プラグインは 1 つの TestResult クラスのみをパッケージ化します。正しいものがパッケージ化されていることを確認したい場合でも、フィルタリングを使用して JMockit クラスを除外し、JUnit に一度依存することができます。

追加のモジュールを使用すると、プロセスが pom ファイルとして文書化され、新しい JUnit または JMockit バージョンに簡単に切り替えることができます。また、ローカル リポジトリにインストールされたファイルが誤って削除されたり、他の PC で見つからなかったりすることに依存することもありません。

于 2013-05-19T21:13:37.187 に答える