【问题标题】:Filtering a Spring XML file from a dependent project从依赖项目中过滤 Spring XML 文件
【发布时间】:2012-10-08 16:24:43
【问题描述】:

我有一个项目 MyProject,它依赖于另一个项目 BaseProject 中的配置。在 BaseProject 中,我依赖于许多不同的项目,如 ErrorLogging、PerformanceLogging 等......我希望能够构建顶级项目 (MyProject) 并让它过滤那些项目中的所有 spring xml 文件作为依赖项。我没有运气。我可以看到豆子,但它们没有被过滤。一些 bean 正在使用它们自己的 pom 中定义的默认过滤器进行过滤,但没有使用来自 MyProject 的过滤器。

MyProject - 这包含过滤器文件并从其他项目导入配置。

BaseProject - 定义了需要过滤的 spring bean。

ErrorLogging - 定义了需要过滤的 spring bean。

当我从 MyProject 运行一个包时,所有 spring 文件都被正确地提取到 jar 文件中,但它们仍然包含属性占位符值 ${error.logging.host} 例如...... MyProject 中的 bean 被正确过滤。替代方法是在 MyProject 中定义 bean,但其中大约有 10 个项目使用 BaseProject 和它的 bean,我不想在 10 个单独的项目中重新定义它们。

如果有人能对这个问题有所了解,那就太好了。谢谢

编辑:

为了更清楚地说明这一点,我在项目 ErrorLogging 中有一个名为 errors-config.xml 的 spring beans xml 定义,它定义了用于连接数据库的 beans。这只是有连接详细信息的占位符,应该由 MyProject 内部的 filter.properties 文件提供。

errors-config.xml 作为资源导入到位于 BaseProject 内部的 baseproject-config.xml。将基础项目及其配置文件导入 MyProject。

然后我使用 Maven 构建 MyProject,我希望将 errors-config.xml 中的属性占位符替换为 MyProject 中 filter.properties 中的值。 MyProject 可以成功过滤它自己的文件,但不能过滤 ErrorsLogging 项目的文件。 ErrorsLogging 似乎从它自己的 src/main/resources 文件夹而不是 MyProject 文件夹中提取过滤器。

【问题讨论】:

  • 您能否提供更多详细信息。这是 BaseProject 或 ErrorLogging 项目中定义的 bean 的示例,以及您如何尝试在 MyProject 上下文中排除它们。
  • 我会编辑帖子,因为它更容易
  • 似乎是PropertiesPlaceHolderConfigurer 的工作,请参阅static.springsource.org/spring/docs/3.0.x/…
  • 嗯,我认为我需要更具体的东西,因为我已经定义了属性文件。我认为这一定与过滤时发生的顺序有关,加载spring上下文文件并将它们从依赖项中提取到目标文件夹中。我侦察它们首先被过滤,然后当我从 ErrorLogging 的默认过滤器中获取过滤器值时提取它们

标签: java spring maven


【解决方案1】:

你可以通过解压所有的依赖,再次过滤和打包来实现,整个过程取决于你的项目的结构,对于一个基本的配置,这可能就足够了:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack-dependencies</id>
            <!--unpack all the dependencies to the target of this project-->        
            <phase>initialize</phase>
            <inherited>false</inherited>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
                <includeGroupIds>${pom.groupId}</includeGroupIds>
                <overWrite>true</overWrite>
                <outputDirectory>${project.build.directory}/${artifactId}</outputDirectory>
                <includes>**/*.properties,**/*.xml</includes>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptors>
            <descriptor>${config.maven.plattform.resources}/assembly/zip.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <id>zip</id>
            <phase>package</phase>
            <inherited>true</inherited>
            <goals>
                <goal>assembly</goal>
            </goals>
        </execution>
    </executions>
</plugin>

只要您正确定义了对资源的正确过滤(稍后会发生并且还使用 maven-resources-plugin),这应该可以工作。

【讨论】:

  • 谢谢,很抱歉回复晚了,等我有时间我会尽快研究一下。这看起来更像我想要的。
【解决方案2】:

您可以使用PropertyOverrideConfigurer 覆盖初始属性。 例如,如果您在 errors-config.xml 中有以下数据源定义:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${hibernate.driverClassName}" />
    <property name="jdbcUrl" value="${hibernate.url}" />
    <property name="user" value="${hibernate.username}" />
    <property name="password" value="${hibernate.password}" />
</bean>

您可以像这样覆盖MyProject 上下文中的数据库连接属性:

<bean id="propertyOverideConfigurer" class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
    <property name="locations">
        <list>
            <value>filter.properties</value>
        </list>
    </property>
</bean>

filter.properties 文件中,您需要指定要覆盖的 bean 名称和属性:

datasource.driverClass = oracle.jdbc.driver.OracleDriver
datasource.jdbcUrl = jdbc:oracle:thin:@localhost:1521:xe
datasource.user = username
datasource.password = password

希望这会有所帮助。

【讨论】:

  • @DeliveryNinja 这有帮助吗?
  • 我不能在这里回复它太长了哈哈。简而言之,这不起作用。这只是指定要使用的 filter.properties 文件,但此过滤发生在将 bean 从 ErrorLogging/BaseProject 导入 MyProject 之前,因此 errors-config.xml 只使用它自己的 filter.properties(在它的 pom.xml 中定义)而不是MyProject 的 filter.properites。
猜你喜欢
  • 2012-03-17
  • 2019-12-19
  • 2012-05-26
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 2018-07-14
  • 2016-04-22
相关资源
最近更新 更多