【问题标题】:Why does the Eclipse JUnit4 Runner not pick up META-INF/services files为什么 Eclipse JUnit4 Runner 不拾取 META-INF/services 文件
【发布时间】:2011-11-03 07:45:22
【问题描述】:

我正在使用 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");
       }
   }
}

测试看起来像:

@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 生成器,但是当我删除它并手动手动创建文件时,它仍然以同样的方式在 Eclipse 中失败,而在使用 Maven Surefire 插件运行时成功。

【问题讨论】:

  • 您的 META-INF/services/* 文件在哪个目录中?源/主/资源? src/main/resources 目录是否配置为 Eclipse 项目中的源文件夹?
  • 对不起,我在最初发布问题后添加了详细信息。我已经尝试过 src/main/resources 和 src/main/java。 Java 构建路径包含 src/main/resources 和 Included (All) 和 Excluded ** 。 ** 那里有意义吗?
  • 我删除了 ** 并且它有效!现在的问题是,如何始终如一地修复它,而不必每次都手动调整构建路径。
  • 显然这是一个众所周知的问题。我在 Google 中搜索错误的关键字。这是相关的 M2E 错误 bugs.eclipse.org/bugs/show_bug.cgi?id=351092 我无法回答我自己的问题(再过几个小时),因为我的声誉太低了。

标签: java eclipse maven junit serviceloader


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    相关资源
    最近更新 更多