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

使用JIOPi模块库实现类库自动升级

阅读更多

JIOPi规范定义了区分版本的标准JIOPi模块库,只需将本应部署在lib目录的Jar包放在JIOPi模块库中,并使用JIOPi风格访问,当在JIOPi模块库中添加一个新的版本时,所有使用JIOPi风格使用该模块库的程序都将自动使用新版本的程序,而无需进行Jar包替换。 

下面就以将apache httpclient 4.0.1发布到JIOPi模块库为例,展示如何以分离的模式部署Jar类库程序,并实现类库程序的自动升级。 

使用JIOPi模块库除了可以实现类库的自动升级,根据JIOPi对模块隔离运行的设计,在一个系统中可以同时运行一个类库程序的多个版本,这就如同一个Servlet容器运行多个webapp而互不影响是一样的实现原理。 

要使用 apache httpclient 4.0.1,你需要在lib下放3个jar:

httpclient-4.0.1.jar

httpcore-4.0.1.jar

commons-logging-1.1.1.jar

如果直接将这三个jar放在lib目录,你的使用代码如下: 

import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpHead;
import org.apache.http.impl.client.DefaultHttpClient;
public class HTTPClientTest {
	public static void main(String[] args) {
		HttpClient httpclient = new DefaultHttpClient();
		HttpHead httphead = new HttpHead("http://www.iteye.com/images/logo.gif");
		//HttpHead httphead = new HttpHead("http://groups.google.com/groups/img/gicons/discuss.jpg");
		try {
			HttpResponse response = httpclient.execute(httphead);
			StatusLine statusLine = response.getStatusLine();
			String status = statusLine.toString();
			System.out.println(status);
		} catch (IOException e) {
			e.printStackTrace();
		}
		httpclient.getConnectionManager().shutdown();
	}
}

 

 

这是标准Java代码风格,

不过当你需要对httpclient的版本进行升级时,你需要替换掉你所有项目的lib目录中对应的jar包 

 

使用JIOPi标准模块库,你则只需替换一个地方即可。

JIOPi标准模块库可以是任何一个可以被容器支持的URL,iBean目前支持http模块库和本地模块库。 

 

下面我们就来看看如何将这3个Jar放入JIOPi模块库并用JIOPi风格进行访问

 

 

添加模块库

要在JIOPi中添加一个新的模块库,只需要在jiopi.properties文件中添加两行

jiopi.resourcepool.org-jiopi.path=http://jiopi.vip7.es163.net/ibean/resourcepools/jiopi-ibean.xml

jiopi.resourcepool.org-jiopi.pri=1

其中org-jiopi是模块库的自定义名,只需保证同一配置文件不重名即可

path定义模块库的配置文件地址

pri定义模块库的优先级

运行时JIOPi容器会按优先级顺序从多个标准模块库中搜索符合条件的模块 

 

标准模块库配置文件

下面就要建立你的模块库配置,建议将模块库的配置文件放在模块库根目录

模块库配置文件如下,可以不用更改直接使用 

<?xml version="1.0" encoding="UTF-8"?>
<resourcepools xmlns="http://www.jiopi.org/2010/JIOPISchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jiopi.org/2010/JIOPISchema xsd/jiopi-config-resourcepools.xsd ">
  <modules url-format="${module}/${module}.xml"/>
</resourcepools> 

 

 

其中 url-format 指定了当访问一个模块时,模块的配置文件的位置,这里指定的是配置文件目录下的 module/module.xml

即当容器在该模块库搜索 模块 apache.httpclient 模块时,将会尝试获取 apache.httpclient/apache.httpclient.xml文件 

 

创建模块配置文件

1 在模块库根目录创建 文件夹 apache.httpclient

2 在新建的文件夹内创建 apache.httpclient.xml文件,内容如下: 

<?xml version="1.0" encoding="UTF-8"?>
<module name="modulename" xmlns="http://www.jiopi.org/2010/JIOPISchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jiopi.org/2010/JIOPISchema xsd/jiopi-config-module.xsd ">
      <release version="4.0.1.0" base-url="4.0.1.0" reference="apache.httpclient-4.0.1.0.xml"/>
</module> 

 

 

其中每个版本一个release元素,由于httpclient采取的是3位版本号,而JIOPi模块库的模块需要4位版本号,因此第4为补0

version 指定版本

base-url 指明当前版本所在的文件夹为 4.0.1.0 ,配置文件在该文件夹下,名为 apache.httpclient-4.0.1.0.xml 

 

创建版本配置文件

1 在模块目录创建 4.0.1.0 文件夹

2 将 该模块的3个Jar包放在该文件夹下

3 创建 apache.httpclient-4.0.1.0.xml 内容如下: 

 

<?xml version="1.0" encoding="UTF-8"?>
<release version="4.0.1.0" xmlns="http://www.jiopi.org/2010/JIOPISchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jiopi.org/2010/JIOPISchema xsd/jiopi-config-module-release.xsd ">
      <resource>httpcore-4.0.1.jar</resource>
      <resource>commons-logging-1.1.1.jar</resource>
       <resource>httpclient-4.0.1.jar</resource>
