gpt4 book ai didi

java - 来自 context.xml 的 Maven 配置文件的不同资源

转载 作者:行者123 更新时间:2023-11-28 22:48:09 25 4
gpt4 key购买 nike

我有一个在 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 指向不同的资源,同时只有一个引用名称?

我发现的另一种方法是拥有不同的资源文件,我可以根据配置文件包含和排除这些资源文件,我还没有深入研究它,但也许有一个更简单的解决方案,我现在还没有看到.

最佳答案

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

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

Tomcat configuration files are formatted as schemaless XML; elements and attributes are case-sensitive. Apache Ant-style variable substitution is supported; a system property with the name propname may be used in a configuration file using the syntax ${propname}. All system properties are available including those set using the -D syntax, those automatically made available by the JVM and those configured in the $CATALINA_BASE/conf/catalina.properties file.

所以,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;" />

然后配置 ${DB_USER} , ${DB_PASSWORD}${DB_HOST} 作为启动tomcat时的环境变量或JVM选项等等……

关于java - 来自 context.xml 的 Maven 配置文件的不同资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50713557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com