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