我正在使用Maven和Eclipse(使用M2E)构建一个依赖java.util.ServiceLoader来动态加载一些工厂类的项目。当我在Maven中运行它时它工作正常,但是当我使用内置的Eclipse JUnit4 Runner运行测试时,它无法获取服务并且测试不成功。
我是否需要手动将META-INF /服务添加到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插件运行时成功运行时,它仍然以相同的方式失败。 / p>
答案 0 :(得分:1)
M2E开发人员似乎相信任何资源都会影响maven构建,即使在META-INF / services /是功能部分的情况下,尽管是资源:
“实际上,项目资源文件夹实际上并不需要添加到构建路径中(Maven Builder在没有它的情况下可以工作),但在Package Explorer和其他Eclipse视图中它被认为很方便,看起来更好。” M2E FAQ
如果您想破解它,您显然可以将特殊的M2E配置文件编码到您的pom.xml文件中,以制作M2E增量构建过滤器并复制资源Sonatype M2Eclipse Wiki