java - 动态设置 Java Web 应用程序的资源

标签 java mysql jakarta-ee web glassfish

具体来说,我谈论的是 GlassFish 服务器和 MySQL 数据库。

我在部署时通过 asadmin 为我的应用程序创建 JDBC 数据源。由于我希望能够同时运行应用程序的多个实例,因此我希望数据源(以及身份验证领域)标识符是可变的并且可以使用 Docker 环境变量进行配置。

基本上,我希望每个应用程序实例都有自己的数据库,但同时我希望所有实例共享相同的应用程序和 MySQL 服务器。

因此,我需要能够在部署时配置 persistence.xmlweb.xml 中的条目(特别是 jta-data-source我的持久性单元的 code> 和我的登录配置的 realm-name)。

这听起来是一项很简单的任务,但事实证明却非常困难。我发现了一些解决方案,但我认为这些解决方案非常hacky:

  • 使用 Maven 修改部署描述符并为每个实例构建不同的 .war。显然,如果它们都共享相同的代码,我不想为每个实例构建一个新应用程序。
  • 在 GlassFish 域文件系统中部署后修改部署描述符。这需要重新启动服务器并为每个实例进行两次部署。
  • 使所有实例共享同一个数据库。这是常见做法吗?似乎是不必要的开销。
  • 使用系统属性并在描述符中${reference}它们。我根本找不到使用 GlassFish 设置应用程序范围的系统属性的正确方法。

那么我该怎么做呢?

另一个注意事项:在运行时修改身份验证领域时,我总是需要重新启动服务器,对吗?有什么办法解决吗?有没有更好的方法来处理这个一般用例(答案可能是肯定的)?

最佳答案

我设法找到了一种不太符合我口味的方法。这有点类似于 @rene-m 在他的 WildFly Dockerfile 中所做的事情,也类似于我已经对 SQL 数据库设置脚本所做的事情。

  1. 我已用占位符替换了数据源和身份验证领域的字符串:

    <jta-data-source>_SOURCE_NAME_</jta-data-source>
    <realm-name>_AUTH_REALM_</realm-name>
    
  2. 在部署脚本中,我提取 web.xmlpersistence.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/

相关文章:

java - 是否有一种干净(且为空安全)的方法来乘以 Java 中的映射值?

java - 从 HQL 查询返回映射并进行更好的优化

mysql 查询以获取按日期、时间和名称排序的数据(但不想在每个日期下拆分通用名称)

php - 在自定义数据库中存储用户数据

mysql - 在Mysql中对链表进行排序

jakarta-ee - JSF 请求范围的 bean 不断在每个请求上重新创建新的有状态 session bean?

java - 与 map 比较时获取重复值

java - 创建ejb项目时可以生成的 "client ejb"模块的用途是什么?

java - 将二维数组保存到磁盘文件

java - 网 bean 7 : How to unwrap long lines of code and editor context-menu "Format"