Eclipseで(M2Eを使用して)Mavenを使用し、java.util.ServiceLoaderに依存していくつかのファクトリクラスを動的にロードするプロジェクトを構築しています。Mavenで実行すると問題なく動作しますが、組み込みのEclipse JUnit4 Runnerを使用してテストを実行すると、サービスを取得できず、テストが成功しません。
META-INF / servicesをJUnitビルドパスに手動で追加するために必要なことはありますか?src / main / resources / META-INF / servicesまたはsrc / main / java / META-INF / servicesで機能させることができませんでした。M2Eがビルドパスをセットアップする方法に関連していますか?まったく新しいプロジェクトでテストを作成しましたが、それでも失敗しました。
失敗している基本的なコードは次のとおりです。
public class TestServiceLoader<S>
{
public TestServiceLoader(final Class<S> serviceClass)
{
ServiceLoader<S> serviceLoader =
java.util.ServiceLoader.load(serviceClass, serviceClass.getClassLoader());
Iterator<S> services = serviceLoader.iterator();
if(!services.hasNext())
{
throw new RuntimeException("Failed to get any services for this class");
}
}
}
テストは次のようになります。
@Test
public final void testTestServiceLoader()
{
TestServiceLoader<TestFactory> serviceLoader = new TestServiceLoader<TestFactory>(TestFactory.class);
}
TestFactoryは次のように定義されます。
public interface TestFactory
{
}
TestFactoryImplは次のように定義されます。
public class TestFactoryImpl implements TestFactory
{
}
私はもともとhttp://weblogs.java.net/blog/kohsuke/archive/2009/03/my_project_of_t.htmlからMetaInfServicesジェネレーターを使用していましたが、それを削除して手動でファイルを作成すると、依然として失敗していましたMaven Surefireプラグインを使用して実行すると、Eclipseでも同じように成功します。
M2E開発者は、リソースではありますが、META-INF / services /が機能部分である場合でも、リソースがMavenビルドに影響を与えると信じているようです。
「実際にはプロジェクトリソースフォルダーをビルドパスに追加する必要はありません(Maven Builderはそれなしで機能します)が、便利であると見なされ、パッケージエクスプローラーやその他のEclipseビューで見栄えがよくなりました。」M2E FAQ
ハックしたい場合は、特別なM2Eプロファイルをpom.xmlファイルにエンコードして、M2Eインクリメンタルビルドフィルターを作成し、リソースをコピーすることができます。Sonatype M2Eclipse Wiki
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加