すべてのソースフォルダーに独自の出力フォルダーが関連付けられているEclipseプロジェクトがあります。/classesの代わりに/ Eclipse-classesと呼ばれます。
したがって、次のフォルダーがある場合:src/main/Java(通常はmavenのもの)ターゲットフォルダーは次のとおりです:target/Eclipse-classes
そして同様にリソースなどのために。
これは機能しているようです(つまり、Eclipseはこれらのフォルダー内に配置される.classファイルを生成します)が、JUnitテストを実行すると、「クラスが見つかりません」という例外がスローされます。組み込みのEclipseテストランナーを使用してJUnitを実行しています(つまり、クラスを右クリックして、「run as」、「Junittest」)。
/ Eclipse-classesフォルダーを/ classesにコピーすると、それらは成功します。つまり、Eclipseは/ classesを使用していますが、それを変更するための構成オプションが見つかりません。 Eclipseがまだ/ classesフォルダーを使用している場所と理由を見つける方法はありますか?
(おそらく関連性がありますが、私はm2Eclipseプラグインも使用しています)
リッチセラーの回答に触発されたいくつかの追加情報:Mavenは、リソースの変更時に以下を実行するように構成されています。
process-resources resources:testResources
これは何の役にも立ちませんが(間違ったディレクトリにコピーします)、リソースは正しい場所に配置されるため、問題のあるatmではありません。
.classpathエントリは問題ないように見えます。 Mavenサブプロジェクトがたくさんあるので、ネストはRichが投稿したものよりも少し深くなりますが、それ以外は次の行を除いてまったく同じです。
<classpathentry kind="con" path="org.Eclipse.jst.j2ee.internal.module.container"/>
それは必要ないかもしれませんが、ATMを傷つけることはありません。
edit2:さらにテストすると、Eclipseが/ Eclipse-classesフォルダーと/ classesフォルダーの両方にクラスファイルを生成していることがわかります。自動的にビルドする場合、m2Eclipseはバックグラウンドでmvn buildを実行しているようですが、これを無効にする方法が見つからないようです。ここに他にアイデアがない場合は、m2Eclipse開発者に連絡しようと思います。
M2Eclipseを使用する場合、Eclipseプロジェクトの構成はプラグインによって上書きされます。解決策については この記事 を参照してください。
これは、一部のMavenプラグインがtarget/
の外部にあるディレクトリを処理できないため、m2Eclipse開発者がコンパイル済みクラスのフォルダーをtarget/classes
およびtarget/test-classes
に強制するためです。 Eclipseで何を構成しても。
プロファイルを使用することで、Eclipse用にさまざまなフォルダーを使用できます。それでも、Maven(およびそのプラグイン)の出力フォルダーを変更することは賢明ではありません。
Eclipse JUnit統合には、特別なクラスパス構成はありません。クラスパスで定義された出力フォルダーで機能し、それらのフォルダーにコンパイルされたすべてのクラスを見つける必要があります。 .classpathファイルに何か危険なものがあるため、JUnitが混乱している可能性があります(デフォルトでは、.classpathファイルはビューから非表示になっており、プロジェクトのルートにあります)。
あなたの説明に基づいて、私は以下のようなエントリを見ることを期待します(デフォルトの出力フォルダとsrc/main/Javaおよびsrc/main/resourcesのオーバーライドに注意してください)。クラスパスが著しく異なって見える場合は、それが問題になる可能性があります
<classpathentry excluding="**" kind="src" output="target/Eclipse-classes" path="src/main/resources"/>
<classpathentry kind="src" output="target/Eclipse-classes" path="src/main/Java"/>
<classpathentry kind="con" path="org.Eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.maven.ide.Eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>
これはロングショットですが、プロジェクトでMavenクリーンが構成されている可能性もあります。その場合、クリーンゴールが実行されるたびにターゲット/ Eclipseクラスのコンテンツが削除されるため、テストが削除されます。テストが実行される前にファイルシステムから。プロジェクトのプロパティを開くと、Mavenによって実行されている目標を確認できます(alt-enter)そしてMavenアイテムを選択します。
この部分はあなたの質問に直接答えることはありませんが、とにかく役に立つかもしれません。私はEclipseの出力ディレクトリをMavenの場合と同じにする傾向があり、Eclipse内で問題はありません(Mavenビルダーを変更してprocess-resourcesのみを実行し、コンパイルを試みないようにします)。
Mavenビルドを実行すると、Mavenコンパイラーは変更されたクラスをビルドします(クリーンが含まれている場合はすべてのクラスになります)。 Eclipseでのその後の変更は、インクリメンタルコンパイラによって検出され、処理されます。すべて問題ありません。ビルドを自動的にオフにしますが、それは私を苛立たせるからです。両方をオフにしている場合は、MavenとEclipseが機能している可能性があります。
このために別のプラグインを試してみることにしている場合に備えて、私はmaven-Eclipse-pluginを使用してEclipseプロジェクト設定を生成します。クラスに完全に別個の出力ディレクトリを使用するようにEclipseプロジェクトを構成するようにプラグインを構成します(以下を参照)。プロジェクトルートを基準にしているため、ターゲットの外側にあります。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-Eclipse-plugin</artifactId>
<version>2.6</version>
<configuration>
<outputDirectory>Eclipse_build</outputDirectory>
</configuration>
</plugin>
これは、MavenとEclipseの両方を介して、箱から出してすぐにテストを実行できることを含め、私にとってはうまく機能します。
私はgradleを使用しています。 gradleプロジェクトを更新すると、.classpathファイルが上書きされます。したがって、JUNIT5参照を維持できるように、build.gradleファイルの最後に以下を追加する必要があります。
Eclipse.classpath.file.whenMerged {
classpath ->
def JUnitFive = new org.gradle.plugins.ide.Eclipse.model.Container('org.Eclipse.jdt.junit.JUNIT_CONTAINER/5')
JUnitFive.exported = true
classpath.entries << JUnitFive
}
実行してみてくださいmvn Eclipse:eclipse
。これで問題が解決しました