来自context.xml的不同资源用于maven配置文件

时间:2018-06-06 06:29:19

标签: java maven tomcat

我有一个运行在tomcat 8上的应用程序正常工作。现在我想为开发,测试和生产环境构建应用程序,其中应用程序连接到不同的数据库服务器,我想选择在不同配置文件中设置的maven属性使用哪个资源。

因此,在我的context.xml中,我为每个数据库服务器定义了这样的数据源。

<Resource name="jdbc/db-dev" auth="Container"
    type="javax.sql.DataSource" maxTotal="1000" maxIdle="30"
    maxWaitMillis="10000" username="user" password="password"
    driverClassName="org.mariadb.jdbc.Driver"
    url="jdbc:mariadb://x.x.x.x:3306/dbname;" />

<Resource name="jdbc/db-test" auth="Container"
    type="javax.sql.DataSource" maxTotal="1000" maxIdle="30"
    maxWaitMillis="10000" username="user" password="password"
    driverClassName="org.mariadb.jdbc.Driver"
    url="jdbc:mariadb://x.x.x.x:3306/dbname;" />

在我的web.xml中

<resource-ref>
    <description>DB Connection</description>
    <res-ref-name>${db.context}</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

在我的pom.xml中

<profile>
    <id>dev</id>
    <properties>
        <db.context>jdbc/db-dev</db.context>
    </properties>
</profile>

在Java中

try {
    Context initContext = new InitialContext();
    Context envContext = (Context) initContext.lookup(ENV);
    DataSource ds = (DataSource) envContext.lookup("jdbc/db"); // jdbc/db-??? is the issue
    return ds.getConnection();
} catch (NamingException e) {
    throw new SQLException(e);
}

存在问题,在Java中我有一个固定的字符串值,只指向一个资源。我知道我可以在构建期间创建一个属性文件,但是对于那个值,它似乎有点太多了。有没有办法让资源引用指向上下文xml中的不同资源,同时只有一个引用名称?

我发现的另一种方法是拥有不同的资源文件,我可以在每个配置文件中包含和排除这些资源文件,还有很多资源文件,但可能还有一个更简单的解决方案,我只是不会这样做。我现在看。

1 个答案:

答案 0 :(得分:1)

我希望每个环境都有相同的二进制文件(即本例中的WAR),以便遵循&#34;构建一个,经常部署&#34; CI / CD原则。依赖于环境的配置在某些方面将是injected,例如通过环境变量,启动应用程序时的JVM选项或外部配置文件等。

this开始,Tomcat支持在其配置文件中使用${xxxx}进行变量替换:

  

Tomcat配置文件被格式化为无模式XML;分子   和属性区分大小写。 Apache Ant风格的变量   支持替代;名为propname的系统属性   可以使用语法$ {propname}在配置文件中使用。所有   系统属性可用,包括使用-D设置的属性   语法,由JVM和那些自动提供的语法   在$ CATALINA_BASE / conf / catalina.properties文件中配置。

所以,context.xml可能看起来像:

<Resource name="jdbc/db" auth="Container"
    type="javax.sql.DataSource" maxTotal="1000" maxIdle="30"
    maxWaitMillis="10000" username="${DB_USER}" password="${DB_PASSWORD}"
    driverClassName="org.mariadb.jdbc.Driver"
    url="jdbc:mariadb://${DB_HOST}/dbname;" />

然后在启动tomcat等时将${DB_USER}${DB_PASSWORD}${DB_HOST}配置为环境变量或JVM选项....