Java 为什么EclipseJUnit4运行程序不获取META-INF/services文件

Java 为什么EclipseJUnit4运行程序不获取META-INF/services文件,java,eclipse,maven,junit,serviceloader,Java,Eclipse,Maven,Junit,Serviceloader,我正在使用Maven和Eclipse(使用M2E)构建一个依赖于java.util.ServiceLoader动态加载一些工厂类的项目。当我在Maven中运行它时,它工作得很好,但是当我使用内置的EclipseJUnit4运行程序运行测试时,它无法获取服务,测试也没有成功 我是否需要手动将META-INF/services添加到JUnit构建路径中?我无法使它在src/main/resources/META-INF/services或src/main/java/META-INF/services

我正在使用Maven和Eclipse(使用M2E)构建一个依赖于java.util.ServiceLoader动态加载一些工厂类的项目。当我在Maven中运行它时,它工作得很好,但是当我使用内置的EclipseJUnit4运行程序运行测试时,它无法获取服务,测试也没有成功

我是否需要手动将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");
       }
   }
}
TestFactoryImpl定义为:

public interface TestFactory
{

}
public class TestFactoryImpl implements TestFactory
{

}

我最初使用的是来自的MetaInfServices生成器,但当我删除该生成器并手动创建文件时,它仍然以与Eclipse相同的方式失败,同时使用Maven Surefire插件成功运行。

M2E开发人员似乎相信任何资源都会影响Maven构建,即使META-INF/services/是一个功能部分,尽管是一个资源:

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


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

您的META-INF/services/*文件在哪个目录中?src/main/resources?src/main/resources目录是否配置为Eclipse项目中的源文件夹?抱歉,我在最初发布问题后添加了详细信息。我试过src/main/resources和src/main/java。Java构建路径包含src/main/resources,包含Included(All)和Excluded**。**在那里有意义吗?我去掉了**,它就工作了!现在的问题是,我如何在不必每次手动调整构建路径的情况下一致地修复它。显然,这是一个众所周知的问题。我在谷歌搜索错误的关键词。这是相关的M2E错误,我无法回答我自己的问题(再过几个小时),因为我的声誉太低。
public class TestFactoryImpl implements TestFactory
{

}