2012-03-29 16 views
1

我有一个使用Maven进行管理的Java应用程序。该项目涉及的国家的概念,例如使用Spring的Maven构建和依赖注入

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使用配置文件中的元素选择适当的配置文件。然而,文档说配置文件旨在支持在不同的环境中构建,而不是具有不同的应用程序配置。

这听起来像一个合理的方法吗?如果有人知道更好或更“标准”的方式,请让我知道:)

编辑:最终我想能够为每个国家创建一个.jar。例如

  • MYAPP-england.jar,
  • MYAPP-brazil.jar等
+0

你想测试每个国家?或者您是否想根据测试环境选择合适的国家? – YMomb 2012-03-29 16:50:43

+0

你如何确定应该使用哪个“国家”?使用DI注入这些国家似乎有点偏离。 – beerbajay 2012-03-29 16:51:18

+0

Locale怎么样? – YMomb 2012-03-29 16:52:57

回答

3

我可以看到一对夫妇为这个解决方案...

如果你要结束了每个国家有一个JAR文件,正确的做法是在每个国家创建一个单独的Maven项目。有一个定义接口的公共项目,然后是每个国家/地区的单独项目,其中包含实施类,接口项目作为依赖项以及任何所需的附加功能或配置。这样,您可以干净地分离各种实现,不必担心构建的设置。它也是可扩展的,因为如果你想添加一个新的国家,你只需添加另一个项目 - 你可以安全地打破任何现有的功能。

如果您想将它保留在一个项目中,您需要考虑何时作出关于使用哪个国家/地区的决定:是在构建时还是在运行时?借助Maven,您将在构建时做出决定,而Spring则是一个运行时决策。如果你想能够在运行时做出决定,那么属性文件可能是最好的选择。尽可能通用地运行构建,而不涉及使用的国家,然后让用户或管理员决定在运行时使用哪个国家,例如,通过提供一个属性文件来引用Spring上下文文件来使用。在你的main方法中,你可以从类路径加载这个属性文件,并决定加载哪个Spring上下文文件。

在这种情况下,请参考Spring配置中的通用bean名称,即确保无论您加载的是哪个特定于国家/地区的Spring上下文文件,它们都包含ID为country的bean。

2

使用配置文件,您可以使用不同的实现来运行程序,指示要在由Maven配置文件控制的变量中运行的实现。我已经在少数项目中完成了这项工作,但只有一个代码,一个jar。为每个实现构建不同的jar更复杂。

更好的方法是创建一个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) 
    - ...