</release> 

 

 

这样便可以使用JIOPi风格访问 apache httpclient 4.0.1了

当有新版本时,如 4.0.2,则修改apache.httpclient.xml文件,增加一条新的 release 元素及配置该release

则所有使用该模块库的JIOPi风格的程序都将自动升级到 4.0.2(在程序重启后生效,不会立刻生效) 

 

此时资源库的目录结构如下:

+apache.httpclient

     +4.0.1.0

          apache.httpclient-4.0.1.0.xml

          commons-logging-1.1.1.jar

          httpclient-4.0.1.jar

          httpcore-4.0.1.jar

     apache.httpclient.xml

jiopi-ibean.xml

 

要使用该模块库

模块库

http://jiopi.vip7.es163.net/ibean/resourcepools/jiopi-ibean.xml

已经配置了 apache httpclient 4.0.1你只需在你的应用中部署iBean.jar和放置jiopi.propertiese文件即可书写JIOPi免部署风格的程序使用该类库

代码如下 

 

import org.jiopi.framework.CentralConsole;
import org.jiopi.framework.ModuleConsole;
import org.jiopi.framework.ControlPanel;
import org.jiopi.framework.FrameworkInitializer;
public class HTTPClientTest {
	public static void main(String[] args) {
		FrameworkInitializer.initialize();
		ModuleConsole apacheHttpclient = CentralConsole.accessModuleConsole("apache.httpclient");
		ControlPanel httpclient = apacheHttpclient.accessControlPanel("org.apache.http.impl.client.DefaultHttpClient", ControlPanel.class);
		ControlPanel httphead = apacheHttpclient.accessControlPanel("org.apache.http.client.methods.HttpHead",ControlPanel.class,"http://www.iteye.com/images/logo.gif");
		//ControlPanel httphead = apacheHttpclient.accessControlPanel("org.apache.http.client.methods.HttpHead",ControlPanel.class,"http://groups.google.com/groups/img/gicons/discuss.jpg");
		try {
			ControlPanel response = httpclient.operate("execute", ControlPanel.class, httphead);
			ControlPanel statusLine = response.operate("getStatusLine", ControlPanel.class);
			String status = statusLine.operate("toString", String.class);
			System.out.println(status);
		} catch (Exception e) {
			e.printStackTrace();
		}
		httpclient.operate("getConnectionManager", ControlPanel.class).operate("shutdown",void.class);
	}
}

 这是一段所见即所得的代码,只要项目内部放了iBean的jar包(默认配置的模块库包含了apache httpclient 4.0.1),则直接复制该段代码即可执行 

为了能够获得较好的Java代码风格,应当将使用API和实现分离,以便可以只部署API,并使用IoC框架(如Spring)进行实现对象的依赖注入,JIOPi的API则交由IoC框架来调用,避免程序中出现JIOPi的代码和反射方式调用,提高程序的执行效率和可读性 

但是apache httpclient 4.0.1并没有将 调用API和实现类有较为明确的划分(理想情况应当是 API一个jar,实现类一个或多个jar),所以这里无法给出使用API部署风格的调用代码。 

理解JIOPi标准模块库

JIOPi标准模块库提供了一种类库Jar分离式部署的方式,以避免项目lib目录的Jar包混乱,在API部署模式下,也可以将JIOPi的API看成一种从容器获取对象的方式,就如同Spring中调用 ApplicationContext的 getBean方法一样,只不过Spring将类名写在了配置文件中,使用id来获取对象,在JIOPi 0.1中,需要写全类名而已,当然,为了统一,你可以将Spring配置中应当配置类名的地方配置成JIOPi的API静态方法调用,从而可以从JIOPi标准模块库中获取对象,而不是从项目的ClassPath中获取对象,从而实现类库的分布式部署和自动升级。 

 

分享到:
评论

