43

現在経験しているように見えるランダムな順序ではなく、Maven2 で特定のクラスパスの順序を設定する方法を知っている人はいますか?

これを行う正当な理由はいくつかあります。

  • ベンダーは、以前にリリースされた jar のオーバーライド クラスを含むパッチ jar を提供したため、パッチ jar はクラスパスの順序で最初に表示される必要があります。
  • pom 依存関係をトラバースすることによって検出されたクラスパスで見つかった 2 つの jar には、異なる署名を持つ同じパッケージ内の同じクラスが含まれています。例えば:

jboss jbossall-client 4.2.0.GA

org.hibernate 休止状態 3.1

どちらにも org.hibernate.util.ReflectHelper.class が含まれていますが、jbossall-client バージョンには getFastClass メソッドがありません。

グーグルで調べてみると、これはおそらくMaven愛好家とこの特定の問題に直面している人々との間の論争点であることがわかりますが、クラスパスの順序付けには正当な理由があることは確かです.

この特定の難題を解決した人からのアドバイスは大歓迎です!

ありがとう

4

2 に答える 2

40

バージョン 2.0.9 以降、maven はクラスパスに pom オーダーを使用するため、実際に操作できるようになりました。私たちは、直接インクルードする外部ライブラリへの推移的な依存関係をほとんど抑制します。

Maven 2.0.9 のリリースノートから:

MNG-1412 / MNG-3111 は、クラスパスへの依存関係の決定論的順序付けを導入しました。以前は、セットの自然順序付けが使用されていたため、奇妙な結果が生じていました。順序は pom から保持され、継承によって追加された依存関係が最後に追加されます。依存関係が競合または重複しているビルドでは、これにより出力が変更される可能性があります。つまり、2.0.9 で奇妙な問題が発生した場合は、依存関係を調べて、どこかに競合がないかどうかを確認してください。

于 2009-04-27T12:00:27.497 に答える
2

Maven 2.0.9 では正しい順序付けが追加されているため、以下を機能させるにはそのバージョン以上が絶対に必要です。

次に、更新されたプラグインが必要です。Maven の連中は修正に取り組んでおり、jira で修正する必要がありますが、これは私が緊急に必要としていたものです。その間、私はこれを自分で修正しました。変更されたプラグインのソース コードを github から取得できます。

編集: http://jira.codehaus.org/browse/MECLIPSE-388を参照してください。

インストールする方法は 2 つあります。変更したコードをプルしてインストールするか、ビルド済みの jar をダウンロードして追加するだけです。

プラグインのビルド

チェックアウトしたプラグイン ディレクトリから実行maven installし、プロジェクト pom のプラグイン セクションに以下を追加します。

<build>
  </plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-eclipse-plugin</artifactId>
      <version>2.8-cpfix</version>
    </plugin>
  </plugins>
</build>

jar ファイルをダウンロードする

または、自分でダウンロードしてコンパイルしたくない場合は、jar ファイルを入手して自分でインストールすることもできます。

ファイルを実行したら

mvn install:install-file -Dfile=<path-to-file> -DgroupId=org.apache.maven.plugins \
    -DartifactId=maven-eclipse-plugin -Dversion=2.8-cpfix -Dpackaging=jar

実行時にどのようにインストールしたかに関係なくmvn eclipse:eclipse、変更されたコードが取得され、pom ファイルで定義した順序に基づいて依存関係が並べ替えられます。アルファベット順ではありません。また、依存関係の最上位に JRE コンテナーを配置します。

このコードの実際のバージョンがすぐに公開されることを願っていますが、それまでの間、この修正は私のプロジェクトでうまく機能しており、他の人にも役立つことを願っています.

于 2010-07-17T17:06:53.580 に答える