2

经过几天的搜索、尝试和猛烈抨击,我将这个问题发布给 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_STAGEasadmin 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 领域(在同一个数据库上),每个应用程序实例也需要不同。

任何帮助或指针将不胜感激。

4

2 回答 2

1

您是否考虑过为部署描述符准备模板,并在构建期间使用属性文件中的值填充它们?如果您使用的是 ant,则可以使用expandproperties过滤器。

于 2012-08-03T17:52:50.850 回答
0

您可以使用部署计划 jar 来完成所有这些事情。

在与部署相关的任何繁重工作发生之前,部署计划 jar 的内容似乎已被推送到应用程序的存档/目录树中。

http://java.net/projects/glassfish/sources/svn/content/trunk/main/appserver/deployment/javaee-core/src/main/java/org/glassfish/javaee/core/deployment/DolProvider.java

http://java.net/projects/glassfish/sources/svn/content/trunk/main/appserver/deployment/dol/src/main/java/com/sun/enterprise/deployment/archivist/Archivist.java

于 2012-08-03T21:58:43.867 回答