从glassfish-resources.xml访问pom属性

时间:2014-07-01 09:34:26

标签: java maven glassfish

如何使用pom中的属性设置glassfish-resources.xml中jdbc-connection-pool属性的值。

例如,我的pom.xml

...
<profiles>
  <profile>
    <id>dev</id>
      <properties>
        <database.dbname>Xpto</database.dbname>
        ...
      </properties>
    </profile>
  ...
</profiles>
...

和glassfish-resources.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1       Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
<custom-resource res-type="java.util.Properties" jndi-name="jndi/iprofile" 
                factory-class="org.glassfish.resources.custom.factory.PropertiesFactory">
    <property name="name" value="${webapp.profile}" />
</custom-resource> 
<jdbc-resource enabled="true" jndi-name="jdbc/users" object-type="user" pool-name="MY-POOL">
    <description/>
</jdbc-resource>
<jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.microsoft.sqlserver.jdbc.SQLServerXADataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="MY-POOL" non-transactional-connections="false" ping="false" pool-resize-quantity="2" pooling="true" res-type="javax.sql.XADataSource" statement-cache-size="0" statement-leak-reclaim="false" statement-leak-timeout-in-seconds="0" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
    <property name="serverName" value=""/>
    <property name="PortNumber" value=""/>
    <property name="DatabaseName" value=""/>
    <property name="User" value=""/>
    <property name="Password" value=""/>
</jdbc-connection-pool>

我想设置DatabaseName属性,其值为pp中定义的值Xpto。其他配置文件具有database.dbname属性的不同值。

1 个答案:

答案 0 :(得分:1)

您可以使用maven-replacer-plugin解决此类任务。它可以用来替换文件中的值。

以下是一个例子:

像您一样定义您的财产:

<properties>
 <database.dbname>Xpto</database.dbname>
</properties>

glassfish-resources.xml中更改要替换的媒体资源,如下所示:

<property name="DatabaseName" value="DATABASENAME"/>

DATABASENAME用于替换。您可以使用任何值,但在要修改的文件中它必须是唯一的。

maven-war-plugin的配置更改为:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <executions>
        <execution>
            <id>prepare-war</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>exploded</goal>
            </goals>
        </execution>
        <execution>
            <id>default-war</id>
            <phase>package</phase>
            <goals>
                <goal>war</goal>
            </goals>
            <configuration>
                <warSourceDirectory>${project.build.directory}/${project.build.finalName}</warSourceDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

来自maven-replacer-plugin wiki (have a look at this page for details how the maven-replacer-plugin and the maven-war-plugin work together)

  

目前,replacer插件需要访问目标资源   在将其打包到存档之前。但是,标准的WAR包装   不会公开Web资源(src / main / webapp下的任何内容)以供使用   在其他插件中并作为单个执行运行。幸运的是,我们可以   调用war:爆炸以在构建中更早地复制这些资源   生命周期,以便maven-replacer-plugin可以使用它们。该   然后,标准包使用将使用修改后的Web资源   创建WAR工件。

maven-replacer-plugin的以下配置添加到pom.xml

<plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.3</version>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>replace</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <file>target/${project.build.finalName}/WEB-INF/glassfish-resources.xml</file>
        <token>DATABASENAME</token>
        <value>${database.dbname}</value>
    </configuration>
</plugin>

正如您所见,令牌DATABASENAME已替换为${database.dbname}的值。这是在prepare-package阶段完成的,即在将Web应用程序内容复制到爆炸的WAR目录之后,但在将目录打包为WAR文件之前。

如果替换无效,您可能需要将maven-war-plugin降级为 2.0.1 版本。

如果要替换多个不同的值,可以使用以下内容替换配置中的标记和值:

<replacements>
    <replacement>
        <token>DATABASENAME</token>
        <value>${database.dbname}</value>               
    </replacement>
</replacements>

另见: