经过几天的搜索、尝试和猛烈抨击,我将这个问题发布给 SO,尽管它似乎已经得到了回答。
这是场景:我有一个 EAR 应用程序,其中包含(目前)一个 WAR 和一个 EJB 模块。EJB 模块使用 JPA (persistence.xml),一些无状态会话 Bean 通过 Web 服务公开。Web 服务使用带有 jdbc 领域的基本身份验证。Web 模块使用具有相同领域的表单身份验证。
要求:我需要能够在不同的服务器(dev/test/prod)或具有不同部署描述符的同一服务器(或集群)上部署此应用程序。每个应用程序实例中需要不同的部署设置是:
- persistence.xml 中的 jta-data-source
- web.xml 中的领域名称
- web.xml 中的 javax.faces.PROJECT_STAGE
- glassfish-ejb-jar.xml 中的 webservice-endpoint\endpoint-address-uri 和 login-config\realm
- application.xml 中的上下文根(如果有任何区别,我可以将其移至 web.xml,见下文)
- glassfish-application.xml 中的领域
在我的研究过程中,我管理了以下内容:
- 我可以使用覆盖 javax.faces.PROJECT_STAGE
asadmin set-web-context-param
- 我可以使用部署计划覆盖 glassfish-ejb-jar.xml 中的所有设置
asadmin deploy
- 这同样适用于 glassfish-application.xml
- 我可能可以在期间覆盖上下文根
asadmin deploy
(我不知道这将如何与 EAR 中的多个 Web 模块一起使用)
到现在为止还挺好。这给我留下了以下问题:
- 如何轻松修改 web.xml 中的领域名称?
- 如何轻松修改persistence.xml 中的jta-data-source?
很容易,我的意思是在部署期间或使用类似于部署计划 jar 的东西。仅使用修改后的 .xml 文件来维护 ejb.jar 或 war 的多个副本不是一种选择。
需要明确的是,需要有不同的数据库(在不同的开发阶段或针对不同的客户)使用相同的应用程序。该应用程序使用一个持久性单元,但它需要指向不同的数据库(因此是 jta-data-source)。该领域是一个 jdbc 领域(在同一个数据库上),每个应用程序实例也需要不同。
任何帮助或指针将不胜感激。