`
chainhou
  • 浏览: 174653 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GlassFish 中的jsr88

阅读更多
由于最近遇到了相关问题,所以看了看jsr88

什么是jsr88?
由于存在许多的AppServer,各个Server可部署的应用的格式也许各不相同,那为了适应不同的Server,开发者需要更换应用的形式,才可以部署到不同的AppServer上。为此,JCP提出了JSR88
Java Application Deployment(JSR 88)来解决这个问题.
更详细的说明,看这里:http://www.ibm.com/developerworks/cn/opensource/os-ag-remotedeploy/
有了jsr88后,各个AppServer只要指定
J2EE-DeploymentFactory-Implementation-Class:xxx.xxx.XXXFactory
即可。相应的部署需要时会调用指定的Factory

GlassFish中的jsr88指定为
org.glassfish.deployapi.SunDeploymentFactory

具体加载:
   protected void initialize() {
                
        File[] elligibleFiles = getListOfDeploymentFactoryFiles();
        if (elligibleFiles==null) {
            return;
        }
           
        for (int i=0;i<elligibleFiles.length;i++) {
            try {
                installDeploymentFactory(elligibleFiles[i]);
            } catch(Exception ioe) {
                ioe.printStackTrace();
                DOLUtils.getDefaultLogger().log(Level.SEVERE, "enterprise.deployment.backend.deplyomentManagerLoadFailure",
                    new Object[] {elligibleFiles[i].getName()});
            }
        }        
    }
获取到指定的类后加载
public void installDeploymentFactory(File installedDM) throws IOException {
        
        if (DOLUtils.getDefaultLogger().isLoggable(Level.FINE)) {
            DOLUtils.getDefaultLogger().fine("Installing Deployment factory = " 
                    + installedDM.getAbsolutePath());
        }
        
        // let's check first that we indeed have a valid 
        // deployment manager implementation
        
        /*
         *Declare the JarFile and Manifest but populate them inside the first try block.  This way the 
         *jar file can be closed right away to conserve resources.
         */
        JarFile jarFile = null;
        Manifest m = null;
        try {
            jarFile = new JarFile(installedDM);
            m = jarFile.getManifest();
        } finally {
            /*
             *The jarFile.close can throw IOException, but this method also throws that exception so there is no
             *need to catch it and wrap it here in the finally clause.
             */
            jarFile.close();
            jarFile = null;
        }
        String className = m.getMainAttributes().getValue(J2EE_DEPLOYMENT_MANAGER);
        URL[] urls = new URL[]{installedDM.toURI().toURL()};
        URLClassLoader urlClassLoader = new java.net.URLClassLoader(urls, getClass().getClassLoader());
        Class factory = null;
        try {
            factory=urlClassLoader.loadClass(className);
        } catch (ClassNotFoundException cnfe) {
            DOLUtils.getDefaultLogger().log(Level.SEVERE, "enterprise.deployment.backend.deplyomentManagerLoadFailure",
                new Object[] {"Unable to load declared DeploymentManagerFactory"});
            throw new IllegalArgumentException(className + " is not present in the " + installedDM.getName());
        }
        
        // Ok we have the class, let's instanciate it, check it and 
        // if everything is fine, register it to the DeploymentFactoryManager
        Object df = null;
        try {            
            df = factory.newInstance();
        } catch (Exception ie) {
            DOLUtils.getDefaultLogger().log(Level.SEVERE, "enterprise.deployment.backend.deplyomentManagerLoadFailure",
                    new Object[]{className});
            ie.printStackTrace();
            throw new IllegalArgumentException("Cannot install " + installedDM.getName());
        }
        if (df instanceof DeploymentFactory) {
            DeploymentFactoryManager.getInstance().registerDeploymentFactory((DeploymentFactory) df);
        } else {
            throw new IllegalArgumentException("The " + className + 
                " declared as a DeploymentFactory does implement the DeploymentFactory interface");
        }
    }

getListOfDeploymentFactoryFiles()获取指定目录下的jsr88的实现指定类
在指定的jar包的META-INF/MANIFEST.MF文件中指定了实现类:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 1.5.0_22-b03 (Sun Microsystems Inc.)
J2EE-DeploymentFactory-Implementation-Class: org.glassfish.SunDeploymentFactory
Specification-Title: Java Platform, Enterprise Edition Specification
Specification-Vendor: Sun Microsystems, Inc.
Specification-Version: 5.0


分享到:
评论

相关推荐

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

    5. **示例代码**:JSR88Test中的代码可能包括了创建部署计划,设置服务器环境,执行部署操作的示例,帮助读者理解和实践。 6. **错误处理**:在部署过程中可能遇到的问题,如服务器配置不正确,部署计划错误,以及...

    GlassFish 解析

    GlassFish是Oracle公司主导的开源项目,它遵循JSR(Java Specification Requests)规范,支持Java EE的各种组件,如Servlet、JSP、EJB、JMS、JPA等。作为一款全面的企业级应用服务器,GlassFish提供了强大的管理和...

    Beginning Java EE 6 with GlassFish 3, 2nd Edition

    同时,他还参与了多个Java EE规范的制定工作,包括JSR-316(Java EE 6)、JSR-317(JPA 2.0)和JSR-318(EJB 3.1)。 #### 七、书籍详情 - **页数**: 536页 - **出版社**: Apress(2010年8月出版第二版) - **语言...

    glassfish 上的 batch application 紀錄如何清1

    在IT行业中,Glassfish是一个流行的开源应用服务器,它支持各种应用程序的部署,包括批处理应用(batch application)。本文主要讨论的是如何清理在Glassfish上运行批处理应用时积累的记录,这些记录可能会随着时间...

    GlassFish v3

    该版本作为GlassFish系列中的一个重要里程碑,在性能、稳定性和功能上都有显著提升。 - **主要特点**: - 支持最新的Java EE 6规范。 - 提供轻量级部署模型,简化了应用部署流程。 - 支持模块化架构,能够根据...

    GlassFish:CXF调用错误-----Cannot create a secure XMLInputFactory

    XMLInputFactory是Java的JSR-311规范中定义的一个接口,用于创建处理XML输入流的对象。这个错误通常发生在尝试创建一个安全的XMLInputFactory实例时失败,这可能是因为系统中缺少必要的安全配置或者存在不安全的默认...

    Adopt-a-JSR:采用 JSR

    glassfish 页面( )用于采用 JSR 总结它很好: 分享想法和反馈,可能通过在公共问题跟踪器中输入问题(几乎每个 JSR 都有一个)。 使用电子邮件时,请在主题行中使用“Adopt-a-JSR”以获得更大的可见性。 对于

    Beginning Java™ EE 6 Platform with GlassFish™ 3 Second Edition

    本书由Antonio Goncalves撰写,他不仅是本书作者,同时也是JSR-316 (Java EE 6)、JSR-317 (JPA 2.0) 和 JSR-318 (EJB 3.1) 技术规范的专家成员之一。因此,本书不仅覆盖了理论知识,还包含了大量实践经验。 #### 第...

    Java Specification Requests .zip

    4. **开源与JSR**:许多JSR的实现都是开源的,如Eclipse GlassFish实现了JSR 356(WebSocket API),Hibernate ORM对应了JSR 338(持久化元数据2.0版)等。这使得开发者可以直接参与这些规范的实现和改进。 5. **...

    jsr353-benchmark:基于JMH的基准测试套件,用于基准测试JSR 353(用于JSON处理的Java API)实现

    基于JMH的基准测试套件,用于对各种JSON解析器进行基准测试(当前:Jackson,Genson,GSON,Glassfish JSR 353 RI和Apache Johnzon)。 还会生成基准结果图表。 Usage: java -Xmx2048m -Xms2048m -jar json-parser-...

    cargo-core-tools-jboss-deployer-7-1.4.6.zip

    【压缩包子文件的文件名称列表】中的"jsr107tck-master"可能是JSR 107 TCK项目的主分支,通常在Git等版本控制系统中,"master"分支代表了项目的主要开发线。这个目录可能包含了TCK的所有源代码、测试用例、文档和...

    websocket-demo:使用 JSR356 Tyrus 的示例 websockets 应用程序

    7. **部署与测试**: 将 WebSocket 服务器端点部署到支持 JSR356 的应用服务器,如 Tomcat、GlassFish 或 WildFly,然后使用 Tyrus 客户端或者浏览器中的 WebSocket 测试工具进行交互测试。 通过这个“websocket-...

    injectLogger:这是 glassfish 或 jboss 注入记录器。 @Inject 记录器记录器;

    在给定的标题和描述中,我们聚焦于“注入记录器”,这通常指的是通过依赖注入(Dependency Injection,DI)机制来管理日志组件,特别是针对Glassfish和JBoss这样的Java应用服务器。这两个服务器都支持Java EE规范,...

    java_ee_sdk-8u1.zip

    3. **JSR 371 - MongoDB Java Driver for Java EE**:提供了在Java EE环境中与MongoDB数据库交互的标准API。 4. **JSR 374 - Java API for JSON Processing (JSON-P) 1.1** 和 **JSR 375 - Java API for JSON ...

    javaee8-samples:Java EE 8示例

    它们分类在不同的目录中,每个目录用于每个Technology / JSR。 有些样品/测试有说明文件,否则请阅读代码。 怎么跑? 使用Arquillian在Payara,GlassFish和Tomcat上测试了样本。 Arquillian使用容器配置文件来...

    JAVAEE6标准规范

    Java EE 6 提供了一个简化的开发者体验,接纳了创新的开源框架,提供了一个全面的 Web Profile,适用于轻量级、基于标准的 Web 应用程序,并正式开始了从技术栈中修剪过时和未使用的旧技术的过程。 ##### ...

Global site tag (gtag.js) - Google Analytics