具体来说,我说的是GlassFish服务器和MySQL数据库。
我在部署时通过asadmin
为我的应用程序创建JDBC数据源。由于我希望能够同时运行我的应用程序的多个实例,我希望数据源(以及身份验证领域)标识符是可变的,并且可以使用Docker环境变量进行配置。
基本上,我希望每个应用程序实例都有自己的数据库,但同时我希望所有实例共享同一个应用程序和MySQL服务器。
所以我需要能够在部署时配置persistence.xml
和web.xml
中的条目(特别是我的持久性单元的jta-data-source
和我的登录配置的realm-name
这听起来很简单,但结果非常困难。我发现有一些解决方案,但在我看来非常黑客:
.war
。显然,如果每个实例都共享相同的代码,我不想为它们构建一个新的应用程序。${reference}
。我根本找不到使用GlassFish设置应用程序作用域系统属性的正确方法。那我该怎么做呢?
另外注意:在运行时修改身份验证领域时,我总是需要重启服务器,对吗?它有什么办法吗?有没有更好的方法来处理这个一般用例(答案可能是肯定的)?
答案 0 :(得分:0)
我设法找到了一种不太难看的方式。它有点类似于@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)中发布的第一种方法的过程从编译转移到部署时间。
答案 1 :(得分:0)
使用GlassFish,可以在部署时覆盖web.xml
和glassfish-web.xml
描述符。在asadmin
部署命令中,您可以分别使用--altdd
和--runtimealtdd
指定路径。
使用资源引用时,根本不需要修改persistence.xml!您只需将JTA数据源映射到glassfish-web.xml
中的另一个JNDI名称:
<resource-ref>
<res-ref-name>_SOURCE_NAME_</res-ref-name>
<jndi-name>jdbc/AlternativeJTADataSource</jndi-name>
</resource-ref>
然后在部署时可以执行以下操作:
web.xml
(web.xml应该已经定义了resource-ref
)glassfish-web.xml
asadmin deploy --altdd web.xml --runtimealtdd glassfish-web.xml application.war