Лучшая практика для ссылки на внешний модуль в проекте Java

У меня есть проект Java, который ожидает, что внешние модули будут зарегистрированы с ним. Эти модули:

  • Реализовать определенный интерфейс в основном проекте
  • Упакованы в uni-jar (вместе с любыми зависимостями)
  • Содержат некоторую удобочитаемую метаинформацию (например, имя модуля).

Мой основной проект должен иметь возможность загружать во время выполнения (например, используя собственный загрузчик классов) любой из этих внешних модулей. У меня вопрос: как лучше всего зарегистрировать эти модули в основном проекте (я бы предпочел сохранить эту ванильную Java и не использовать сторонние фреймворки / библиотеки для решения этой изолированной проблемы)?

Мое текущее решение - сохранить один файл .properties в основном проекте с ключом = имя, значение = класс | разделитель | удобочитаемое-имя (или скоординируйте два файла .properties, чтобы избежать синтаксического анализа разделителей). Во время выполнения основной проект загружается в файл .properties и использует любые найденные записи для управления загрузчиком классов.

Мне это кажется странным. Есть ли способ лучше?


person G__    schedule 10.05.2010    source источник


Ответы (3)


Стандартный подход в Java - определить Поставщик услуг.

person ZZ Coder    schedule 10.05.2010

Пусть весь модуль выражает свои метаданные через стандартный файл xml. Назовите его «my-module-data.xml».

При запуске вашего основного контейнера он ищет путь к классам *: my-module-data.xml "(который может иметь класс FrontController) и делегирует класс FrontController отдельным модулям, чтобы они делали все, что захотят :)

Также здесь могут быть полезны Google для Spring-OSGI и их документация.

person Kannan Ekanath    schedule 10.05.2010

Расширение @ZZ Coder ...

Упомянутый шаблон поставщика услуг, используемый внутри JDK, теперь немного более формализован в JDK 6 с помощью ServiceLoader. Концепция дополнительно расширена с помощью Netbeans Lookup API.

Базовая инфраструктура идентична. То есть оба API используют одни и те же артефакты одинаково. Версия NetBeans - это просто более гибкий и надежный API (позволяющий, например, альтернативные службы поиска, а также службы по умолчанию).

Конечно, было бы упущением не упомянуть доминирующие, более «тяжелые» стандарты EJB, Spring и OSGi.

person Will Hartung    schedule 10.05.2010