用JSR-88往Java EE应用服务器上部署应用
概述
每种Java EE应用服务器都为应用部署提供了多种方式,常用的有命令行、Web控制台、自动部署等。除了这些,用户还可以利用JSR-88 往Java EE应用服务器上部署应用。
JSR-88是Java EE Deployment API,定义了往Java EE应用服务器上部署应用的统一模型和API。利用JSR-88的部署工具可以采用统一的方式往不同的Java EE应用服务器上部署应用,而不用了解众多产品之间的诸多差异,从而简化部署过程。如果有相对独立的应用部署需求,或者需要往多种应用服务器上统一、无差别地部署应用,用JSR-88是个不错的选择。
JSR-88要求Java EE应用服务器实现javax.enterprise.deploy.spi包里接口,并能和遵循JSR-88规范的第三方部署工具互相通讯。很多Java EE应用服务器都支持JSR-88。不过JSR-88主要用来部署已打包好的应用程序,应用依赖的资源、使用的服务不能通过JSR-88进行处理。
接口简介
一、javax.enterprise.deploy.spi包里重要的接口有:
- DeploymentManager:部署工具使用Java EE应用服务器提供的部署功能时的入口点
- Target:表示部署Java EE模块/应用的某个服务器实例或某个服务器实例组(即集群)
- TargetModuleID:已部署模块/应用的唯一标识,每个TargetModuleID表示部署在某个Target上的一个模块/应用
二、javax.enterprise.deploy.spi.factories包里还有一个Java EE应用服务器的“部署驱动器”DeploymentFactory,这个工厂返回已经连接到特定Java EE应用服务器的DeploymentManager对象。
JSR-88要求Java EE应用服务器在某个Jar包的manifest文件中暴露出DeploymentFactory接口的实现类,具体是用J2EE-DeploymentFactory-Implementation-Class属性指定实现类的全限定名称。例如JBoss 7.1.1是在modules\org\jboss\as\ee\deployment\main\jboss-as-ee-deployment-7.1.1.Final.jar:META-INF\MANIFEST.MF里指定J2EE-DeploymentFactory-Implementation-Class为org.jboss.as.ee.deployment.spi.factories.DeploymentFactoryImpl。
三、除了上面的几个接口,API还定义了配置、状态、异常等内容,具体介绍可以查看JavaDoc或规范。
处理过程
规范里给出了OID(Object Interaction Diagram,对象交互图),利用JSR-88提供的API编写部署应用的代码时可以参考。下图是部署应用的OID:
(图片来自于JSR-88规范v1.2)
下面是编写工具的主要步骤:
1、获取应用服务器的JSR-88 DeploymentManager
1)访问暴露DeploymentFactory接口的Jar包,获取manifest文件中的J2EE-DeploymentFactory-Implementation-Class属性
2)创建DeploymentFactory实现的实例,并将实例注册到DeploymentFactoryManager里
3)根据应用服务器定义的URI、用户名、密码,获取DeploymentManager对象
示例代码:
// 1) File file = new File("Path of jar file"); Manifest mf = new JarFile(file).getManifest(); String className = mf.getMainAttributes().getValue( "J2EE-DeploymentFactory-Implementation-Class"); // 2) Class factory = Class.forName(className); DeploymentFactory df = (DeploymentFactory) factory .newInstance(); DeploymentFactoryManager dfm = DeploymentFactoryManager .getInstance(); dfm.registerDeploymentFactory(df); // 3) DeploymentManager dm = dfm.getDeploymentManager("URI", "username", "password");
2、调用DeploymentManager的getTargets(获取所有的部署目标)、distribute(发布)、start(启动)、stop(停止)、undeploy(解部署)、redeploy(重部署)、getAvailableModules(获取已部署应用)等方法对应用进行部署处理
3、处理完之后释放到应用服务器的连接
代码写好后,启动应用服务器产品,运行就可以了。
Demo
附件是支持JBoss 7.1.1和GlassFish 3的部署示例代码。代码包含如下文件:
- app.properties:指定应用存放路径(app.path)、部署计划存放路径(plan.path)、应用类型(app.type)。其中应用类型是小写的web、ejb、rar或ear
- dm.properties:指定应用服务器的DeploymentManager相关信息。格式为“filed.product”,filed可以是dm.jar(暴露DeploymentFactory接口的Jar包)、dm.uri(应用服务器指定的URI)、dm.userName(管理用户用户名)、dm.password(管理用户密码);product用来区分不同的应用服务器产品,示例代码要求小写,代码运行时可以指定这里声明的产品名(不指定的话取jboss)
- AppInfo:app.properties的包装类
- DMProperty:dm.properties的包装类
- DeploymentHandler:获取DeploymentManager、封装DeploymentHandler的操作
- JSR88Deployer:测试主类
假设JBoss 7.1.1安装在%JBOSS_HOME%目录,GlassFish 3安装在%GLASSFISH_HOME%目录,ClassPath为:
- %JBOSS_HOME%/modules/javax/enterprise/deploy/api/main/jboss-jad-api_1.2_spec-1.0.0.Final.jar(编译也要用到)
- %JBOSS_HOME%/modules/org/jboss/as/ee/deployment/main/jboss-as-ee-deployment-7.1.1.Final.jar(编译也要用到)
- %JBOSS_HOME%/modules/org/jboss/logging/main/jboss-logging-3.1.0.GA.jar
- %JBOSS_HOME%/modules/org/jboss/as/controller-client/main/jboss-as-controller-client-7.1.1.Final.jar
- %JBOSS_HOME%/modules/org/jboss/threads/main/jboss-threads-2.0.0.GA.jar
- %JBOSS_HOME%/modules/org/jboss/as/protocol/main/jboss-as-protocol-7.1.1.Final.jar
- %JBOSS_HOME%/modules/org/jboss/remoting3/main/jboss-remoting-3.2.3.GA.jar
- %JBOSS_HOME%/modules/org/jboss/xnio/nio/main/xnio-nio-3.0.3.GA.jar
- %JBOSS_HOME%/modules/org/dom4j/main/dom4j-1.6.1.jar
- %JBOSS_HOME%/modules/org/jboss/common-core/main/jboss-common-core-2.2.17.GA.jar
- %JBOSS_HOME%/modules/org/jboss/dmr/main/jboss-dmr-1.1.1.Final.jar
- %JBOSS_HOME%/modules/org/jboss/sasl/main/jboss-sasl-1.0.0.Final.jar
- %JBOSS_HOME%/modules/org/jboss/marshalling/main/jboss-marshalling-1.3.11.GA.jar
- %JBOSS_HOME%/modules/org/jboss/xnio/main/xnio-api-3.0.3.GA.jar
- %GLASSFISH_HOME%/glassfish/modules/javax.enterprise.deploy.jar(编译也要用到)
- %GLASSFISH_HOME%/glassfish/modules/deployment-client.jar
- %GLASSFISH_HOME%/glassfish/modules/common-util.jar
- %GLASSFISH_HOME%/glassfish/modules/deployment-common.jar
- %GLASSFISH_HOME%/glassfish/modules/hk2-core.jar
- %GLASSFISH_HOME%/glassfish/modules/auto-depends.jar
- %GLASSFISH_HOME%/glassfish/modules/glassfish-api.jar
- %GLASSFISH_HOME%/glassfish/modules/admin-cli.jar
其中%GLASSFISH_HOME%/glassfish/modules/javax.enterprise.deploy.jar和%JBOSS_HOME%/modules/javax/enterprise/deploy/api/main/jboss-jad-api_1.2_spec-1.0.0.Final.jar有一个就可以了