Лучшая практика для ссылки на внешний модуль в проекте Java - PullRequest
5 голосов
/ 10 мая 2010

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 10 мая 2010

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

http://java.sun.com/j2se/1.4.2/docs/guide/jar/jar.html#Service%20Provider

0 голосов
/ 10 мая 2010

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

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

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

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

0 голосов
/ 10 мая 2010

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

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

Здесь также может помочь Google для Spring-OSGI и их документация.

...