Glassfish:在部署期间修改EAR的部署描述符

经过几天的搜索,尝试和头撞,我把这个问题发布到了SO虽然似乎已经回答了。

这是场景:我有一个EAR应用程序,包含(目前)一个WAR和一个EJB模块。 EJB模块使用JPA(persistence.xml),一些无状态会话Bean通过Web服务公开。 Web服务使用带有jdbc领域的基本身份validation。 Web模块使用具有相同领域的表单身份validation。

要求 :我需要能够在不同的服务器(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中的context-root(如果它有任何不同,我可以将它移动到web.xml,见下文)
  • glassfish-application.xml中的领域

在我的研究期间,我管理了以下内容:

  • 我可以使用asadmin set-web-context-param覆盖javax.faces.PROJECT_STAGE
  • 我可以在asadmin deploy期间使用部署计划覆盖glassfish-ejb-jar.xml中的所有设置
  • 这同样适用于glassfish-application.xml
  • 我可以在asadmin deploy期间覆盖context-root(我不知道它如何在EAR中使用多个Web模块)

到现在为止还挺好。 这让我有以下问题:

  • 如何轻松修改web.xml中的域名?
  • 如何在persistence.xml中轻松修改jta-data-source?

我的意思是在部署期间或使用类似于部署计划jar的东西。 仅使用修改后的.xml文件维护ejb.jar或war的多个副本不是一种选择。

需要明确的是,需要使用相同的应用程序来建立不同的数据库(在开发的不同阶段或不同的客户)。 该应用程序使用一个持久性单元,但它需要指向不同的数据库(因此jta-data-source)。 领域是一个jdbc领域(在同一个数据库上),每个应用程序实例也需要不同。

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

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