为什么Eclipse JUnit4 Runner没有选择META-INF / services文件

时间:2011-08-25 03:04:07

标签: java eclipse maven junit serviceloader

我正在使用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>

1 个答案:

答案 0 :(得分:1)

M2E开发人员似乎相信任何资源都会影响maven构建,即使在META-INF / services /是功能部分的情况下,尽管是资源:

  

“实际上,项目资源文件夹实际上并不需要添加到构建路径中(Maven Builder在没有它的情况下可以工作),但在Package Explorer和其他Eclipse视图中它被认为很方便,看起来更好。”   M2E FAQ

如果您想破解它,您显然可以将特殊的M2E配置文件编码到您的pom.xml文件中,以制作M2E增量构建过滤器并复制资源Sonatype M2Eclipse Wiki