2009-05-19 8 views
4

私は比較的Javaの& mavenに新しいので、自分のやり方を知るために、私は学習の手段としてプロジェクトを行うことにしました。 Javaを取得する依存関係が正しく設定されています

は、私はかなり一般的なスタック選ん:

  • のJava(注釈付き)1.6
  • 休止状態(注釈付き)
  • のJUnit 4
  • Tomcatを
  • のOracle XE/In-mem hsqldb

私が経験した最大の問題の1つは、安定した環境を得るためにjarバージョンを正しく組み合わせていることです。 2ヶ月後に私はstill fighting withの問題です。

かなり頻繁に私はnoSuchMethod例外またはclassNotFound例外がスローされ、それがSpringモジュールA x.x.xがHibernateモジュールB y.y.yと互換性がないことが判明します。また、普通のように、スプリングモジュールA xxxはスプリングモジュールB yyyと互換性がありません。

クリーンスレートからの起動には、バージョン依存性は最小限に抑えられるはずです。しかしそれはそうではありません。

私は、mavenを使用するとこのプロセスが簡素化されると思いますが、疑いはありません。

しかし、それは確かに痛みから遠いです。私は、モジュールAが特定のバージョンのモジュールBを必要とし、それが行のどこかに強制され、certinalyが単に "noSuchMethod"というより意味のあるメッセージを提供すると思っていました。

さらに、私がこれらの問題を発見する唯一の方法は、新しいメソッド呼び出しを試み、恐ろしいnoSuchMethodエラーを取得し、グーグルで開始することだと思われます。

私はここにある道に沿って、自分が必要としていた以上のことを自分で難しくしていたことを忘れましたか?

参考までに、私のPOMの依存関係のセクションはここにあります...あなたが何かhorrendously非標準に気づいたら、私に教えてください!

<dependencies> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.5.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>1.5.6</version> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.4</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-lang</groupId> 
     <artifactId>commons-lang</artifactId> 
     <version>2.3</version> 
    </dependency> 
    <dependency> 
     <groupId>ojdbc</groupId> 
     <artifactId>ojdbc</artifactId> 
     <version>14</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>1.3.2</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>1.4</version> 
    </dependency> 
    <dependency><!-- java bytecode processor --> 
     <groupId>javassist</groupId> 
     <artifactId>javassist</artifactId> 
     <version>3.8.0.GA</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-dbcp</groupId> 
     <artifactId>commons-dbcp</artifactId> 
     <version>1.2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>hsqldb</groupId> 
     <artifactId>hsqldb</artifactId> 
     <version>1.8.0.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.dbunit</groupId> 
     <artifactId>dbunit</artifactId> 
     <version>2.4.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring</artifactId> 
     <version>2.5.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
     <version>2.5.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>2.5.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>3.4.0.GA</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-commons-annotations</artifactId> 
     <version>3.3.0.ga</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>3.3.1.GA</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>3.1.0.GA</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>3.4.0.GA</version> 
    </dependency> 

    <dependency> 
     <groupId>commons-lang</groupId> 
     <artifactId>commons-lang</artifactId> 
     <version>2.3</version> 
    </dependency> 
</dependencies> 

Eclipseを使用している場合

マーティ

+1

入手しているエラーの例をいくつか教えてもらえますか? –

答えて

2

私が挑戦していることの1つは、各パッケージ、特に春から何が入っているのかを判断することです。

この目的のために、各要件によってどのライブラリが引き込まれているかを知る方法について、Netbeansの優れたメイベーンサポートが見つかりました。 6.7 Betaには未解決のグラフィカルなツリーがあり、m2eclipseには非常に素晴らしいグラフィカル依存ツリーがあります。どのように他のどのようなことを知っているでしょうか?春 - 卵は、春 - 豆、春 - コア、春 - 文脈、および春 - tx?コマンドラインからdependency pluginを使って依存関係を調べることができますが、グラフィカルな表示は非常に便利です。 dependency:treeは実行したい目標です。もちろん、NetbeansやEclipseから実行することもできます。

だから、あなたの衝突の一つの例として:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-annotations</artifactId> 
    <version>3.4.0.GA</version> 
</dependency> 

は実際には3.3 hibernate-commons-annotations-3.1.0.GAがない含まれています。 3.3.1.GAではなく、hibernate-core-3.3.0.SP1も含まれています。

私はあなたの「最も大きい」コンポーネントから始め、既に含まれている部品を見て、見つからないものだけを追加します。それでも重複した依存関係がないことを再度確認し、必要であれば、回答に示されている重複を除外してthis questionにします。

+0

FYI - Eclipseのm2eclipseプラグインにも依存関係をグラフ表示する機能があります –

+0

また、mvn help:effective-pomを使用してすべての依存関係を調べることができます。 –

+0

Springに必要なモジュールを決定することは、難しいどのパッケージがどのモジュールに含まれていたかを指定する "マップ"があれば、素晴らしいでしょう。誰もそのようなリファレンスを知っていますか? –

0

おかげで、あなたはここsonatype http://m2eclipse.sonatype.org/からMavenプラグインをダウンロードしてください。

これは、依存関係(特にtransitive dependencies - あなたのPOMで明示的に定義していない依存関係)の便利なグラフィック表示と、矛盾する依存関係を示します。

更新日:以下のコメントより、が変更になる場合があります。

+0

私はしばらくの間、m2eclipseを使ってきました。それは、特にWTPとネストされたモジュールの周りで、かなりぎっしりしている可能性があります。 しかし、私はPOMエディタをインストールして、これらの推移的な依存関係を見ることができたと思いました。 m2eclipseで最初に見つかったのは、それらを表示しようとしたときですか? "java.lang.NoSuchMethodError"。私は皮肉が大好きです。 –

+0

m2eclipseの "list view"は、グラフィカルなビューよりはるかに読みやすくなっています。そしてそれははるかに良い相互作用を持っています。例えばコモンズロギングをクリックすると、それを使用する場所だけが表示されます。 –

+0

Eclipseで依存関係:ツリー目標を実行してみてください。私はあなたがグラフィカルなプラグインに問題があるなら助けるかもしれないと思う。 –