日期:2014-05-16  浏览次数:20381 次

用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