MavenとEclipseを使用して(M2Eを使用して)、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でも同じように成功します。