2012-01-16 9 views
2

私はプロジェクトBに依存するプロジェクトAをプロジェクトCに依存しています。プロジェクトCはHibernate(より正確にはorg.hibernate:hibernate-core:3.6.8.Final)に依存しています。プロジェクトBは、休止状態のアーティファクトに依存しません。しかし、プロジェクトAはこの成果物に依存しますが単体テストのためだけです。したがって、私はテストスコープを使用します。私はAを構築しようとすると、CとBが正しく構築され、インストールされているプロジェクトが、私はコンパイル時に次のエラーを取得する:Mavenでの奇妙なコンパイルエラー

Failure executing javac, but could not parse the error: myPackage\MyClass.class(myPackage:MyClass.class): warning: Cannot find annotation method 'value()' in type 'org.hibernate.annotations.Cascade': class file for org.hibernate.annotations.Cascade not found An exception has occurred in the compiler (1.6.0_27). Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport) after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you. com.sun.tools.javac.code.Symbol$CompletionFailure: class file for org.hibernate.annotations.CascadeType not found

I MyClassのは、Cおよび輸入をプロジェクトに属していることを正確org.hibernate.annotations.Cascade 。そしてCは正常にコンパイルして、上記のクラスを見つけることができます。 しかし、ここでは、コンパイル中にクラスファイルが見つからないようです。おそらく、Hibernateに対するテストスコープの依存関係が、CのHibernate依存関係を取り消すかもしれないと思いましたか?しかし、私は分かりません。

また、プロジェクトAの依存関係の範囲をテストからコンパイルに変更すると、問題は解決します。

ご協力ありがとう

+1

私たちが望むものは正確にはわかりません。コンパイラのバグを発見したので、それを報告してください。 –

+0

これはコンパイラのバグですか?私のコードの問題によるコンパイルエラーではありませんか? –

+0

「コンパイラで例外が発生しました...バグを報告してください...」というメッセージが表示されますので、あなたの責任ではありません! –

答えて

3

あなたのコードには、コンパイラのバグとバグの両方があります。それが唯一のテスト時に、コンパイル時に使用できないようにするには、過渡的な休止状態依存性の範囲をオーバーライドしている

:あなたの側では

プロジェクトCのMyClassで使用されている注釈は、実行時に使用できます(そうしないと、プロジェクトを実行しているときにhibernateがそれらを参照できなくなります)。これは、コンパイル時にjavacがそれらの注釈をロードできる必要がありますが、それらを見つけることができないことを意味します。これは技術的にも他のコンパイラが生成したエラー/警告を吐くべきである

:コンパイラの側面側で

。しかし、誰かがコンパイラ側で何かを見逃してしまったので、コンパイラは警告リストに追加するのではなくクラッシュしています。最新のJDKへのアップデートをお勧めします。もう一度やり直してください。まだ動作しない場合は、バグを報告してください。

+0

ありがとうdeterb、私は確かに私は私の冬眠の依存の範囲をオーバーライドしていたが、私は私が正しいと思っていたときにこのエラーを得たことを知った。コンパイルスコープと同じアーティファクトに過渡的な依存関係があるため、テスト時に唯一の理由しか理解できません。おそらく、この投稿で私にこれを手伝うことができますhttp://stackoverflow.com/questions/8923787/different-scopes-of-the-same-artifact-and-transitive-dependencies-issue。ありがとう –

+1

私はJava 1.6.0_26でもこのコンパイラの例外を見ていましたが、Java 1.7.0_11では通常の警告に変わりました。もちろん、コードはまだ修正する必要があります。私の場合は、[Jackson](http://jackson.codehaus.org/)に依存するライブラリを使用していましたが、クラスパスにJacksonライブラリが不足していました。 – sschuberth

+0

同じエラーが発生しました。エラーメッセージは非常に誤解を招くことがあります。おかげでsschuberthのコメント – dongshengcn