相关推荐

    易语言模块易语言OGRE类库1.1.rar

    易语言模块易语言OGRE类库1.1.rar 易语言模块易语言OGRE类库1.1.rar 易语言模块易语言OGRE类库1.1.rar 易语言模块易语言OGRE类库1.1.rar 易语言模块易语言OGRE类库1.1.rar 易语言模块易语言OGRE类库1.1.rar

    e4a源码 支持库 类库

    E4A的类库通常包括各种内置控件、网络通信、数据库操作、多媒体处理等模块。通过这些类库,开发者无需从零开始编写所有代码,极大地提高了开发效率。 "支持库"是指为了增强或扩展主程序功能而提供的额外代码集合。...

    c#自动升级类库xml解析

    "c#自动升级类库"是针对软件自动化更新的一种技术实现,它允许程序在后台下载并安装最新的版本,无需用户手动操作。这样的类库通常会包含一系列的函数和方法,用于检查新版本、下载更新、安装新文件以及处理可能出现...

    易语言模块ZCL_控件类库1.01.rar

    易语言模块ZCL_控件类库1.01.rar 易语言模块ZCL_控件类库1.01.rar 易语言模块ZCL_控件类库1.01.rar 易语言模块ZCL_控件类库1.01.rar 易语言模块ZCL_控件类库1.01.rar 易语言模块ZCL_控件类库1.01.rar

    C++库大全,教你怎样更好使用C++类库

    下面我们将深入探讨C++类库的一些核心概念和常用库,以及如何有效地使用它们。 C++类库是预先编写好的函数和对象集合,它们被封装在头文件中,供开发者在自己的项目中调用。使用类库可以极大地提高开发效率,因为...

    如何使用VS生成C#类库

    在.NET框架中,C#类库(Class Library)是一种用于创建可重用代码的项目类型,它可以被其他应用程序引用和使用。本篇文章将详细介绍如何使用Visual Studio(VS)来生成C#类库,并生成DLL文件。 一、创建C#类库项目 ...

    C++类库 类库 c++ C/C++ 类库

    在压缩包文件"Include"中,可能包含了这些类库的头文件,它们是实现具体功能的关键,通过#include指令将这些头文件包含到源代码中,就可以使用类库提供的接口和功能了。 总的来说,C++类库是C++编程的重要资源,...

    C#多年累积类库

    这些类库通常是为了提高开发效率、解决常见问题或者实现特定功能而创建的,可能包括各种实用工具类、数据处理模块、网络通信组件等。在.NET框架下,开发者可以通过封装常用功能,将它们整理成类库,以便在不同的项目...

    ModBus开源类库 (1)_MODBUS库_modbus_modbustcpip_modbustcp类库_modbusTCP_

    在提供的文件列表中,`HslCommunication.dll`是一个动态链接库文件,它是Windows操作系统中实现特定功能的模块,包含了实现ModBus TCP通信的函数和数据结构。而`HslCommunication.xml`可能是这个库的文档,其中包含...

    NModbus类库使用总结

    NModbus类库是实现Modbus协议的常用工具,本文将对NModbus类库的使用进行总结,涵盖从基本概念到实际应用的各个方面。 1. 导入NModbus类库 首先,需要将NModbus类库导入工程中,并添加引用、命名空间。工程属性...

    C# 实现 串口通用类库

    这是基于.Net Framework 4.0,封装了串口一些操作,如打开串口、关闭串口、串口发送、串口接收等,方便下次需要使用串口功能时,直接在解决方案中添加该类库。可以直接调取使用。 目前完成功能: 1、打开串口 2、...

    E4A 开发类库:DLNA投屏类库,复制到libs目录即可生效

    `libs`目录是E4A项目存放外部依赖库的地方,当E4A编译器检测到该目录下的类库后,会自动将其包含进编译的APK文件中,从而使应用具备类库提供的功能。 类库通常包含一系列的Java源代码文件(`.java`)或编译后的字节...

    PHP实现的验证码类库

    在这个“PHP实现的验证码类库”中,我们可以学习如何使用PHP创建一个自定义的、高效且安全的验证码生成和验证功能。 验证码类库的核心功能包括以下几个方面: 1. **随机字符生成**:验证码通常由字母、数字或者...

    C#版本精益模块类库源码

    3. **面向对象设计**:C#作为强类型、面向对象的语言,模块库可能采用了类、接口和继承等面向对象的机制,实现代码的复用和模块化。 4. **错误处理**:良好的异常处理机制是保证程序稳定运行的关键,源码中应包含对...

    c#动态加载 VC动态库 和C#类库样例

    在.NET框架中,C#语言提供了强大的功能来实现动态加载外部库,这包括VC++编译的动态链接库(.dll)以及C#自身编译的类库(.dll)。这个场景下的“动态加载”指的是在程序运行时,而不是在编译时决定要使用的库或者类...

    C#modbus 开源类库

    标题中的"C# Modbus 开源类库"是指一个基于C#编程语言的开源库,用于实现Modbus通信协议。Modbus是一种广泛应用于工业自动化领域的通信协议,它允许设备之间进行简单、有效的数据交换。C# Modbus开源类库提供了一个...

    E4A界面非常漂亮好看的自动更新类库+教程

    本教程聚焦于E4A中的一个关键组件——“自动更新类库”,这是一个能够帮助开发者轻松实现应用内自动更新功能的库。这个类库不仅提升了应用的用户体验,还能确保用户始终使用的是最新、最安全的软件版本。 自动更新...

    C#基于海康类库播放器 类库 源码

    这些类库可能包括解码、网络传输、设备控制等模块,使得开发者可以方便地调用API来实现视频播放、录像回放、云台控制等功能。 在这个项目中,源码部分非常重要。源码是程序的原始形式,包含了一系列的C#文件,它们...

    E4A悬浮窗类库,面板悬浮窗类库.zip

    5. **.elb文件**:这是E4A特有的扩展库文件格式,包含了预编译的代码和资源,可以方便地导入到E4A项目中,让开发者能够快速利用已有的功能模块。 6. **集成与跨平台**:尽管E4A主要使用Java语法,但其可以与.NET...

Global site tag (gtag.js) - Google Analytics