从依赖项目中过滤Spring XML文件

时间:2012-10-08 16:24:44

标签: java spring maven

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

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

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

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

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

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

编辑:

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

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用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

希望这有帮助。

答案 1 :(得分: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),这应该可以正常工作。