eclipse中p2的概念备忘

转自:http://blog.csdn.net/vwpolo/article/details/2590849

Eclipse3.4版本最值得注意的就是P2,一个新的 Eclipse供应平台(provisioning platform)。这是老的变更管理(Update Manager)的替代品,像老的更新管理器可以从一个或者多个远程站点更新安装的Eclipse,也是我们更新发布和安装新特性最常用的方式,但是也存在一些缺点,比如无法更新可执行的eclipse及处理镜像的时候会失败。为了解决这些问题,EclipseCon 2008的一个BoF会上,介绍了新一代的更新机制,随后Provisioning Platform(简称为P2)诞生了,在3.4M5首次登场,不像以前的Eclipse更新管理器,在P2bundle和非bundle组件(如配置文件、安装文件、绘图资源等等)都被允许安装或更新,P2还允许dropins目录,这使得安装bundle更加容易:只需把bundle复制到该目录,Eclipse将自动安装并激活它,Eclipse也可能被配置成共享bundle的模式,这将使得一个bundle库可被使用并且该bundle库将服务于不同的应用。对于那些按常规用法使用Eclipse的人来说,看不出这有什么好处,但是如果你正在进行RCP应用开发(或支持),有许多基于RCP的应用程序安装在同一个机器上(比如,RCP应用的一个内部套件[in-house suite]),那么你可以在多个应用之间共享这些bundle,这非常节约空间。

     下载由Eclipse通信框架(Eclipse Communication Framework)负责。制品还可以通过几种不同的算法(pack200tar.gz)进行压缩,同时对于多线程下载来说,还有多个镜像可用。在下载过程中,如果更新站点出现问题时,以前的更新管理器就会失败,P2会自动地重试不同的镜像以便找到数据。你甚至可以下载一个只有5Mb的安装器,它会安装Eclipse及其所有插件。

    而且以前使用更新管理器的时候发现无法使用连上代理服务器,导致在公司内部网络的时候没法使用更新管理器,现在在这个3.4版本中可以使用代理服务器了,非常的方便

----------------------------------------------------------------------------------------

下面

引用的他人的文章,其原址已经忘了,作者莫怪。 

* p2 / Agent
          o The provisioning infrastructure on client machines 
    * Installable Unit (IU)
          o Metadata that describes things that can be installed/configured
    * Artifact
          o The actual content being installed/configured(e.g., bundle JARs)
    * Repository
          o A store of metadata or artifacts
    * Profile
          o The target of install/management operations
    * Planner
          o The decision-making entity in the provisioning system
    * Engine
          o The mechanism for executing provisioning requests
    * Touchpoint
          o The part of the engine responsible for integrating the provisioning
            system to a particular runtime or management system

IU
比较好理解,就是对可安装或配置的部分一种描述,并不对应实际要安装的文件。
Arifact
就是来描述实际要安装的文件,bundle类型的jarfeaturebinary文件。
这时就有了Repository(仓库)这个概念,是用来保存artifacts信息,以及artifacts的元数据。元数据包括了对artifact的唯一标识符,版本,对外暴露的接口信息,以及它依赖的接口及其版本信息,各个安装阶段需要执行的配置。在p2默认的实现里面,这两个repository xml文件来描述,同时被压缩为artifacts.jar, content.jar来减小文件大小,缩短传输时间。
Eclipse 3.4起,当从远程site安装新的软件时,就会看到有个work thread在后台下载content.jar文件。p2在安装时候,首先会根据content.xmlmetadata repository)来解析正在安装软件的依赖。在当前runtime里面查找metadata中指定的依赖,如果满足才继续安装。据我个人经验,如果安装的软件比较复杂,那它产生的metadata文件就会比较大(很容易上兆),下载这个文件以及解析它的内容都会比较慢,从而影响用户体验。
比较灵活的是,用户可以实现自己的ArtifactRepositoryMetadataRepository,注册到它们各自的Manager里面就可以了。所有这些服务都被实现为OSGi Service.
下一个Profile,是用来管理安装目标里的软件信息。p2在被设计的时候,希望解决多个eclipse实例共享一份安装的某软件。比如为了某种目的我机器上有好几个Eclipse,同时它们都需要CDT,免去为重复安装的麻烦。profile就会记录每次安装的内容,让整个应用程序被管理起来。在 Galileo里安装的软件都可以软件管理里面查找到。
Planner
Engine完全就是p2内部的东西。任何p2的操作(安装,删除,配置)都需要Planner实例来描述。有了Planner以后,还需要创建一个Engine对象,通过engine来执行对应的plan。这就是目前调用p2 API来完成安装的一个过程。
最后一个Touchpoint。程序在安装的时候,可能会根据runtime(os, ws, arch等)或阶段(安装,卸载,配置等)执行某些配置,touchpoint就是帮助实现这些配置。具体操作是以IU为单位记录在metadata repository里的。p2默认实现了一些Eclipse touchpoint,比如拷贝,删除文件,执行外部程序等。如果用户有自己特殊的native操作需要执行,可以自己实现自定义的 touchpoint

 

