我有一个运行在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中的不同资源,同时只有一个引用名称?
我发现的另一种方法是拥有不同的资源文件,我可以在每个配置文件中包含和排除这些资源文件,还有很多资源文件,但可能还有一个更简单的解决方案,我只是不会这样做。我现在看。
答案 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选项....