1

我有一个项目 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 文件夹中提取过滤器。

4

2 回答 2

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

希望这可以帮助。

于 2012-10-08T19:06:00.720 回答
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),这应该可以工作。

于 2012-10-10T17:07:56.480 回答