2014-04-17 175 views
21

我们在多模块项目中使用spring引导。Spring引导application.properties maven多模块项目

我们有一个域访问模块,它具有公共域对象类,存储库以及数据源,JPA,Hibernate等的配置。这些配置使用application.properties。我们将所有这些配置放入公共模块中,以便将这些常用配置复制到较高级别的模块中。

这在建立域模块时可以正常工作,所以配置在测试单元中正确加载。

然而,当我们尝试在高层模块中使用域模块时,问题就开始了;他们有自己的application.properties,这意味着Spring会加载它们,而不是域模块application.properties,这意味着数据源未配置,因为只加载了更高级的模块application.properties。

我们希望Spring的加载域模块和更高级别的应用程序属性。但我们看不到任何简单的方法来做到这一点。

我在想这一定是一个常见问题,并想知道这个问题是否有推荐的解决方案?

由于我们使用的是spring-boot,所以解决方案最好使用annotations而不是applictionContext.xml。

回答

3

也许你应该只在顶级聚合器项目中使用application.properties

您可以在子项目中始终使用@PropertySource,以使用特定于其用例的名称来配置它们。

或者您可以对每个项目使用不同的名称,并使用spring.config.location(以逗号分隔)将它们粘贴在顶层项目中。

+0

的application.properties文件。如果我们有属性文件在顶级聚合项目,我们怎么能写的子项目测试?我们是否应该再次在儿童项目的测试资源中使用这些属性? – DBS

1

你可以做的另一件事(除了在Dave Syer所提到的顶层使用application.properties外)是命名域模块的属性文件,如domainConfig.properties

这样你就避免了与application.properties的名称冲突。

domainConfig.properties将包含域模块能够自行测试所需的所有数据。与代码的其余部分的集成,可以很容易地做到无论使用多@PropertySource(一个用于domainConfig.properties,一个用于application.properties)或配置在Java配置一个PropertySourcesPlaceholderConfigurer豆(看看this教程)是适用于所有需要的属性文件

+0

这就是我所说的,但如果它让任何人都更清楚,那就很好。我不会建议使用另一个'PropertySourcesPlaceholderConfigurer'(它只是重复已经存在的那个),我想这是一个选项,如果你不能在运行时改变'spring.config。*'属性。 –

+0

好吧,我误解了你的答案,我以为你的意思是把属性文件放在域中,并且只使用顶层的属性文件。对于那个很抱歉! – geoand

4

我同意@Dave Syer。将应用程序分成多个模块的想法是每个模块都是一个独立的单元,在这种情况下是一个jar文件。理论上讲,你可以将每个jar文件拆分成自己的源代码库,然后在多个项目中使用它们。假设您想在Web和批处理应用程序中重用这些域类,如果所有应用程序级配置都存储在每个单独的模块中,则会严重降低其可重用性。

IMO只有聚合模块应该包含作为应用程序运行所需的所有配置,其他一切都只是一个依赖项,可以根据需要进行重新组合和重用。

+0

我正在寻找是一个很好的约定,用于设置子模块中的默认属性值。然后,聚合器模块只需要让他们自己改变他们需要改变的子模块属性,而不是所有的子模块属性。如果你仔细想想这就是Spring Boot的工作原理。它通常使用JDBC,JPA,WEB项目的默认值,然后您只需更改您感兴趣的项目。 – user1232555

+0

那么为什么不使用Spring Boot AutoConfiguration呢?如果你真的设置属性(数据源URL等),我不认为这与弹簧引导正在做的一样 - 他们选择适当的依赖和环境无关设置,设置类似于数据源的是定义应用特定。 对我而言,每个jar应该只包含代码,而应用程序特定的配置应该存在于聚合应用程序中。 – Ben

1

也许另一种方法可以定义每个模块特定的配置文件,并使用application.properties文件只指定巫婆型材活跃 使用spring.profiles.include财产。

domain-module 
- application.properties 
- application-domain.properties 

app-module 
- application.properties 
- application-app.properties 

,并为应用模块

spring.profiles.include=domain,app