【问题标题】:merge properties files of two modules in spring在spring中合并两个模块的属性文件
【发布时间】:2016-05-11 18:55:59
【问题描述】:

我有一个包含多个模块的Maven 项目。 Module ModuleB 使用 ModuleA 作为内部 Maven 依赖项。在 moduleA 中,我有一个 Spring xml 配置 module.a.xml,它加载了一个 module.a.properties 文件。在 moduleB 的 Spring xml 配置中,我将 module.b.properties 文件与 module.a.xml 配置一起导入。

最后我得到了一个带有两个属性文件导入的Spring xml 配置。根据导入的顺序,我只能访问一个文件的属性:module.a.properties 或 module.b.properties。如何同时使用这两个属性?

使用PropertyPlaceholderConfigurer 的解决方案的问题是属性文件位于不同的模块中,模块B 不应该担心模块A 的属性文件。

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" id="corePlaceHolder">
    <property name="locations">
        <list>
            <value>classpath:modula.a.properties</value>
            <value>classpath:modula.b.properties</value>
        </list>
    </property>
</bean>   

使用ignore-unresolvable="true" 的问题是很容易遗漏一个被遗忘的属性,而将ignore-unresolvable="true" 放在property-placeholder 上很容易遗漏。

<context:property-placeholder location="module.a.properties" order="0" ignore-unresolvable="true"/>
<context:property-placeholder location="module.b.properties" order="1" ignore-unresolvable="true"/>

【问题讨论】:

    标签: java xml spring maven properties


    【解决方案1】:

    不确定这是否可以解决您的问题,但是,由于您使用的是 maven 多模块构建,您是否考虑过使用 maven 插件来创建第三个属性文件,作为 A 和 B 的合并,并采用适当的覆盖策略?

    这是一个使用maven-merge-properties-plugin的示例

    <plugin>
      <groupId>org.beardedgeeks</groupId>
      <artifactId>maven-merge-properties-plugin</artifactId>
      <version>0.2</version>
      <configuration>
        <merges>
          <merge>
            <targetFile>${moduleB.output.dir}/module-final.properties</targetFile>
            <propertiesFiles>
              <propertiesFile>${moduleB.src.dir}/moduleB.properties</propertiesFile>
              <propertiesFile>${moduleA.src.dir}/moduleA.properties</propertiesFile>
            </propertiesFiles>
          </merge>
        </merges>
      </configuration>
      <executions>
        <execution>
          <phase>generate-sources</phase>
          <goals>
            <goal>merge</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    

    通过这种方式,您将获得所有 A 和 B 属性的文件。如果 A 和 B 上都存在属性,则 B 将获胜(检查配置中的文件顺序)。

    作为同一个项目中的两个模块,检索两个文件应该很容易。 您甚至可以使用另一个插件从外部 jar 中解压缩所需的属性文件。

    希望这会有所帮助。

    【讨论】:

    • 这个解决方案需要 1) 知道有一个 proporties 文件 2) 知道 proporties 文件的名称。我只想在新的属性上使用一个附加,而不知道模块A的内部。为了论证,ModulA 可能处于外部依赖关系中
    • 好的,您正在尝试实现更高的抽象级别,因此您希望在代码级别而不是构建级别上工作。正如答案中所说,作为模块,外部依赖关系可以很容易地通过依赖解包插件来解决。关于第 1/2 点,您无论如何都必须知道,因为您将它们包含在您的 spring conf 中。如果您想在 build 部分投入一些精力,我希望您的 pom 知道文件的存在,而 dev 部分则不知道,因为输出文件但是会进入你的类路径,所以在 spring 文件中不需要额外的exfort。
    • 我不必知道属性文件的存在。属性文件包含一个 spring xml 导入。我不想用一些 hacky 代码更改每个使用 moduleA 的 pom 文件。我不明白为什么如此简单和直观的事情似乎是不可能的。 Spring可以轻松地将新属性文件的属性附加到现有属性中......应该能够在某处配置Spring的默认行为......
    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2011-06-03
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2019-03-11
    相关资源
    最近更新 更多