由于最近遇到了相关问题,所以看了看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
分享到:
相关推荐
5. **示例代码**:JSR88Test中的代码可能包括了创建部署计划,设置服务器环境,执行部署操作的示例,帮助读者理解和实践。 6. **错误处理**:在部署过程中可能遇到的问题,如服务器配置不正确,部署计划错误,以及...
GlassFish是Oracle公司主导的开源项目,它遵循JSR(Java Specification Requests)规范,支持Java EE的各种组件,如Servlet、JSP、EJB、JMS、JPA等。作为一款全面的企业级应用服务器,GlassFish提供了强大的管理和...
同时,他还参与了多个Java EE规范的制定工作,包括JSR-316(Java EE 6)、JSR-317(JPA 2.0)和JSR-318(EJB 3.1)。 #### 七、书籍详情 - **页数**: 536页 - **出版社**: Apress(2010年8月出版第二版) - **语言...
在IT行业中,Glassfish是一个流行的开源应用服务器,它支持各种应用程序的部署,包括批处理应用(batch application)。本文主要讨论的是如何清理在Glassfish上运行批处理应用时积累的记录,这些记录可能会随着时间...
该版本作为GlassFish系列中的一个重要里程碑,在性能、稳定性和功能上都有显著提升。 - **主要特点**: - 支持最新的Java EE 6规范。 - 提供轻量级部署模型,简化了应用部署流程。 - 支持模块化架构,能够根据...
XMLInputFactory是Java的JSR-311规范中定义的一个接口,用于创建处理XML输入流的对象。这个错误通常发生在尝试创建一个安全的XMLInputFactory实例时失败,这可能是因为系统中缺少必要的安全配置或者存在不安全的默认...
glassfish 页面( )用于采用 JSR 总结它很好: 分享想法和反馈,可能通过在公共问题跟踪器中输入问题(几乎每个 JSR 都有一个)。 使用电子邮件时,请在主题行中使用“Adopt-a-JSR”以获得更大的可见性。 对于
本书由Antonio Goncalves撰写,他不仅是本书作者,同时也是JSR-316 (Java EE 6)、JSR-317 (JPA 2.0) 和 JSR-318 (EJB 3.1) 技术规范的专家成员之一。因此,本书不仅覆盖了理论知识,还包含了大量实践经验。 #### 第...
4. **开源与JSR**:许多JSR的实现都是开源的,如Eclipse GlassFish实现了JSR 356(WebSocket API),Hibernate ORM对应了JSR 338(持久化元数据2.0版)等。这使得开发者可以直接参与这些规范的实现和改进。 5. **...
基于JMH的基准测试套件,用于对各种JSON解析器进行基准测试(当前:Jackson,Genson,GSON,Glassfish JSR 353 RI和Apache Johnzon)。 还会生成基准结果图表。 Usage: java -Xmx2048m -Xms2048m -jar json-parser-...
【压缩包子文件的文件名称列表】中的"jsr107tck-master"可能是JSR 107 TCK项目的主分支,通常在Git等版本控制系统中,"master"分支代表了项目的主要开发线。这个目录可能包含了TCK的所有源代码、测试用例、文档和...
7. **部署与测试**: 将 WebSocket 服务器端点部署到支持 JSR356 的应用服务器,如 Tomcat、GlassFish 或 WildFly,然后使用 Tyrus 客户端或者浏览器中的 WebSocket 测试工具进行交互测试。 通过这个“websocket-...
在给定的标题和描述中,我们聚焦于“注入记录器”,这通常指的是通过依赖注入(Dependency Injection,DI)机制来管理日志组件,特别是针对Glassfish和JBoss这样的Java应用服务器。这两个服务器都支持Java EE规范,...
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 ...
它们分类在不同的目录中,每个目录用于每个Technology / JSR。 有些样品/测试有说明文件,否则请阅读代码。 怎么跑? 使用Arquillian在Payara,GlassFish和Tomcat上测试了样本。 Arquillian使用容器配置文件来...
Java EE 6 提供了一个简化的开发者体验,接纳了创新的开源框架,提供了一个全面的 Web Profile,适用于轻量级、基于标准的 Web 应用程序,并正式开始了从技术栈中修剪过时和未使用的旧技术的过程。 ##### ...