如何部署Web应用程序并创建其资源

之前在glassfish 4上部署“myapp.war”之前我必须这样做

  1. 创建jdbc连接池(/WEB-INF/glassfish-resources.xml – > jdbc-connection-pool本身不起作用…从asadmin可以正常工作)
  2. 为池创建jdbc资源(/WEB-INF/glassfish-resources.xml – > jdbc-resource与上面相同)
  3. 创建auth-realm(没有自动,现在使用asadmin)
  4. 创建模式(peristence.xml – > property javax.persistence.schema-generation.create-database-schemas ,但是是伪造的)
  5. 创建表(persistence.xml – >`create-tables’,不完美,但至少它可以工作)

现在我在做:

  1. 在/ tmp / install上传“myapp.war”,“glassfish-resources.xml”
  2. asadmin add-resources ...
  3. asadmin create-auth-realm ...
  4. asadmin deploy ...
  5. asadmin disable myapp ...
  6. nano /.../glassfish/applications/myapp/WEB-INF/classes/META-INF/persistence.xml
  7. 注释几行, ctrl+oenterctrl+xenter
  8. asadmin enable myapp ...
  9. rm -Rf /tmp/install

没有其他建议我打算:

  1. 在/ tmp / install上传“myapp.war”,“deploy.sh”
  2. chmod +x deploy.sh
  3. ./deploy.sh

并且脚本将处理所有事情。 但是我想通过glassfish http console上传一个war文件并获得相同的结果。

有没有办法 contextInitialized 之前调用一个类或脚本?

你会如何部署这个东西?


为了完整性,这里有一些额外的信息:

/myapp/WEB-INF/classes/META-INF/persistence.xml

    org.eclipse.persistence.jpa.PersistenceProvider jdbc/myapp false NONE             <!--  --> <!--  --> <!--  --> <!--  --> <!--  --> <!--  --> <!--  -->    

/myapp/WEB-INF/glassfish-resources.xml

               

虽然glassfish了解/ CREATE SCHEMA myapp /…/persistence.xml(有时也执行CREATE SCHEMA myapp ,有时候不执行,显然是随机的 – 但它很好),

我绝对不能把glassfish读成/myapp/WEB-INF/glassfish-resources.xml。 它忽略了这个文件。

UPDATE glassfish读取文件,但使用java:app/破坏其他引用的jndi名称前缀。 知道这件事我用前缀重写引用,现在它工作正常。 最后,我注意到如果glassfish-resources.xmlMETA-INF (而不是WEB-INF )内,则glassfish会读取该文件,并且它也存在于http:“applications> myapp> descriptors”下的http ui中

最后我找到了解决方案:

  1. 数据库创建/升级 :在ServletContextListener.contextInitialized我使用编译时生成的ddl脚本创建数据库(如果不存在),或者使用liquibase升级数据库(如果存在)。 不再有用于数据库生成的persistence.xml用法。

  2. 身份validation领域部署 :我不部署或创建任何特定于容器的领域。 在ServletContextListener.contextInitialized我注册了一个自定义JASPIC实现,它本身就是一个JAAS登录模块包装器。 感谢@ArjanTijms的这篇文章和这个答案

您可以为glassfish-resources.xml中jdbc-connection-pooljdbc-resource配置应用程序作用域资源,并在部署WAR文件时创建它们。 取消部署WAR后,它们就会消失。 这解决了使用asadmin手动添加它们的问题。 我通常使用GUI手动设置它,然后将domain.xml中元素复制并粘贴到glassfish-resources.xml中,然后更改jndi-name作为应用程序作用域,例如:

  

然后我确保将glassfish-resources.xml打包到WAR文件中的适当位置,即WEB-INF文件夹中。

根据我在Glassfish 4的Oracle文档中所读到的,似乎您不能像使用JDBC那样将auth-realm配置与应用程序打包在一起。 我已经为此glassfish auth-realm打包增强提交了增强请求。只有您可以在各种部署描述符中将关联打包到域中,请参阅本指南的“如何为应用程序或模块设置域”部分细节。

HACK警报

实际上我只想到了一些有点黑客的东西,但可能会解决这个问题。 您可以创建一个简单的Web APP,其中包含您的真实应用程序WAR文件(在资源目录中)。 这个包装器应用程序将包括一个REST客户端(如Jersey客户端),它将对Glassfish管理REST API进行REST调用,以查看auth-realm是否存在并配置。 如果是,它将使用REST API来部署嵌入的WAR文件。 如果不是,它将使用REST API创建auth-realm然后它将部署WAR。

我不太清楚你在架构生成方面遇到的问题,但是这些都是通过persistence.xml支持的,并且工作正常。 如果您想要自动迁移脚本的更多function,那么我会考虑集成像FlyAway这样的软件包

这是一个glassfish-resources.xml文件的示例,其中包含应用范围的资源,这些资源在Glassfish 3.1.2下适用于我。 您拥有的一些属性我没有,我也没有对jdbc-resource上的pool-name使用JDBC JNDI命名样式。