我正在使用 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 方法相同。