繁体   English   中英

来自Maven概要文件的context.xml中的不同资源

[英]Different resources from context.xml for maven profiles

我有一个运行在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中,我有一个固定的字符串值,仅指向一个资源。 我知道我可以在构建过程中创建一个属性文件,但是对于一个值来说似乎有点多。 有没有一种方法可以让resource-ref指向与上下文xml不同的资源,而只有一个引用名称?

我发现的另一种方法是拥有不同的资源文件,可能每个配置文件都可以包含和排除该文件,但尚未深入了解,但也许有一个更简单的解决方案,我现在看不到。

我希望每个环境都具有相同的二进制文件(在这种情况下,即WAR),以便遵循“构建一个,经常部署”的CI / CD原则。 然后,将以某种方式注入依赖于环境的配置,例如在启动应用程序或外部配置文件时通过环境变量,JVM选项。

由此 ,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选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM