欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用JSR-88往Java EE应用服务器上部署应用

程序员文章站 2022-04-26 19:50:08
...

概述

每种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往Java EE应用服务器上部署应用
            
    
    博客分类: Java EE Java EEJSR-88部署 
 (图片来自于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有一个就可以了

  • 用JSR-88往Java EE应用服务器上部署应用
            
    
    博客分类: Java EE Java EEJSR-88部署 
  • 大小: 61.6 KB