我正在使用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设置构建路径的方式有关?我在一个全新的项目中进行了测试,但仍然失败。
基本的失败代码如下:
测试如下所示:
我需要手动将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 中仍然失败。