[英]Why does the Eclipse JUnit4 Runner not pick up META-INF/services files
我正在使用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插件运行时成功使用Eclipse的方式相同。
M2E开发人员似乎相信任何资源都会影响maven构建,即使在META-INF / services /是功能部分的情况下,尽管是资源:
“实际上,项目资源文件夹并不需要添加到构建路径中(Maven Builder在没有它的情况下可以正常工作),但在Package Explorer和其他Eclipse视图中它被认为是方便且看起来更好。” M2E常见问题
如果你想破解它,你可以显然将一个特殊的M2E配置文件编码到你的pom.xml文件中,以制作M2E增量构建过滤器和复制资源Sonatype M2Eclipse Wiki
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.