2016-05-23 3 views
0

У меня есть приложение maven, и мне нравится использовать механизм ServiceLoader для загрузки плагинов.ServiceLoader с maven, когда зависимость не указана в pom

В настоящее время я достигаю этого, добавляя зависимость от pom, так что байт зависимости находится в пути к классам, и ServiceLoader может его забрать.

Но как это может быть достигнуто без объявления зависимости в пом?

Мне не нравится менять помню с каждым плагином, который будет использоваться.

Как я могу это сделать - или плагин должен всегда находиться в помпе?

+0

Как вы используете приложение? –

+0

В настоящее время я использую «GrizzlyHttpServerFactory.createHttpServer» для создания сервера. Его «ResourceConfig» должен загружать плагины через «ServiceLoader». Я думаю, когда его более стабильная идея заключается в использовании tomcat или подобных. –

+0

Так вы строите JAR? Если да, то как вы его используете? Вы всегда можете вручную загрузить эти плагины и добавить их в путь к классу самостоятельно при запуске приложения, но Maven не может читать ваш разум и знать, что вы хотите, чтобы они присутствовали, не объявляя их в POM. –

ответ

0

Я был слеп ...

Я просто могу использовать URLClassloader для загрузки всех плагинов баночки из папки моего приложения.

public class IntegrationServiceLoader { 
    public static <T> ServiceLoader<T> loadIntegrations(Path path, Class<T> clazz) { 
     List<URL> fileNames = new ArrayList<>(); 
     try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path)) { 
      for (Path each : directoryStream) { 
       fileNames.add(each.toUri().toURL()); 
      } 
     } catch (IOException ex) { 
     } 
     URL[] array = fileNames.stream().toArray(size -> new URL[size]); 
     ClassLoader cl = new URLClassLoader(array, IntegrationServiceLoader.class.getClassLoader()); 
     return ServiceLoader.load(clazz, cl); 
    } 
} 

Это действительный и работает для установки сейчас.

Смежные вопросы