11

私は現在、Maven でビルドされ、jar として配布されている Java テスト ライブラリを持っています。私のプロジェクトは非常に一般的なライブラリ (Objectweb ASM) に依存しており、互換性のない以前のバージョンの ASM が既にクラスパスにあるという問題が発生しました。したがって、jarjar-maven-pluginを使用して jar を作成し、別のバージョンの ASM と競合しないように ASM を内部的に再パッケージ化しました。

これは正常に実行され、私のライブラリは依存関係として問題なく取り込めます。

ただし、私のプロジェクトには ASM に対するコンパイル スコープの依存関係があるため、クライアント プロジェクトが私のライブラリを追加するたびに、推移的な依存関係もすべて取り込まれます。したがって、仮に、彼らが特定のバージョンの ASM を使用していて、私が依存しているバージョンもクラスパスに追加した場合、未定義の動作が発生します。この状況を回避し、Maven が推移的な依存関係を不必要かつ潜在的に危険にさらすことなく、クライアントが JarJar'd アーティファクトに依存できるようにしたいと考えています。

ユーザーが推移的な依存関係を取得せずに依存できる JarJar'd アーティファクトを作成するにはどうすればよいですか?

4

3 に答える 3

17

jarjar-maven-plugin を捨てて、maven-shade-plugin に戻すことで、この問題の解決策を見つけました。これにより、独自の名前空間内でクラスを再パッケージ化し、jar のメイン クラスを設定し、重要なことに、生成された pom を書き換えて、現在バンドルされているコンパイル時の依存関係を含めないようにすることができます。

これを達成した私の pom.xml の部分は次のとおりです。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<executions>
    <execution>
        <phase>package</phase>
        <goals>
            <goal>shade</goal>
        </goals>
        <configuration>

            <shadedArtifactAttached>false</shadedArtifactAttached>
            <createDependencyReducedPom>true</createDependencyReducedPom>

            <relocations>
                <relocation>
                    <pattern>org.objectweb.asm</pattern>
                    <shadedPattern>${repackage.base}.org.objectweb.asm</shadedPattern>
                </relocation>
            </relocations>
            <transformers>
                <transformer
                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                    <mainClass>${package.base}.my.MainClass</mainClass>
                </transformer>
            </transformers>
        </configuration>
    </execution>
</executions>

この構成の重要な部分は次のとおりです。

  • shadedArtifactAttachedfalse に設定すると、影付きの jar が通常生成されるメインのアーティファクトに置き換わることを意味します。これはデフォルトで false ですが、指摘する価値があります。
  • createDependencyReducedPomtrue に設定すると、shaded jar がデプロイまたはインストールされるときに、デプロイされる pom.xml には、jar に再​​パッケージ化されたコンパイル スコープの依存関係が含まれないことを意味します。
  • relocationこれらの要素は、依存関係内のファイルが影付きの jar に再​​パッケージ化される方法を構成します。上記の例では、正規名が で始まるクラスはすべてorg.objectweb.asmに移動されるため${package.base}.org.objectweb.asm、jar にパッケージ化されると、jar 内に同等のファイル パスが含まれます。

この構成では、プロジェクトがデプロイされたときに、クライアントがプロジェクトでコンパイル スコープの依存関係を宣言すると、シェーディングされた jar のみが取り込まれ、推移的な依存関係は取り込まれません。

于 2011-04-20T08:53:49.923 に答える
1

代わりにmaven-shade-pluginを試すことを検討してください。これにより、あらゆる種類の微調整が可能になります。

于 2011-04-20T02:24:23.007 に答える
0

おそらく、<optional>属性の設定はあなたの場合にはうまくいくでしょう。Javaテストライブラリpomで次のようなものを指定します。

  <dependencies>
    <dependency>
      <groupId>asm.group</groupId>
      <artifactId>asm</artifactId>
      <version>x.y</version>
      <optional>true</optional>
    </dependency>
    ...
  </dependencies>
于 2011-04-20T02:00:29.180 に答える