具体来说,我谈论的是 GlassFish 服务器和 MySQL 数据库。
我在部署时通过 asadmin
为我的应用程序创建 JDBC 数据源。由于我希望能够同时运行应用程序的多个实例,因此我希望数据源(以及身份验证领域)标识符是可变的并且可以使用 Docker 环境变量进行配置。
基本上,我希望每个应用程序实例都有自己的数据库,但同时我希望所有实例共享相同的应用程序和 MySQL 服务器。
因此,我需要能够在部署时配置 persistence.xml
和 web.xml
中的条目(特别是 jta-data-source
我的持久性单元的 code> 和我的登录配置的 realm-name
)。
这听起来是一项很简单的任务,但事实证明却非常困难。我发现了一些解决方案,但我认为这些解决方案非常hacky:
- 使用 Maven 修改部署描述符并为每个实例构建不同的
.war
。显然,如果它们都共享相同的代码,我不想为每个实例构建一个新应用程序。 - 在 GlassFish 域文件系统中部署后修改部署描述符。这需要重新启动服务器并为每个实例进行两次部署。
- 使所有实例共享同一个数据库。这是常见做法吗?似乎是不必要的开销。
- 使用系统属性并在描述符中
${reference}
它们。我根本找不到使用 GlassFish 设置应用程序范围的系统属性的正确方法。
那么我该怎么做呢?
另一个注意事项:在运行时修改身份验证领域时,我总是需要重新启动服务器,对吗?有什么办法解决吗?有没有更好的方法来处理这个一般用例(答案可能是肯定的)?
最佳答案
我设法找到了一种不太符合我口味的方法。这有点类似于 @rene-m 在他的 WildFly Dockerfile 中所做的事情,也类似于我已经对 SQL 数据库设置脚本所做的事情。
我已用占位符替换了数据源和身份验证领域的字符串:
<jta-data-source>_SOURCE_NAME_</jta-data-source> <realm-name>_AUTH_REALM_</realm-name>
在部署脚本中,我提取
web.xml
和persistence.xml
并用部署参数替换占位符。在 Alpine shell 脚本中,如下所示:# Update .war deployment descriptors. $JAVA_HOME/bin/jar -xfv $WAR_FILE WEB-INF/web.xml $JAVA_HOME/bin/jar -xfv $WAR_FILE WEB-INF/classes/META-INF/persistence.xml sed -i "s|_AUTH_REALM_|$AUTH_REALM|g" WEB-INF/web.xml sed -i "s|_SOURCE_NAME_|$SOURCE_NAME|g" WEB-INF/classes/META-INF/persistence.xml $JAVA_HOME/bin/jar -ufv $WAR_FILE WEB-INF/web.xml $JAVA_HOME/bin/jar -ufv $WAR_FILE WEB-INF/classes/META-INF/persistence.xml rm -rf WEB-INF/
这工作得很好,我只是修改容器范围的 .war
文件,无论如何,该文件仅限于单个部署实例。它将 OP (Maven) 中发布的第一种方法的过程从编译时间转移到部署时间。
关于java - 动态设置 Java Web 应用程序的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41021064/