Почему Eclipse JUnit4 Runner не принимает файлы META-INF / services - PullRequest
5 голосов
/ 25 августа 2011

Я использую 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
{

}

Изначально я использовал генератор MetaInfServices из http://weblogs.java.net/blog/kohsuke/archive/2009/03/my_project_of_t.html, но когда я удалил его и вручную создал файлы, он все равно не удавался в Eclipse при успешном запуске при использовании плагина Maven Surefire.

1 Ответ

1 голос
/ 26 августа 2011

Разработчики M2E, похоже, считают, что любые ресурсы будут влиять на сборку maven, даже в случае, когда META-INF / services / является функциональной частью, хотя и ресурсом:

"Фактически проектПапка ресурсов на самом деле не нуждается в добавлении в путь сборки (Maven Builder будет работать без него), но она была сочтена удобной и выглядит лучше в Package Explorer и других представлениях Eclipse ». M2E FAQ

Если вы хотите взломать его, вы, очевидно, можете закодировать специальный профиль M2E в файлы pom.xml, чтобы сделать фильтр инкрементной сборки M2E и копировать ресурсы Sonatype M2Eclipse Wiki

...