如何部署Web应用程序并创建其资源
之前在glassfish 4上部署“myapp.war”之前我必须这样做
- 创建jdbc连接池(/WEB-INF/glassfish-resources.xml – >
jdbc-connection-pool
本身不起作用…从asadmin可以正常工作) - 为池创建jdbc资源(/WEB-INF/glassfish-resources.xml – >
jdbc-resource
与上面相同) - 创建auth-realm(没有自动,现在使用asadmin)
- 创建模式(peristence.xml – >
property javax.persistence.schema-generation.create-database-schemas
,但是是伪造的) - 创建表(persistence.xml – >`create-tables’,不完美,但至少它可以工作)
现在我在做:
- 在/ tmp / install上传“myapp.war”,“glassfish-resources.xml”
-
asadmin add-resources ...
-
asadmin create-auth-realm ...
-
asadmin deploy ...
-
asadmin disable myapp ...
-
nano /.../glassfish/applications/myapp/WEB-INF/classes/META-INF/persistence.xml
- 注释几行,
ctrl+o
,enter
,ctrl+x
,enter
-
asadmin enable myapp ...
-
rm -Rf /tmp/install
没有其他建议我打算:
- 在/ tmp / install上传“myapp.war”,“deploy.sh”
-
chmod +x deploy.sh
-
./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.xml
在META-INF
(而不是WEB-INF
)内,则glassfish会读取该文件,并且它也存在于http:“applications> myapp> descriptors”下的http ui中
最后我找到了解决方案:
-
数据库创建/升级 :在
ServletContextListener.contextInitialized
我使用编译时生成的ddl脚本创建数据库(如果不存在),或者使用liquibase升级数据库(如果存在)。 不再有用于数据库生成的persistence.xml用法。 -
身份validation领域部署 :我不部署或创建任何特定于容器的领域。 在
ServletContextListener.contextInitialized
我注册了一个自定义JASPIC实现,它本身就是一个JAAS登录模块包装器。 感谢@ArjanTijms的这篇文章和这个答案
您可以为glassfish-resources.xml中的jdbc-connection-pool和jdbc-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命名样式。