为什么Eclipse JUnit4 Runner无法拾取META-INF / services文件

Pet*_*ter 5 java eclipse junit maven serviceloader

我正在将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");
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

测试看起来像:

@Test
public final void testTestServiceLoader()
{
    TestServiceLoader<TestFactory> serviceLoader = new TestServiceLoader<TestFactory>(TestFactory.class);
}
Run Code Online (Sandbox Code Playgroud)

TestFactory定义为:

public interface TestFactory
{

}
Run Code Online (Sandbox Code Playgroud)

TestFactoryImpl定义为:

public class TestFactoryImpl implements TestFactory
{

}
Run Code Online (Sandbox Code Playgroud)

我最初使用的是来自http://weblogs.java.net/blog/kohsuke/archive/2009/03/my_project_of_t.html的MetaInfServices生成器,但是当我删除它并手动创建文件时,它仍然无法通过使用Maven Surefire插件成功运行时,Eclipse的方法与此相同。

Pet*_*ter 1

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

\n\n
\n

“实际上,项目资源文件夹\xe2\x80\x99t确实需要添加到构建路径中(Maven Builder 没有它也能工作),但它被认为很方便,并且在 Package Explorer 和其他 Eclipse 视图中看起来更好。” \n M2E 常见问题解答

\n
\n\n

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

\n