如何将 xml 的内容或关键字(如 applicationContext.xml)替换为 Gradle 构建?



我的应用程序具有 applicationContext.xml,其中 entityManagerFactory bean 定义为:

<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="packagesToScan" value="org.xyz" />
**<property name="dataSource" ref="poolDVLDataSource" />**  
<!--<property name="dataSource" ref="poolPRDDataSource" /> -->  
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" 
value="org.hibernate.dialect.Oracle10gDialect" />
<property name="database" value="ORACLE" />
<property name="showSql" value="false" />
</bean>
</property>
</bean>

和数据源引用为

<bean id="poolPRDDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
....
</bean>

<bean id="poolDVLDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
....
</bean>

我正在使用 gradle 进行构建。 根据部署环境,有没有办法动态地将数据源引用替换为"poolDVLDataSource"或"poolPRDDataSource"?

替换RegExp ant任务应该可以解决您的问题。 https://ant.apache.org/manual/Tasks/replaceregexp.html

示例 gradle 代码如下:

ant.replaceregexp(match:'existingName', replace:'newName', byline:true) {
fileset(dir: 'WebContent/WEB-INF', includes: 'applicationContext.xml')
}

我不会用 gradle 解决这个问题,你应该在春天解决这个问题

您可以将 Spring 的<import />${parameter}一起使用,以便在运行时决定实际文件。例如,您可以将服务配置拆分为两个文件。"内部"文件可以包含应用程序实现的所有服务,"外部"配置文件可以包含外部配置,包括数据库连接,JMS连接,邮件服务器等。

例如:应用程序上下文.xml

<context:property-placeholder/>
<import resource="classpath:internal-services.xml" />
<import resource="classpath:${environment}/external-services.xml" />

对于生产环境,可以将environment=prod作为系统属性传递,并加载包含"真实"服务的prod/external-services.xml。对于测试,您可以通过environment=mock并加载包含所有外部服务的模拟mock/external-services.xml

最新更新