2

私は大規模な Ivy プロジェクトを持っており、Eclipse では問題なく動作する私のコードが、ant で実行するとコンパイル エラーを引き起こすことに気付きました。問題を次の行に絞り込みました。

FileUtils.write(...). 

この行はコンパイル中に失敗します --- メソッドが見つかりません。明らかに、私のコードは apache の commons-io ライブラリに依存しています。そして、現在の commons-io にこのメソッドがあることは明らかです。

http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html

それで、何が得られますか?

これは私の ivy.xml に関連していると確信しています - > eclipse コンパイラは幸運にも (またはスマートに) commons-io の最新バージョンを使用していますが、私の ivy.xml はこの方法がない古いバージョンを使用しています。

ここで最も重要なことは、ant が明らかにこの jar の別のバージョンを使用しているということです。

だから - 私の質問は:

1) 指定した最新バージョンのライブラリを使用してコードを優先的にコンパイルするように ant/ivy に指示するにはどうすればよいですか? lib/ の依存関係の一部が古いバージョンの commons-io に依存している可能性があると想定しています.....

また :

2)このコンテキストでは、クラスローダーが複数のjar依存プロジェクトで重複を処理する方法に関して何を心配するかについてのヒントも私に役立ちます...

4

2 に答える 2

3

依存関係の報告

report taskを使用して、最初に ivy 依存関係レポートの生成をビルドに追加することをお勧めします。

このタスクの例は、次の回答に含まれています。

Mavenのversions:display-dependency-updatesに相当するIvyは何ですか?

これにより、使用されているjarのバージョンがわかります。通常、ivy はivy.xmlファイルで指定したバージョンを使用しますが、別のモジュールがより新しいバージョンに依存している可能性があります。Ivy のデフォルトの動作は、Maven モジュールの最新バージョンを常に優先することです。

最新の依存関係を取得する

ivy が常に特定のライブラリの最新バージョンを優先するようにするには、依存関係を次のように宣言します。

<dependency org="commons-io" name="commons-io" rev="latest.release"/>
于 2012-03-20T19:41:19.127 に答える
1

Ivy にはFixed and Dynamic Revisionsと呼ばれる機能があります。アーティファクトのバージョン/リビジョンを最新の状態に設定できます

rev="latest.integration" --> for development released
rev="latest.release" --> for released versions

Ivy は、(指定した) 最も高いバージョンのバージョンを取得し、下位バージョンのすべてのライブラリを除外するため、ivy クラスパスには 1 つのライブラリしかありません (解決レポートを見て、ant -v (詳細モード) を実行します)。 .、これにより、バージョンが競合する重複した jar が回避されます。
これはチェックアウトする価値があるかもしれません.ivyファイルの1つに古いバージョンが定義されているだけかもしれません.

2番目の点について:

クラスローダは、たまたまクラスパスの最初にあるクラス(またはクラスパスの最初のjar)を取ります。そのため、クラスパスの構築方法に応じて、同じライブラリのバージョンが混在していても、どのシステムでも異なる動作をする可能性があります。

于 2012-03-20T15:46:45.167 に答える