﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Thinking in XiaoQiang-文章分类-eclipse plugin</title><link>http://www.blogjava.net/uiiang/category/3638.html</link><description>世人皆有悲哀，只有你不明白</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:25:38 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:25:38 GMT</pubDate><ttl>60</ttl><item><title>浅析Eclipse建模框架(EMF)及其动态能力</title><link>http://www.blogjava.net/uiiang/articles/15864.html</link><dc:creator>小强</dc:creator><author>小强</author><pubDate>Tue, 18 Oct 2005 16:10:00 GMT</pubDate><guid>http://www.blogjava.net/uiiang/articles/15864.html</guid><wfw:comment>http://www.blogjava.net/uiiang/comments/15864.html</wfw:comment><comments>http://www.blogjava.net/uiiang/articles/15864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/uiiang/comments/commentRss/15864.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/uiiang/services/trackbacks/15864.html</trackback:ping><description><![CDATA[如果给定一个模型,那么EMF能够自动生成Java源代码-该源码允许你创建、查询、更新、串行化、反串行化、检验和追踪你的模型实例的变化。EMF提供了一组有效的反射API并且允许你用动态的（非生成的）模型进行工作。<BR><BR>　　<B>一、 引言</B><BR><BR>　　<A class=bluekey href="http://www.yesky.com/key/740/165740.html" target=_blank>Eclipse</A>建模框架(EMF)是一个Java开源框架与代码生成工具-用于基于结构化的模型来构建工具和其它应用程序。在Eclipse平台在用户界面和文件级上提供一个强有力的集成框架的同时,EMF加强了这种能力来实现工具和应用程序之间良好粒度的数据分享。<BR><BR>　　类似于其它的Java绑定框架，例如JAXB或XMLBeans,给定一个模型后,EMF就能够生成Java源代码-它允许你创建、查询、更新、反串行化以及串行化你的模型的实例。尽管多数Java绑定框架仅支持一个模型类,例如XML模式，而EMF支持从XML模式,UML类图(Rational <A class=bluekey href="http://www.yesky.com/key/4977/169977.html" target=_blank>Rose</A>或UML2)以及被注解的Java接口中生成代码。除了模型代码，EMF还能生成一个完整的应用程序-它包括一个可定制的编辑器。<BR><BR>　　EMF生成的代码有一个内建的改变通知机制并且支持跨文档参考。EMF提供一个反射API以存取你的模型实例并且允许你动态地创建模型。EMF支持模型约束校验。EMF提供强有力的代码生成工具来支持模型的重新生成和使用用户书写的代码进行合并。<BR><BR>　　在本文中,我们将解释什么是EMF,并分析其基本框架。<BR><BR>　　EMF最开始是一个对象管理组的(OMG)元对象设备(MOF)说明书的实现-它为面向对象的分析和设计提供一个标准化的元模型。在很长一段时间以来，EMF被用于实现大量的工具并且因此演变为一个有效的MOF API的一个核心子集的Java实现。<BR><BR>　　在EMF中的类MOF核心元模型(一个模型的模型)被称作Ecore。在对当前的MOF 2.0的实现中,有一个类似的MOF模型的子集,称作Essential MOF(EMOF)，它现在已经被独立出来。在Ecore和EMOF之间主要存在上些小的特别是命名上的区别，因此EMF能透明地读和写串行化的EMOF，从而允许工具间数据的标准交换。<BR><BR>　　今天EMF已被广泛应用。例如,EMF被用于实现开源XML模式Infoset模型(XSD),服务数据对象(SDO),UML2以及Eclipse上的Web工具平台(WTP)工程。另外，EMF也被使用在商业化的产品中,例如Omondo EclipseUML以<A class=bluekey href="http://www.yesky.com/key/447/160447.html" target=_blank>及IBM</A> Rational和<A class=bluekey href="http://www.yesky.com/key/1627/161627.html" target=_blank>WebSphere</A>产品等。<BR><BR>　　<B>二、 Ecore和反射API</B><BR><BR>　　EMF中的一个关键接口是Eobject，它在概念上等价于java.lang.Object。所有的建模对象，无论是生成的与否，为了提供以下几个重要特征，都要实现这个接口：<BR><BR>　　·类似Java的Object.getClass(),通过使用eClass()方法,你能检索实例的元数据，也就是它的Eclass。<BR><BR>　　·在任何EMF建模的对象上，你都能使用反射API(eGet(),eSet())来存取它的数据。这在概念上等同于Java的java.lang.reflect.Method.invoke()方法,尽管效率更高些。<BR><BR>　　·从任何实例对象，你都可以通过使用eContainer()方法得到它的容器(parent)。<BR><BR>　　·EObject也扩展了Notifier,这允许你监视对象的数据的所有变化。<BR><BR>　　如前面所提及，EMF有它自己的简单的元数据-称作Ecore。图1显示出Ecore元数据的完整的类层次结构图。在图1中，你可以看到EPackage包含关于模型类(EClass)和数据类型(EDataType)的信息。EClass描述一个建模的类,并且指定属性和参考以描述实例的数据。EAttribute描述简单数据,它由一个EDataType来指定。EReference描述一个类之间的关联；它的类型是一个Eclass。EFactory包含创建模型元素的方法。<BR><BR>
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><IMG style="WIDTH: 736px; HEIGHT: 440px" height=320 src="http://dev.yesky.com/imagelist/05/10/f90iwy22qq68.png" width=400 border=0><BR>图1.Ecore类层次结构：这个图像显示出Ecore元数据完整的类层次。</DIV></TD></TR></TBODY></TABLE><BR>　　为找到更多关于EMF和Ecore，请读在线概述或购买Eclipse建模框架(EMF)。EMF网站提供了若干文件来描述怎么使用EMF来从一个XML模式或UML图表生成Java代码。<BR><BR>　　下面我将描述一个示例，它使用Ecore来创建一个简单公司模型，然后使用动态的EMF来创建,串行化和反串行化这个模型的实例。如果你想继续读下去并且你已经是一个Eclipse用户,请下载和安装EMF 2.1 <A class=bluekey href="http://www.yesky.com/key/0/170000.html" target=_blank>SDK</A>或任何可用的更新的版本，在EMF下载站点。如果不那样,你还可以下载独立包,它包括EMF jar文件，它没有任何对Eclipse的依赖性并且能被使用于一个独立的应用程序。<BR><BR><STRONG>三、 使用动态EMF能力<BR><BR></STRONG>　　一般地，如果你在开发期间创建了模型，那么典型情况下，你最好生成Java代码，因为在这种情况中你的应用程序会使用较少的内存并且提供更快的数据存取(或是使用生成的API或是使用反射API)。尽管生成Java代码满足了大多数应用程序的需要，但是情况并不总是如此。你可能需要处理数据，而不需要使用生成的实现类。例如,你可能不知道在开发时间你将要处理的数据的模型,这就使得生成的Java代码成为一个可怜的选项。<BR><BR>　　动态的（也就是非生成的）类可以在运行时刻用几种方法来创建。让我们先开始使用Ecore API以编程地方式来创建一个公司模型。公司模型用于描述一个公司，它有一个名称和部门。每个部门由一个数字来唯一标志出并且它还有雇员，每个雇员有一个名称。在下面的代码显示出一个相应于该模型的Ecore元模型。<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>EcoreFactory ecoreFactory = EcoreFactory.eINSTANCE;<BR>EcorePackage ecorePackage = EcorePackage.eINSTANCE;<BR>//创建一Company类<BR>EClass companyClass = ecoreFactory.createEClass();<BR>companyClass.setName("Company");<BR>//创建公司名 <BR>EAttribute companyName = ecoreFactory.createEAttribute();<BR>companyName.setName("name");<BR>companyName.setEType(ecorePackage.getEString());<BR>companyClass.getEStructuralFeatures().add(companyName);<BR>//创建一Employee类<BR>EClass employeeClass = ecoreFactory.createEClass();<BR>employeeClass.setName("Employee");<BR>//在Employee类上添加一个名字属性<BR>EAttribute employeeName = ecoreFactory.createEAttribute();<BR>employeeName.setName("name");<BR>employeeName.setEType(ecorePackage.getEString());<BR>employeeClass.getEStructuralFeatures().add(employeeName);<BR>//创建一Department类<BR>EClass departmentClass = ecoreFactory.createEClass();<BR>departmentClass.setName("Department");<BR>//添加department标志数字<BR>EAttribute departmentNumber = ecoreFactory.createEAttribute();<BR>departmentNumber.setName("number");<BR>departmentNumber.setEType(ecorePackage.getEInt());<BR>departmentClass.getEStructuralFeatures().add(departmentNumber);<BR>//department类能够包含到一个或多个employee的参考<BR>EReference departmentEmployees = ecoreFactory.createEReference();<BR>departmentEmployees.setName("employees");<BR>departmentEmployees.setEType(employeeClass);<BR>//指定它可能是一个或多个employee<BR>departmentEmployees.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);<BR>departmentEmployees.setContainment(true);<BR>departmentClass.getEStructuralFeatures().add(departmentEmployees);<BR>//company能够包含到一个或多个departments的参考<BR>EReference companyDepartments = ecoreFactory.createEReference();<BR>companyDepartments.setName("department");<BR>companyDepartments.setEType(departmentClass);<BR>companyDepartments.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);<BR>companyDepartments.setContainment(true);<BR>companyClass.getEStructuralFeatures().add(companyDepartments);<BR>//创建一个包-描述company<BR>EPackage companyPackage = ecoreFactory.createEPackage();<BR>companyPackage.setName("company");<BR>companyPackage.setNsPrefix("company");<BR>companyPackage.setNsURI("http:///com.example.company.ecore");<BR>companyPackage.getEClassifiers().add(employeeClass);<BR>companyPackage.getEClassifiers().add(departmentClass);<BR>companyPackage.getEClassifiers().add(companyClass);<BR>通过使用反射API，你能创建并且初始化一个你的模型的实例：<BR>//得到company工厂<BR>EFactory companyFactory = companyPackage.getEFactoryInstance();<BR>//使用工厂来创建company类的实例并且<BR>//设置company名字<BR>EObject company = companyFactory.create(companyClass);<BR>company.eSet(companyName, "MyCompany");<BR>//创建一个employee类的实例 <BR>EObject employee = companyFactory.create(employeeClass);<BR>//使用反射API初始化employee的名字<BR>employee.eSet(employeeName, "John");<BR>//创建一个department类的实例<BR>EObject department = companyFactory.create(departmentClass);<BR>department.eSet(departmentNumber, new Integer(123));<BR>//添加"John"到department<BR>((List)department.eGet(departmentEmployees)).add(employee);<BR>//添加department到company<BR>((List)company.eGet(companyDepartments)).add(department);</TD></TR></TBODY></TABLE><BR><STRONG>四、 数据的串行化和反串行化<BR><BR></STRONG>　　为了串行化你的模型实例,你需要把一个你的实例模型的根对象放置到一个资源中。EMForg.eclipse.emf.ecore.resource.Resource接口描述了一个物理的存储位置(例如文件或URL)并且提供方法以串行化和装载数据。每一种资源都被存储在一个ResourceSet中-它代表了一个资源集合-这些资源被一起创建和加载并允许在它们当中进行参考引用。特别地,一个ResourceSet负责跟踪哪些资源已被装载并且保证这个ResourceSet中的资源不会被重复装载。<BR><BR>　　因为EMF能够处理多重模型源,例如XML模式,所以指定使用哪些资源来实现(反)串行化你的数据也是很重要的。通常,当你调用ResourceSet.createResource(URI)方法时,它查询Resource.Factory.Registry来查找一个工厂-该工厂是为该URI而注册的并且使用它来创建一个适当的资源实现。因此,在你(反)串行化你的数据以前，请确保你已注册了适当的资源工厂实现。EMF提供若干Resource.Factory实现:<BR><BR>　　·对于XML数据，使用org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl。<BR><BR>　　·对于XMI数据，使用org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl。<BR><BR>　　·对于Ecore模型，使用org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl。<BR><BR>　　你的工具箱中有了这些EMF资源后，你就能使用下面的代码来串行化你的数据:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>//创建资源集和资源<BR>ResourceSet resourceSet = new ResourceSetImpl();<BR>//注册XML资源工厂<BR>resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", <BR>new XMIResourceFactoryImpl());<BR>Resource resource = resourceSet.createResource(URI.createFileURI("c:/temp/company.xmi"));<BR>//添加根对象到资源<BR>resource.getContents().add(company);<BR>//串行化资源-你还能指定串行化<BR>//选项，它定义在org.eclipse.emf.ecore.xmi.XMIResource中<BR>resource.save(null);<BR>company.xmi被串行化后的形式如下：<BR>＜?xml version="1.0" encoding="ASCII"?＞<BR>＜company:Company xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"<BR>xmlns:company="http:///com.example.company.ecore" name="MyCompany"＞<BR>＜department number="123"＞<BR>＜employees name="John"/＞<BR>＜/department＞<BR>＜/company:Company＞</TD></TR></TBODY></TABLE><BR>　　在反串行化过程中，XML数据的命名空间URI被用于定位所需要的Ecore包(它用于描述你的实例文档的模型)。因此,在你尝试装载任何模型以前，请确保你已经为你的文档将要使用的每个Ecore包注册了命名空间URI：<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>//在本地资源注册表中注册包<BR>resourceSet.getPackageRegistry().put(companyPackage.getNsURI(), companyPackage);<BR>//加载资源<BR>resource.load(null);</TD></TR></TBODY></TABLE><BR>　　注意到局部的和全局的包(EPackage.Registry.INSTANCE)以及资源工厂(Resource.Factory.Registry.INSTANCE)的注册差别也是很重要的。全局注册是静态的，因此任何应用程序在JVM生存期都能存取全局注册并且可能覆盖它。为确保你的注册不会覆盖全局注册并且反过来也如此,典型地，你最好使用局部资源集合注册。<BR><BR>　　<B>五、 由XML模式生成动态的Ecore</B><BR><BR>　　如前所提及,如果你的模型是一个XML模式但是你没有选择生成Java类，那么，你可以通过使用XSDEcoreBuilder来动态地创建一个Ecore模型。这个示例使用了ipo.xsd：<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>XSDEcoreBuilder xsdEcoreBuilder = new XSDEcoreBuilder();<BR>ResourceSet resourceSet = new ResourceSetImpl();<BR>Collection eCorePackages =xsdEcoreBuilder.generate(URI.createFileURI("c:/temp/ipo.xsd"));</TD></TR></TBODY></TABLE><BR>　　这个generate方法返回为这个模式中的每个URI生成的Ecore包。如果该模式导入了其它命名空间,那么将有多个Ecore包被返回。每个包是被注册到本地的资源集中-用于实现模式转换。因此，如果你使用同样的资源集来装载你的实例XML文档的话,你就不需要自己注册包。<BR><BR>　　因为XML模式包括更多概念而不仅仅是Ecore，例如通配符等,所以EMF使用Ecore EAnnotations来记录到XML模式的映射。在数据(反)串行化期间，EMF需要处理这些注解。为了确保这些注解在(反)串行化期间被加以考虑，你必须使用XMLResource.ExtendedMetaData选项:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>HashMap options = new HashMap();<BR>options.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);<BR>//请参考http://www.w3.org/TR/2004/PER-xmlschema-0-20040318/#ipo.xml<BR>Resource resource = resourceSet.createResource(URI.createFileURI("c:/temp/ipo.xml"));<BR>resource.load(options);</TD></TR></TBODY></TABLE><BR>　　EMF 2.1还增加了一项新功能-它允许你在加载一个包含一个xsi:schemaLocation或xsi:noNamespaceSchemaLocation属性的XML文档时，不断地把模式转换成Ecore。同时，它也允许你加载一个没有与之相关联的模式的XML文档。为了使用这一功能，你需要注册 org.eclipse.emf.ecore.xmi.impl.GenericXMLResourceFactoryImpl：<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xml",new GenericXMLResourceFactoryImpl());</TD></TR></TBODY></TABLE><BR>　　<B>六、 小结</B><BR><BR>　　本文向你简短介绍了EMF,并解释了几个核心的EMF概念。同时，对于如何利用模式EMF的动态能力提供了相关示例。<img src ="http://www.blogjava.net/uiiang/aggbug/15864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/uiiang/" target="_blank">小强</a> 2005-10-19 00:10 <a href="http://www.blogjava.net/uiiang/articles/15864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 如何使用版本控制</title><link>http://www.blogjava.net/uiiang/articles/15391.html</link><dc:creator>小强</dc:creator><author>小强</author><pubDate>Thu, 13 Oct 2005 01:26:00 GMT</pubDate><guid>http://www.blogjava.net/uiiang/articles/15391.html</guid><wfw:comment>http://www.blogjava.net/uiiang/comments/15391.html</wfw:comment><comments>http://www.blogjava.net/uiiang/articles/15391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/uiiang/comments/commentRss/15391.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/uiiang/services/trackbacks/15391.html</trackback:ping><description><![CDATA[<BLOCKQUOTE>转载:<SPAN id=ArticleTitle1_ArticleTitle1_lblSource>http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml</SPAN><BR><BR>本文概述了 Eclipse 平台如何支持软件项目中的源代码版本控制。首先，我们将简要讨论一下团队代码开发的思想，然后研究 Eclipse 如何使用 CVS 代码资源库。我们还将研究一些源代码管理软件工具，可以通过 Eclipse 插件扩展来支持这些工具。</BLOCKQUOTE><DOCBODY>
<P><A name=N40004A><SPAN class=atitle2>在团队项目中共享源代码</SPAN></A><BR>现今的大多数应用程序是由多人组成的团队开发的。即使只涉及几个开发人员的小项目，也需要对源代码的更改进行严格控制。这就是源代码管理软件的任务。源代码版本控制软件必须支持两个核心功能：</P>
<UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<LI>提供一种方法，能够协调对源代码的更改，并能集成这些更改 
<LI>团队所提交工作的历史记录 </LI></UL>
<P>当团队成员完成新的工作时，通过将这些更改提交到资源库来共享他们的工作。类似地，当他们希望获得最新可用的工作成果时，就可以根据资源库中的更改，更新自己的本地工作空间。这意味着项目资源库会因团队成员提交新工作成果而经常发生更改。换句话说，资源库应该表示项目的当前状态。任何时候，团队成员都要能够根据资源库更新自己的工作空间，并确信它们是最新的。</P>
<P>维护历史记录也很重要，那样就可以将当前工作与先前版本进行比较，如有必要，还可以回复到先前版本。协调团队的工作，以便只存在唯一的当前项目状态定义，以及包含团队已集成的工作，这些对于管理版本控制也是十分必要的。这种协调有可能是最难实现的目标。</P>
<P>最理想的模型是：团队的任何成员都可以对自己有权访问的任何资源进行更改。因为两个团队成员可以提交对同一资源的更改，所以有可能发生冲突，必须解决这种冲突。这种模型假定冲突具有唯一性。但遗憾的是，没有任何源代码是孤立地存在的；通常它包含与其它资源隐式或显式的相关性。源代码引用了在其它源代码资源中描述的构件。但源代码管理软件的工作就到此为止了，因为它并不能取代项目管理。项目管理者必须履行其职责：协调其它成员的工作以及负责进度、项目阶段和发布日期。此外，源代码管理也不能替代开发人员之间的交流。</P>
<P><A name=N400065><SPAN class=atitle2>Eclipse 平台如何支持代码管理</SPAN></A><BR>Eclipse 平台提供了作为团队在软件项目中共享代码和工作的能力。Eclipse 广泛地支持各种代码管理解决方案，这要归功于它的插件体系结构（不过，现已推出了对 CVS 的支持）。Eclipse 平台体系结构的重点在于<I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">工作空间</I>。工作空间维护构建和测试软件项目所需的一切。它包含对象（源代码和资源）。它还保存了用于项目、IDE 和插件的配置设置。工作空间是在开发人员的机器上本地进行维护的，而团队通过外部资源库进行协作，不同开发人员的代码在资源库进行汇集。可以经由因特网通过“客户机-服务器”体系结构访问资源库。</P>
<P>Eclipse 平台提供了对于直接从工作空间进行团队开发操作的支持。这种支持允许开发人员并发地与几个独立的资源库以及不同版本的代码或项目进行交互。工作空间中的资源允许团队支持组件处理版本和配置管理问题。当然，单个工作空间可以同时访问不同类型的资源库。Eclipse 平台并没有提供它自己的代码管理解决方案；它总是依靠外部系统。Eclipse 平台只对一个（但也是最流行的一个）源代码管理系统提供内置支持：并发版本控制系统（Concurrent Versions System，CVS）。<A href="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml#thirdparty" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">对第三方代码管理应用程序的支持</A>一节中描述了使用第三方插件支持其它资源库。</P>
<P><A name=N400078><SPAN class=atitle2>CVS 是什么？</SPAN></A><BR>CVS 诞生于 1986 年，当时作为一组 shell 脚本而出现，但它现在已经发展成了最流行的针对软件开发人员的源代码版本管理解决方案。CVS 是用于代码版本管理的开放源码的客户机／服务器解决方案，它可用于各种平台，包括 Linux 和 Windows NT/2000/XP。请参阅本文末尾的<A href="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml#Resources" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资料</A>，其中有 CVS 客户机、服务器和源代码的下载链接。</P>
<P>通常，CVS 的主要功能是记录源文件的历史。当一组开发人员从事同一个项目时，CVS 将他们彼此隔离开来。每个开发人员都在他／她自己的目录中独立工作，然后使用 CVS 资源库（不时地）合并工作结果。</P>
<P>Eclipse 拥有与 Eclipse 平台 IDE 紧密集成的内置 CVS 客户机，它是作为一个单独透视图（CVS Repository Exploring 透视图）而实现的，用于与 CVS 的交互。用于 CVS 的通用 Eclipse 设置（General Eclipse settings for CVS）位于 <B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Window -&gt; Preferences window -&gt; Team</B> 下。在切换到 CVS Repository Exploring 透视图之后，就可以使用所有 CVS 操作了（转至 <B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Window -&gt; Open Perspective -&gt; Other -&gt; CVS Repository Exploring</B> 菜单 — 请参阅<A href="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml#figure1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 1</A> 和<A href="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml#figure2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 2</A>）。</P>
<P><A name=figure1><B>图 1. 切换到 CVS Repository Exploring 透视图</B></A><BR><IMG height=309 alt="CVS 资源库" src="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/eclipse2.gif" width=242 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P>
<P>首先设置资源库的位置，它将定义用于选定 CVS 服务器／资源库的连接参数。请确保使用 SSH 隧道（<CODE><FONT face=NSimSun>extssh</FONT></CODE>）。 </P>
<P><A name=figure2><B>图 2. 浏览 CVS Repository Exploring 透视图中的 CVS 资源库</B></A><BR><IMG height=434 alt="浏览 CVS 资源库" src="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/eclipse10.gif" width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P>
<P><A name=N4000B8><SPAN class=atitle2>Eclipse/CVS 的源代码工作流</SPAN></A><BR>在 CVS 团队协作模型中，团队成员彼此独立地在他们各自的工作台上完成自己的所有工作。最后，他们希望共享其工作。他们通过 CVS 资源库实现这一点。CVS 使用分支（branch）模型来支持彼此独立而又高度相互依赖的多个工作流程（course of work）。这些分支是开发团队用来共享和集成正在进行中的工作的地方。可以认为<I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">分支</I>是一个共享的工作台，当团队成员对源代码进行更改时就更新这个工作台。这个模型允许从事 CVS 团队项目的每个开发人员在进行更改时与其他成员共享其工作，以及在项目进展期间访问其他成员的工作。</P>
<P>一个称为 <I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">HEAD</I> 的特殊分支用来表示资源库中的主要工作流程（HEAD 通常被称为<I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">主干</I>）。当团队成员将资源提交给该分支时，会影响这些相关性。确保相关性的完整性是很重要的，因为该分支表示了当前项目的状态。当然，任何时候，团队成员都可以使用该分支的内容作为新工作的基础。</P>
<P>那些规则不仅适用于 CVS：无论使用哪种版本控制软件，团队项目中都有一些用于源代码管理的常见步骤。下面是一个使用 Eclipse 内置的 CVS 支持的示例工作流：</P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">1. 启动新的团队项目</B> <BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">每个新的空 Eclipse 项目都可以通过 CVS（或受支持的任何其它源代码管理系统）进行共享。开发人员也可以通过将其现有的代码迁移到资源库来共享它。要进行共享，单击项目主文件夹，在显示的上下文菜单中使用 <B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Team -&gt; Share Project</B> 选项，如<A href="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml#figure3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 3</A> 所示。</P>
<P><A name=figure3><B>图 3. 使用 CVS 资源库共享本地项目</B></A><BR><IMG height=433 alt=共享项目 src="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/eclipse3.gif" width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P>
<P>另一个选项是通过从选定的 CVS 资源库分支导入代码来创建新的工作台项目。只要选择适当分支（或 HEAD），然后选择从 CVS Repository Exploring 透视图中的上下文菜单中选择“Checkout As Project”选项，如<A href="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml#figure4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 4</A> 所示。</P>
<P><A name=figure4><B>图 4. 从现有的 CVS 资源库创建新项目</B></A><BR><IMG height=433 alt=新建项目 src="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/eclipse1.gif" width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2. 使用代码并进行更改</B> <BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">开发人员通过 Eclipse 工作台在本地使用代码，包括的工作有创建新资源、修改现有资源、编写注释，并在他们使用后在本地保存这些内容。</P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">3. 使本地更改与 CVS 资源库同步</B> <BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">如果一个项目开发人员准备提交他／她的工作，那么首先要执行更新操作。这会针对引入的更改核对资源库，并将这些更改添加到该开发人员的本地工作台。这样确保了开发人员知道这些更改可能会影响他／她将要提交的工作的完整性。使用项目上下文菜单中的 <B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Compare With...</B> 选项将本地版本与资源库中存储的代码进行比较（请参阅<A href="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml#figure5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 5</A>）。<BR><BR><SPAN id=ArticleContent1_ArticleContent1_lblContent>&nbsp;</P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">3. 使本地更改与 CVS 资源库同步</B> <BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">如果一个项目开发人员准备提交他／她的工作，那么首先要执行更新操作。这会针对引入的更改核对资源库，并将这些更改添加到该开发人员的本地工作台。这样确保了开发人员知道这些更改可能会影响他／她将要提交的工作的完整性。使用项目上下文菜单中的 <B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Compare With...</B> 选项将本地版本与资源库中存储的代码进行比较（请参阅<A href="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml#figure5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 5</A>）。</P>
<P><A name=figure5><B>图 5. 比较本地版本与资源库中的版本</B></A><BR><IMG height=434 alt=本地版本 src="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/eclipse7.gif" width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P>
<P>下一步是解决最后出现的任何冲突，并设法再次编译代码。如果一切正常，那么从项目上下文菜单使用 <B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Team -&gt; Commit...</B> 选项执行提交操作，如<A href="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml#figure6" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 6</A> 所示。这会使所有更改都集成到资源库中。</P>
<P><A name=figure6><B>图 6. 将更改提交到远程资源库</B></A><BR><IMG height=435 alt=提交更改 src="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/eclipse6.gif" width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">4. 管理资源库</B> <BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">CVS 允许开发人员将更改隔离在开发的某些独立路径之内，这些路径称为分支。当一个开发人员更改某个分支上的文件时，这种更改不会出现在主干或其它分支上。那些分支被命名为<I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">子版本（subversion）</I>或<I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">代码分叉（code fork）</I>。稍后，由合并操作将更改从一个分支迁移到另一个分支（或主干）。然后提交这些修订。这样就有效地将更改复制到了另一个分支上。使用项目上下文菜单的 <B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Team -&gt; Branch...</B> 选项，Eclipse 使开发分支之间的迁移变得容易。</P>
<P>当然，当开发团队维护大型资源库时，有必要控制项目内的提交和合并操作。Eclipse/CVS 集成提供了一种特殊的视图：CVS Repository History（请参阅<A href="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml#figure7" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 7</A>）。它给出了关于团队成员在资源库中所执行更改的快速预览。</P>
<P><A name=figure7><B>图 7. 在 CVS Resource History 窗口中查看带注释的修订历史记录</B></A><BR><IMG height=177 alt=修订历史记录 src="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/eclipse9.gif" width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P>
<P>Eclipse 平台提供了几个支持代码管理的实用程序。最有用的是补丁功能。它将出自两个来源（譬如本地工作台和资源库）的代码进行比较，然后创建一个包含代码差异的类似 UNIX 的补丁文件（请参阅<A href="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml#figure8" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 8</A>）。可以将该文件发送给开发人员以将源代码升级到最新版本。</P>
<P><A name=figure8><B>图 8. 创建用于源代码分发的补丁</B></A><BR><IMG height=492 alt=源代码分发 src="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/eclipse8.gif" width=559 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P>
<P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">5. 断开项目与 CVS 的连接</B> <BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">当项目开发已经结束，并且团队希望<I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">冻结</I>源代码时，可以从 HEAD 资源库删除该项目的最终版本。断开项目与 CVS 的连接将在该项目及其资源上禁用资源库操作，并删除与该项目相关联的 CVS 信息（这一操作是可选的）。</P>
<P>可以通过项目上下文菜单中的 <B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Team -&gt; Disconnect</B> 选项执行断开连接操作。通过选择这个选项，会打开 Confirm Disconnect from CVS 对话框。在将该项目与资源库的连接断开之后，该团队必须确定如何处理 CVS 信息。第一个选项是“Delete the CVS meta information”；它将禁用 CVS 团队菜单操作并从文件系统中删除 CVS 文件夹及其内容。第二个选项是“Do not delete the CVS meta information”；它将禁用 CVS 团队菜单操作，但保留 CVS 元信息。</P>
<P><A name=thirdparty><SPAN class=atitle2>对第三方代码管理应用程序的支持</SPAN></A><BR>CVS 有几个重要的限制：它不能确定单个文件或整个文件集范围内同时进行的更改，它也不能检测文件之间的逻辑冲突。其冲突概念纯粹是文本意义上的，当对于同一基本文件的两个更改时间上非常非常接近，从而使合并命令受到干扰时，就会发生冲突。CVS 也不能提供任何类似于消息传递这样的交互式协作工具。幸运的是，CVS 并不是 Eclipse 平台所支持的唯一的源代码管理软件。开发人员可以通过插件扩展 Eclipse 平台的功能，而且目前（到 2003 年 3 月 4 日为止）已有 16 个可用于团队开发软件的插件。所有插件都是由 Eclipse 社区或商业软件供应商创建的。这些插件中的大多数添加了对第三方、商业源代码管理系统的支持。最有价值的插件是那些支持流行的企业代码管理系统（如 Merant PVCS 和 Rational ClearCase）的插件。例如，CVS-SSH2 插件允许通过 SSH2 会话访问 CVS，而 Microsoft Visual SourceSafe（VSS）团队提供程序插件添加了对 MS VSS 产品的支持（也可以在诸如 Linux 这样的非 Windows 平台上使用）。</P>
<P>但是，我本人所偏爱的插件是 Koi（请参阅<A href="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml#Resources" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资料</A>以获取链接）。尽管它并非严格用于源代码控制，但这个创新的工具给协作开发注入了许多新的活力。其当前版本支持工作台到工作台的消息传递、共享标记、冲突更改通知、共享日历和事件通知。Koi 将 XML-RPC 用作其客户机-服务器体系结构中的通信模型。客户机是与“协作服务器”通信的单个 Eclipse 平台实例，而协作服务器也是一个 Eclipse 插件。Koi 使用以 JDBC 访问的关系数据库作为数据存储。可在<A href="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml#Resources" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资料</A>中找到指向完整的、经过分类的 Eclipse 插件注册表的链接。</P></DOCBODY>
<P><A name=resources><SPAN class=atitle2>参考资料</SPAN></A> 
<UL>
<LI>请参加 <A href="http://www.eclipse.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">eclipse.org</A> 上的 Eclipse 平台社区。Eclipse 平台源代码遵循 Common Public License。Eclipse.org 还有一个 Eclipse 项目的术语和描述词汇表，以及技术文章和新闻组。Eclipse 平台白皮书（可在 Eclipse.org 主页获取）详细描述了 Eclipse 的主要组件和功能。<BR><BR>
<LI>从 eclipse.org 下载 <A href="http://www.eclipse.org/koi/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">KOI 插件</A>。<BR><BR>
<LI>查看 <A href="http://eclipse-plugins.2y.net/eclipse/index.jsp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Eclipse 插件的完整的、经过分类的注册表</A>。<BR><BR>
<LI>从 <A href="http://www.cvshome.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">CVS 主页</A>或 <A href="http://www.loria.fr/~molli/cvs-index.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">LORIA 站点</A>下载 CVS 客户机、服务器和源代码。<BR><BR>
<LI>请参阅 <I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</I> 文章“<A href="http://www-106.ibm.com/developerworks/library/os-plat/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Working the Eclipse Platform</A>”，以了解关于 Eclipse 平台的背景知识。<BR><BR>
<LI>请参阅 <I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</I> 文章“<A href="http://www-106.ibm.com/developerworks/library/os-ecov/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Getting started with the Eclipse Platform</A>”，这篇文章介绍了用 Eclipse 平台以及使用 Eclipse 插件编辑、编译和调试应用程序。<BR><BR>
<LI>请参阅 <I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</I> 文章“<A href="http://www-900.ibm.com/developerWorks/cn/java/os-ecplug/index.shtml">开发 Eclipse 插件</A>”，这篇文章介绍了如何开发 Eclipse 插件。<BR><BR>
<LI>从 <I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</I> 的这些文章中获取关于 Eclipse 的更多信息：<BR><BR>
<LI>在 <I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</I> 开放源码项目专区查找<A href="http://www-124.ibm.com/developerworks/opensource/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">更多有关 Eclipse 和开放源码参考资料</A>。<BR><BR></LI></UL>
<P></P>
<P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><A name=author1></A><SPAN class=atitle2>关于作者</SPAN><BR>Pawel Leszek 是 <A href="http://www.studiob.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Studio B</A> 的一位作家，他是一位专长于 Linux/Win/Mac OS 系统体系结构和管理的独立软件顾问和作家。他具有许多操作系统、编程语言和网络协议方面的经验，尤其是 Lotus Domino 和 DB2 方面。Pawel 还在 <A href="http://www.linuxworld.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><I>LinuxWorld</I></A> 上发表过一系列文章，他是 <I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">PC World</I> 波兰版的 Linux 专栏作家。Pawel 和他的妻子以及可爱的小女儿住在华沙。欢迎提问并提出意见；您可以通过 <A href="mailto:pawel.leszek@ipgate.pl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">pawel.leszek@ipgate.pl</A> 与 Pawel 联系。</TD></TR></TBODY></TABLE></SPAN></P><img src ="http://www.blogjava.net/uiiang/aggbug/15391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/uiiang/" target="_blank">小强</a> 2005-10-13 09:26 <a href="http://www.blogjava.net/uiiang/articles/15391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>