【问题标题】:Access pom property from glassfish-resources.xml从 glassfish-resources.xml 访问 pom 属性
【发布时间】:2014-07-01 09:34:25
【问题描述】:

如何使用 pom.xml 中的属性设置 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>

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

【问题讨论】:

  • 如果我想在 glassfish-resources.xml 文件中再添加一个连接池连接到不同的数据库该怎么办

标签: java maven glassfish


【解决方案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)

目前,替换插件需要访问目标资源 在它被打包成档案之前。然而,标准的 WAR 包装 不公开 Web 资源(src/main/webapp 下的任何内容)以供使用 在其他插件中并作为单个执行运行。幸运的是,我们可以 调用 war:exploded 在构建的早期复制这些资源 生命周期,以便它们可以被 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>

另请参阅:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-07
    • 2012-03-31
    • 1970-01-01
    • 2013-01-23
    • 2012-07-15
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多