有了这些概念以后,我们来看看如何使用p2 API。以安装为例,
首先需要得到当前安装的profile。如果是全新安装,通过IProfileRegistry.addProfile创建一个新profile。是更新安装的话,可以通过IProfileRegistry查询到期望更新的profile
然后需要获得将要安装的IMetadataRepository集合。比如:
    ArrayList<IMetadataRepository> metadataRepos = new ArrayList<IMetadataRepository>();
    IMetadataRepositoryManager repositoryManager = getService(IMetadataRepositoryManager.class); 
    if (repositoryManager == null) 
        return fConfiguredMetadataRepos;
    for (URI uri : uris){
        metadataRepos .add(repositoryManager.loadRepository(uri,null));
    

接下来就是通过IEngine来安装IMetaRepository中的内容。
    -
查找出IMetaRepository中没安装过的IUs。这就需要比较当前安装的profile已经安装过的内容了,
     IMetaRepository repo = ...;
     IProfile profile = getProfile(false);
     Collector result = repo.query(new IUManagerQuery(true,profile.getProfileId()), new LatestUninstalledIUCollector(profile), null);
     
这里需要指出的是,IMetadataRepository实现了IQueryable接口。IQueryablep2引入的查找接口,返回满足特殊查询条件的集合,同时传入了一个IProgressMonitor对象,可以反应查找进度。这里的IUManagerQueryLatestUninstalledIUCollector是自定义的QueryCollector对象。p2已经实现了许多有用的Query,经常用到的有InstallableUnitQueryIUPropertyQueryRangeQuery
    -
接下来生成IEngine所需的ProvisionPlan。首先创建ProfileChangeRequest对象,将先前查找出的要安装的IUs添加进去。
     request.addInstallableUnits(ius);
     
删除的话则与之相反。更新的话也需要通过ProfileChangeRequest.removeInstallableUnits()去掉旧版本的IUs。调用IPlanner servicegetProvisioningPlan(ProfileChangeRequest, ProvisioningContext, IProgressMonitor)得到对应于当前requestplan。最后就是调用IEngine.perform(IProfile, PhaseSet, Operand[], ProvisioningContext, IProgressMonitor)来执行provisioning操作。这里的PhaseSet是用来指定Engine将要执行的几个阶段,以及每个阶段的执行时间权重。这些阶段包括了Collect, Unconfigure, Uninstall, Property, CheckTrust, Install, Configure. 如果熟悉Eclipse之前的Installer Handler,对Unconfigure/Uninstall/Install/Configure应该都很熟悉。 p2里,更是将Collect, CheckTrust这些过程也暴露了出来。下面是p2里默认PhaseSet的实现,
        public DefaultPhaseSet() {
            this(new Phase[] {new Collect(100), new Unconfigure(10, forcedUninstall), new Uninstall(50, forcedUninstall), new Property(1), new CheckTrust(10), new Install(50), new Configure(10)});
        }
     Operand[]
通过ProvisionPlan.getOperands()获得。

猜你喜欢

转载自sdfx.iteye.com/blog/1941692
p2