2012-03-29 6 views
1

У меня есть приложение Java, которое управляется с помощью Maven. Проект включает понятия стран, которые делают что-то, например.Вложения Maven и зависимость зависят от Spring

public interface ICountry { 
    public void doSomething(); 
} 

public class England implements ICountry {...} 
public class Brazil implements ICountry {...} 

public class CountryApp { 
    public static void main (String args[]) { 

     ICountry country = null; 

     // PSEUDOCODE: 
     // Retrieve a chosen implementation of ICountry using Spring 

     country.doSomething(); 
    } 
} 

Из того, что я видел Spring я мог бы потенциально иметь конфигурационный файл один Spring для каждой страны. По-видимому, можно использовать Maven profiles, чтобы выбрать соответствующий файл конфигурации, используя элемент в профиле. Однако в документации указано, что профили предназначены для поддержки построения в разных средах, а не для разных конфигураций приложения.

Это звучит как разумный подход? Если кто-то знает о более качественном или «более стандартном» способе, пожалуйста, дайте мне знать :)

EDIT: В конечном счете, я хотел бы иметь возможность создать .jar для каждой страны. например

  • MyApp-england.jar,
  • MyApp-brazil.jar и т.д.
+0

Вы хотите протестировать каждую из стран? Или вы хотите выбрать нужную страну с учетом тестовой среды? – YMomb

+0

Как вы определяете, какую «страну» следует использовать? Использование DI для впрыскивания стран кажется немного выключенным. – beerbajay

+0

А как насчет Locale? – YMomb

ответ

3

Я могу увидеть пару решений для этого ...

Если вы хотите, чтобы в конечном итоге с одним файлом JAR для каждой страны, правильным способом было бы создать отдельный проект Maven для каждой страны. У вас есть общий проект, который определяет интерфейс, а затем отдельный проект для каждой страны, который содержит класс реализации, проект интерфейса как зависимость и любые необходимые дополнительные функции или настройки. Таким образом, вы можете четко разделить различные реализации и не беспокоиться о создании сборки. Это также расширяемо, поскольку вам просто нужно добавить еще один проект, если вы хотите добавить новую страну - вы можете взломать любую существующую функциональность.

Если вы хотите сохранить его в одном проекте, вам нужно подумать, когда нужно принять решение о том, какую страну использовать: есть ли время сборки или во время выполнения? С Maven вы получите решение во время сборки, тогда как Spring - это решение времени исполнения. Если вы хотите иметь возможность решать во время выполнения, возможно, файл свойств - это путь. Запустите сборку как можно более общую, без какой-либо ссылки на используемую страну, а затем позвольте пользователю или администратору решить, какую страну использовать во время выполнения, например. путем предоставления файла свойств, который имеет ссылку на используемый контекстный файл Spring. В вашем методе main вы можете загрузить этот файл свойств из пути к классам и решить, какой загрузочный файл Spring загрузить.

В этом случае обратитесь к общему имени компонента в конфигурации Spring, т. Е. Убедитесь, что независимо от того, какой загрузочный файл Spring для конкретной страны вы загружаете, все они содержат компонент с идентификатором country.

2

С помощью профилей вы можете запускать программу с различными реализациями, указывающую на реализацию, выполняемую в переменной, управляемой профилями Maven. Я сделал это в нескольких проектах, но один код, один банку. Построить другую банку для каждой реализации сложнее.

Лучшим подходом было бы иметь многопроектный проект Maven, я имею в виду проект с несколькими файлами pom.xml, каждый из которых имеет собственную конфигурацию и реализацию.

- Parent project 
    - common project (interfaces and common codec) 
    - country 1 project (with dependency of common project) 
    - country 2 project (with dependency of common project) 
    - ... 
Смежные вопросы