web-dev-qa-db-ja.com

Mavenクラスパスの順序の問題

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

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

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

jboss jbossall-client 4.2.0.GA

org.hibernate hibernate 3.1

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

グーグルで見ると、これはおそらく、マヴァンファンとこの特定の問題に直面している人々の間の論争のポイントであることがわかりますが、確かにクラスパスの順序付けには正当な理由があります。

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

ありがとう

43
Brett Hannah

バージョン2.0.9以降、mavenはクラスパスにpom順序を使用するため、実際に操作できます。私たちは主に、直接含める外部ライブラリへの一時的な依存関係を抑制します。

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

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

39
krosenvold

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

次に、更新されたプラグインが必要です。 Mavenの担当者は修正に取り組んでいます。修正はジラで行われますが、これは緊急に必要なことです。その間、私はこれを自分で修正し、githubから Modified plugin source code をプルできます。

編集: 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 file を取得して自分でインストールすることができます。

ファイルを実行したら

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コンテナーを配置します。

うまくいけば、このコードの実際のバージョンがすぐに出てくると思いますが、当面の間、この修正は私のプロジェクトで機能し、他の人にも役立つことを願っています。

1
Paul Keeble