??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成AV人网址,亚洲网红精品大秀在线观看,亚洲AV成人片无码网站http://m.tkk7.com/uiiang/category/3638.html世h皆有(zhn)哀Q只有你不明?/description>zh-cnWed, 28 Feb 2007 03:25:38 GMTWed, 28 Feb 2007 03:25:38 GMT60析Eclipse建模框架(EMF)及其动态能?/title><link>http://m.tkk7.com/uiiang/articles/15864.html</link><dc:creator>强</dc:creator><author>强</author><pubDate>Tue, 18 Oct 2005 16:10:00 GMT</pubDate><guid>http://m.tkk7.com/uiiang/articles/15864.html</guid><wfw:comment>http://m.tkk7.com/uiiang/comments/15864.html</wfw:comment><comments>http://m.tkk7.com/uiiang/articles/15864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/uiiang/comments/commentRss/15864.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/uiiang/services/trackbacks/15864.html</trackback:ping><description><![CDATA[如果l定一个模?那么EMF能够自动生成Java源代?该源码允怽创徏、查询、更新、串行化、反串行化、检验和q踪你的模型实例的变化。EMF提供了一l有效的反射APIq且允许你用动态的Q非生成的)模型q行工作?BR><BR>  <B>一?引言</B><BR><BR>  <A class=bluekey target=_blank>Eclipse</A>建模框架(EMF)是一个Java开源框架与代码生成工具-用于Zl构化的模型来构建工具和其它应用E序。在Eclipseq_在用L面和文gU上提供一个强有力的集成框架的同时,EMF加强了这U能力来实现工具和应用程序之间良好粒度的数据分n?BR><BR>  cM于其它的Javal定框架Q例如JAXB或XMLBeans,l定一个模型后,EMFp够生成Java源代?它允怽创徏、查询、更新、反串行化以及串行化你的模型的实例。尽多数Javal定框架仅支持一个模型类,例如XML模式Q而EMF支持从XML模式,UMLcd(Rational <A class=bluekey target=_blank>Rose</A>或UML2)以及被注解的Java接口中生成代码。除了模型代码,EMFq能生成一个完整的应用E序-它包括一个可定制的编辑器?BR><BR>  EMF生成的代码有一个内建的改变通知机制q且支持跨文档参考。EMF提供一个反API以存取你的模型实例ƈ且允怽动态地创徏模型。EMF支持模型U束校验。EMF提供强有力的代码生成工具来支持模型的重新生成和用用户书写的代码q行合ƈ?BR><BR>  在本文中,我们解释什么是EMF,q分析其基本框架?BR><BR>  EMF最开始是一个对象管理组?OMG)元对象设?MOF)说明书的实现-它ؓ面向对象的分析和设计提供一个标准化的元模型。在很长一D|间以来,EMF被用于实现大量的工具q且因此演变Z个有效的MOF API的一个核心子集的Java实现?BR><BR>  在EMF中的cMOF核心元模?一个模型的模型)被称作Ecore。在对当前的MOF 2.0的实C,有一个类似的MOF模型的子?UCEssential MOF(EMOF)Q它现在已经被独立出来。在Ecore和EMOF之间主要存在上些的特别是命名上的区别,因此EMF能透明地读和写串行化的EMOFQ从而允许工具间数据的标准交换?BR><BR>  今天EMF已被q泛应用。例?EMF被用于实现开源XML模式Infoset模型(XSD),服务数据对象(SDO),UML2以及Eclipse上的Web工具q_(WTP)工程。另外,EMF也被使用在商业化的品中,例如Omondo EclipseUML?A class=bluekey target=_blank>及IBM</A> Rational?A class=bluekey target=_blank>WebSphere</A>产品{?BR><BR>  <B>二?Ecore和反API</B><BR><BR>  EMF中的一个关键接口是EobjectQ它在概念上{h(hun)于java.lang.Object。所有的建模对象Q无论是生成的与否,Z提供以下几个重要特征Q都要实现这个接口:<BR><BR>  ·cMJava的Object.getClass(),通过使用eClass()Ҏ(gu),你能索实例的元数据,也就是它的Eclass?BR><BR>  ·在Q何EMF建模的对象上Q你都能使用反射API(eGet(),eSet())来存取它的数据。这在概念上{同于Java的java.lang.reflect.Method.invoke()Ҏ(gu),管效率更高些?BR><BR>  ·从Q何实例对象,你都可以通过使用eContainer()Ҏ(gu)得到它的容器(parent)?BR><BR>  ·EObject也扩展了Notifier,q允怽监视对象的数据的所有变化?BR><BR>  如前面所提及QEMF有它自己的简单的元数?UCEcore。图1昄出Ecore元数据的完整的类层次l构图。在?中,你可以看到EPackage包含关于模型c?EClass)和数据类?EDataType)的信息。EClass描述一个徏模的c?q且指定属性和参考以描述实例的数据。EAttribute描述单数?它由一个EDataType来指定。EReference描述一个类之间的关联;它的cd是一个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>?.Ecorecdơ结构:q个囑փ昄出Ecore元数据完整的cdơ?/DIV></TD></TR></TBODY></TABLE><BR>  为找到更多关于EMF和EcoreQ请dU概q或购买Eclipse建模框架(EMF)。EMF|站提供了若q文件来描述怎么使用EMF来从一个XML模式或UML图表生成Java代码?BR><BR>  下面我将描述一个示例,它用Ecore来创Z个简单公司模型,然后使用动态的EMF来创?串行化和反串行化q个模型的实例。如果你想l读下去q且你已l是一个Eclipse用户,请下载和安装EMF 2.1 <A class=bluekey target=_blank>SDK</A>或Q何可用的更新的版本,在EMF下蝲站点。如果不那样,你还可以下蝲独立?它包括EMF jar文gQ它没有M对Eclipse的依赖性ƈ且能被用于一个独立的应用E序?BR><BR><STRONG>三?使用动态EMF能力<BR><BR></STRONG>  一般地Q如果你在开发期间创Z模型Q那么典型情况下Q你最好生成Java代码Q因为在q种情况中你的应用程序会使用较少的内存ƈ且提供更快的数据存取(或是使用生成的API或是使用反射API)。尽生成Java代码满了大多数应用E序的需要,但是情况q不L如此。你可能需要处理数据,而不需要用生成的实现cR例?你可能不知道在开发时间你要处理的数据的模型,q就使得生成的Java代码成ؓ一个可怜的选项?BR><BR>  动态的Q也是非生成的Q类可以在运行时ȝ几种Ҏ(gu)来创建。让我们先开始用Ecore API以编E地方式来创Z个公司模型。公司模型用于描qC个公司,它有一个名U和部门。每个部门由一个数字来唯一标志出ƈ且它q有雇员Q每个雇员有一个名U。在下面的代码显C出一个相应于该模型的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>//创徏一Companyc?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>//创徏一Employeec?BR>EClass employeeClass = ecoreFactory.createEClass();<BR>employeeClass.setName("Employee");<BR>//在EmployeecMd一个名字属?BR>EAttribute employeeName = ecoreFactory.createEAttribute();<BR>employeeName.setName("name");<BR>employeeName.setEType(ecorePackage.getEString());<BR>employeeClass.getEStructuralFeatures().add(employeeName);<BR>//创徏一Departmentc?BR>EClass departmentClass = ecoreFactory.createEClass();<BR>departmentClass.setName("Department");<BR>//ddepartment标志数字<BR>EAttribute departmentNumber = ecoreFactory.createEAttribute();<BR>departmentNumber.setName("number");<BR>departmentNumber.setEType(ecorePackage.getEInt());<BR>departmentClass.getEStructuralFeatures().add(departmentNumber);<BR>//departmentc能够包含到一个或多个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能够包含C个或多个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>通过使用反射APIQ你能创建ƈ且初始化一个你的模型的实例Q?BR>//得到company工厂<BR>EFactory companyFactory = companyPackage.getEFactoryInstance();<BR>//使用工厂来创建companycȝ实例q且<BR>//讄company名字<BR>EObject company = companyFactory.create(companyClass);<BR>company.eSet(companyName, "MyCompany");<BR>//创徏一个employeecȝ实例 <BR>EObject employee = companyFactory.create(employeeClass);<BR>//使用反射API初始化employee的名?BR>employee.eSet(employeeName, "John");<BR>//创徏一个departmentcȝ实例<BR>EObject department = companyFactory.create(departmentClass);<BR>department.eSet(departmentNumber, new Integer(123));<BR>//d"John"到department<BR>((List)department.eGet(departmentEmployees)).add(employee);<BR>//ddepartment到company<BR>((List)company.eGet(companyDepartments)).add(department);</TD></TR></TBODY></TABLE><BR><STRONG>四?数据的串行化和反串行?BR><BR></STRONG>  Z串行化你的模型实?你需要把一个你的实例模型的根对象放|到一个资源中。EMForg.eclipse.emf.ecore.resource.Resource接口描述了一个物理的存储位置(例如文g或URL)q且提供Ҏ(gu)以串行化和装载数据。每一U资源都被存储在一个ResourceSet?它代表了一个资源集?q些资源被一起创建和加蝲q允许在它们当中q行参考引用。特别地,一个ResourceSet负责跟踪哪些资源已被装蝲q且保证q个ResourceSet中的资源不会被重复装载?BR><BR>  因ؓEMF能够处理多重模型?例如XML模式,所以指定用哪些资源来实现(?串行化你的数据也是很重要的。通常,当你调用ResourceSet.createResource(URI)Ҏ(gu)?它查询Resource.Factory.Registry来查找一个工?该工厂是URI而注册的q且使用它来创徏一个适当的资源实现。因?在你(?串行化你的数据以前,L保你已注册了适当的资源工厂实现。EMF提供若干Resource.Factory实现:<BR><BR>  ·对于XML数据Q用org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl?BR><BR>  ·对于XMI数据Q用org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl?BR><BR>  ·对于Ecore模型Q用org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl?BR><BR>  你的工具׃有了q些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>//d根对象到资源<BR>resource.getContents().add(company);<BR>//串行化资?你还能指定串行化<BR>//选项Q它定义在org.eclipse.emf.ecore.xmi.XMIResource?BR>resource.save(null);<BR>company.xmi被串行化后的形式如下Q?BR>Q?xml version="1.0" encoding="ASCII"?Q?BR>Qcompany:Company xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"<BR>xmlns:company="http:///com.example.company.ecore" name="MyCompany"Q?BR>Qdepartment number="123"Q?BR>Qemployees name="John"/Q?BR>Q?departmentQ?BR>Q?company:CompanyQ?/TD></TR></TBODY></TABLE><BR>  在反串行化过E中QXML数据的命名空间URI被用于定位所需要的Ecore?它用于描qC的实例文档的模型)。因?在你试装蝲M模型以前Q请保你已lؓ你的文档要使用的每个Ecore包注册了命名I间URIQ?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)的注册差别也是很重要的。全局注册是静态的Q因此Q何应用程序在JVM生存期都能存取全局注册q且可能覆盖它。ؓ保你的注册不会覆盖全局注册q且反过来也如此,典型圎ͼ你最好用局部资源集合注册?BR><BR>  <B>五?由XML模式生成动态的Ecore</B><BR><BR>  如前所提及,如果你的模型是一个XML模式但是你没有选择生成Javac,那么Q你可以通过使用XSDEcoreBuilder来动态地创徏一个Ecore模型。这个示例用了ipo.xsdQ?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>  q个generateҎ(gu)q回个模式中的每个URI生成的Ecore包。如果该模式导入了其它命名空?那么有多个Ecore包被q回。每个包是被注册到本地的资源集中-用于实现模式转换。因此,如果你用同L资源集来装蝲你的实例XML文档的话,你就不需要自己注册包?BR><BR>  因ؓXML模式包括更多概念而不仅仅是EcoreQ例如通配W等,所以EMF使用Ecore EAnnotations来记录到XML模式的映。在数据(?串行化期_EMF需要处理这些注解。ؓ了确保这些注解在(?串行化期间被加以考虑Q你必须使用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.1q增加了一Ҏ(gu)功能-它允怽在加载一个包含一个xsi:schemaLocation或xsi:noNamespaceSchemaLocation属性的XML文档Ӟ不断地把模式转换成Ecore。同Ӟ它也允许你加载一个没有与之相兌的模式的XML文档。ؓ了用这一功能Q你需要注?org.eclipse.emf.ecore.xmi.impl.GenericXMLResourceFactoryImplQ?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>  本文向你短介l了EMF,q解释了几个核心的EMF概念。同Ӟ对于如何利用模式EMF的动态能力提供了相关CZ?img src ="http://m.tkk7.com/uiiang/aggbug/15864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/uiiang/" target="_blank">强</a> 2005-10-19 00:10 <a href="http://m.tkk7.com/uiiang/articles/15864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 如何使用版本控制http://m.tkk7.com/uiiang/articles/15391.htmlThu, 13 Oct 2005 01:26:00 GMThttp://m.tkk7.com/uiiang/articles/15391.htmlhttp://m.tkk7.com/uiiang/comments/15391.htmlhttp://m.tkk7.com/uiiang/articles/15391.html#Feedback0http://m.tkk7.com/uiiang/comments/commentRss/15391.htmlhttp://m.tkk7.com/uiiang/services/trackbacks/15391.html转蝲:http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/index.shtml

本文概述?Eclipse q_如何支持软g目中的源代码版本控制。首先,我们简要讨Z下团队代码开发的思想Q然后研I?Eclipse 如何使用 CVS 代码资源库。我们还研I一些源代码理软g工具Q可以通过 Eclipse 插g扩展来支持这些工兗?/BLOCKQUOTE>

在团队项目中׃n源代?/SPAN>
C的大多数应用E序是由多hl成的团队开发的。即使只涉及几个开发h员的项目,也需要对源代码的更改q行严格控制。这是源代码管理Y件的d。源代码版本控制软g必须支持两个核心功能Q?/P>

  • 提供一U方法,能够协调Ҏ(gu)代码的更改,q能集成q些更改
  • 团队所提交工作的历史记?

当团队成员完成新的工作时Q通过这些更Ҏ(gu)交到资源库来׃n他们的工作。类似地Q当他们希望获得最新可用的工作成果Ӟ可以根据资源库中的更改Q更新自q本地工作I间。这意味着目资源库会因团队成员提交新工作成果而经常发生更攏V换句话_资源库应该表C项目的当前状态。Q何时候,团队成员都要能够Ҏ(gu)资源库更新自q工作I间Qƈ信它们是最新的?/P>

l护历史记录也很重要Q那样就可以当前工作与先前版本q行比较Q如有必要,q可以回复到先前版本。协调团队的工作Q以便只存在唯一的当前项目状态定义,以及包含团队已集成的工作Q这些对于管理版本控制也是十分必要的。这U协调有可能是最隑֮现的目标?/P>

最理想的模型是Q团队的M成员都可以对自己有权讉K的Q何资源进行更攏V因Z个团队成员可以提交对同一资源的更改,所以有可能发生冲突Q必解册U冲H。这U模型假定冲H具有唯一性。但遗憾的是Q没有Q何源代码是孤立地存在的;通常它包含与其它资源隐式或显式的相关性。源代码引用了在其它源代码资源中描述的构件。但源代码管理Y件的工作到此ؓ止了Q因为它q不能取代项目管理。项目管理者必d行其职责Q协调其它成员的工作以及负责q度、项目阶D和发布日期。此外,源代码管理也不能替代开发h员之间的交流?/P>

Eclipse q_如何支持代码理
Eclipse q_提供了作为团队在软g目中共享代码和工作的能力。Eclipse q泛地支持各U代码管理解x案,q要归功于它的插件体pȝ构(不过Q现已推Z?CVS 的支持)。Eclipse q_体系l构的重点在?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">工作I间。工作空间维护构建和试软g目所需的一切。它包含对象Q源代码和资源)。它q保存了用于目、IDE 和插件的配置讄。工作空间是在开发h员的机器上本地进行维护的Q而团队通过外部资源库进行协作,不同开发h员的代码在资源库q行汇集。可以经由因特网通过“客h-服务器”体pȝ构访问资源库?/P>

Eclipse q_提供了对于直接从工作I间q行团队开发操作的支持。这U支持允许开发h员ƈ发地与几个独立的资源库以及不同版本的代码或项目进行交互。工作空间中的资源允许团队支持组件处理版本和配置理问题。当Ӟ单个工作I间可以同时讉K不同cd的资源库。Eclipse q_q没有提供它自己的代码管理解x案;它L依靠外部pȝ。Eclipse q_只对一个(但也是最行的一个)源代码管理系l提供内|支持:q发版本控制pȝQConcurrent Versions SystemQCVSQ?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">对第三方代码理应用E序的支?/A>一节中描述了用第三方插g支持其它资源库?/P>

CVS 是什么?
CVS 诞生?1986 q_当时作ؓ一l?shell 脚本而出玎ͼ但它现在已经发展成了最行的针对Y件开发h员的源代码版本管理解x案。CVS 是用于代码版本管理的开放源码的客户机/服务器解x案,它可用于各种q_Q包?Linux ?Windows NT/2000/XP。请参阅本文末尾?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资?/A>Q其中有 CVS 客户机、服务器和源代码的下载链接?/P>

通常QCVS 的主要功能是记录源文件的历史。当一l开发h员从事同一个项目时QCVS 他们彼此隔d来。每个开发h员都在他Q她自己的目录中独立工作Q然后?CVS 资源库(不时圎ͼ合ƈ工作l果?/P>

Eclipse 拥有?Eclipse q_ IDE 紧密集成的内|?CVS 客户机,它是作ؓ一个单独透视图(CVS Repository Exploring 透视图)而实现的Q用于与 CVS 的交互。用?CVS 的通用 Eclipse 讄QGeneral Eclipse settings for CVSQ位?Window -> Preferences window -> Team 下。在切换?CVS Repository Exploring 透视图之后,可以用所?CVS 操作了(转至 Window -> Open Perspective -> Other -> CVS Repository Exploring 菜单 ?请参?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?1 ?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?2Q?/P>

?1. 切换?CVS Repository Exploring 透视?/B>
CVS 资源? src=

首先讄资源库的位置Q它?yu)定义用于选定 CVS 服务器/资源库的q接参数。请保使用 SSH 隧道Q?CODE>extsshQ?

?2. 览 CVS Repository Exploring 透视图中?CVS 资源?/B>
览 CVS 资源? src=

Eclipse/CVS 的源代码工作?/SPAN>
?CVS 团队协作模型中,团队成员彼此独立地在他们各自的工作台上完成自q所有工作。最后,他们希望׃n其工作。他们通过 CVS 资源库实现这一炏VCVS 使用分支QbranchQ模型来支持彼此独立而又高度怺依赖的多个工作流E(course of workQ。这些分支是开发团队用来共享和集成正在q行中的工作的地斏V可以认?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">分支是一个共享的工作収ͼ当团队成员对源代码进行更Ҏ(gu)更新这个工作台。这个模型允总?CVS 团队目的每个开发h员在q行更改时与其他成员׃n其工作,以及在项目进展期间访问其他成员的工作?/P>

一个称?HEAD 的特D分支用来表C源库中的主要工作程QHEAD 通常被称?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">dQ。当团队成员资源提交给该分支时Q会影响q些相关性。确保相x的完整性是很重要的Q因分支表示了当前项目的状态。当ӞM时候,团队成员都可以用该分支的内容作为新工作的基?/P>

那些规则不仅适用?CVSQ无Z用哪U版本控制YӞ团队目中都有一些用于源代码理的常见步骤。下面是一个?Eclipse 内置?CVS 支持的示例工作流Q?/P>

1. 启动新的团队目
每个新的I?Eclipse 目都可以通过 CVSQ或受支持的M其它源代码管理系l)q行׃n。开发h员也可以通过其现有的代码迁Ud资源库来׃n它。要q行׃nQ单击项目主文g夹,在显C的上下文菜单中使用 Team -> Share Project 选项Q如?3 所C?/P>

?3. 使用 CVS 资源库共享本地项?/B>
׃n目

另一个选项是通过从选定?CVS 资源库分支导入代码来创徏新的工作台项目。只要选择适当分支Q或 HEADQ,然后选择?CVS Repository Exploring 透视图中的上下文菜单中选择“Checkout As Project”选项Q如?4 所C?/P>

?4. 从现有的 CVS 资源库创建新目
新徏目

2. 使用代码q进行更?/B>
开发h员通过 Eclipse 工作台在本地使用代码Q包括的工作有创建新资源、修改现有资源、编写注释,q在他们使用后在本地保存q些内容?/P>

3. 使本地更改与 CVS 资源库同?/B>
如果一个项目开发h员准备提交他Q她的工作,那么首先要执行更新操作。这会针对引入的更改核对资源库,q将q些更改d到该开发h员的本地工作台。这L保了开发h员知道这些更改可能会影响他/她将要提交的工作的完整性。用项目上下文菜单中的 Compare With... 选项本地版本与资源库中存储的代码进行比较(请参?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?5Q?BR>
 

3. 使本地更改与 CVS 资源库同?/B>
如果一个项目开发h员准备提交他Q她的工作,那么首先要执行更新操作。这会针对引入的更改核对资源库,q将q些更改d到该开发h员的本地工作台。这L保了开发h员知道这些更改可能会影响他/她将要提交的工作的完整性。用项目上下文菜单中的 Compare With... 选项本地版本与资源库中存储的代码进行比较(请参?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?5Q?/P>

?5. 比较本地版本与资源库中的版本
本地版本

下一步是解决最后出现的M冲突Qƈ设法再次~译代码。如果一切正常,那么从项目上下文菜单使用 Team -> Commit... 选项执行提交操作Q如?6 所C。这会所有更攚w集成到资源库中?/P>

?6. 更Ҏ(gu)交到q程资源?/B>
提交更改

4. 理资源?/B>
CVS 允许开发h员将更改隔离在开发的某些独立路径之内Q这些\径称为分支。当一个开发h员更Ҏ(gu)个分支上的文件时Q这U更改不会出现在d或其它分支上。那些分支被命名?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">子版本(subversionQ?/I>?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">代码分叉Qcode forkQ?/I>。稍后,由合q操作将更改从一个分支迁Ud另一个分支(或主qԌ。然后提交这些修订。这样就有效地将更改复制C另一个分支上。用项目上下文菜单?Team -> Branch... 选项QEclipse 使开发分支之间的q移变得Ҏ(gu)?/P>

当然Q当开发团队维护大型资源库Ӟ有必要控刉目内的提交和合ƈ操作。Eclipse/CVS 集成提供了一U特D的视图QCVS Repository HistoryQ请参阅?7Q。它l出了关于团队成员在资源库中所执行更改的快速预览?/P>

?7. ?CVS Resource History H口中查看带注释的修订历史记?/B>
修订历史记录

Eclipse q_提供了几个支持代码管理的实用E序。最有用的是补丁功能。它?yu)出自两个来源(譬如本地工作台和资源库)的代码进行比较,然后创徏一个包含代码差异的cM UNIX 的补丁文Ӟ请参?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?8Q。可以将该文件发送给开发h员以源代码升到最新版本?/P>

?8. 创徏用于源代码分发的补丁
源代码分?src="http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecshare/eclipse8.gif"

5. 断开目?CVS 的连?/B>
当项目开发已l结束,q且团队希望ȝ源代码时Q可以从 HEAD 资源库删除该目的最l版本。断开目?CVS 的连接将在该目及其资源上禁用资源库操作Qƈ删除与该目相关联的 CVS 信息Q这一操作是可选的Q?/P>

可以通过目上下文菜单中?Team -> Disconnect 选项执行断开q接操作。通过选择q个选项Q会打开 Confirm Disconnect from CVS 对话框。在该目与资源库的连接断开之后Q该团队必须定如何处理 CVS 信息。第一个选项是“Delete the CVS meta information”;它将用 CVS 团队菜单操作q从文gpȝ中删?CVS 文g夹及其内宏V第二个选项是“Do not delete the CVS meta information”;它将用 CVS 团队菜单操作Q但保留 CVS 元信息?/P>

对第三方代码理应用E序的支?/SPAN>
CVS 有几个重要的限制Q它不能定单个文g或整个文仉范围内同时进行的更改Q它也不能检文件之间的逻辑冲突。其冲突概念Ua是文本意义上的,当对于同一基本文g的两个更Ҏ(gu)间上非常非常接近Q从而合ƈ命o受到q扰Ӟ׃发生冲突。CVS 也不能提供Q何类g消息传递这L交互式协作工兗幸q的是,CVS q不?Eclipse q_所支持的唯一的源代码理软g。开发h员可以通过插g扩展 Eclipse q_的功能,而且目前Q到 2003 q?3 ?4 日ؓ止)已有 16 个可用于团队开发Y件的插g。所有插仉是由 Eclipse C֌或商业Y件供应商创徏的。这些插件中的大多数d了对W三斏V商业源代码理pȝ的支持。最有h(hun)值的插g是那些支持流行的企业代码理pȝQ如 Merant PVCS ?Rational ClearCaseQ的插g。例如,CVS-SSH2 插g允许通过 SSH2 会话讉K CVSQ?Microsoft Visual SourceSafeQVSSQ团队提供程序插件添加了?MS VSS 产品的支持(也可以在诸如 Linux q样的非 Windows q_上用)?/P>

但是Q我本h所偏爱的插件是 KoiQ请参阅参考资?/A>以获取链接)。尽它q严格用于源代码控Ӟ但这个创新的工具l协作开发注入了许多新的zd。其当前版本支持工作台到工作台的消息传递、共享标记、冲H更攚w知、共享日历和事g通知。Koi ?XML-RPC 用作其客h-服务器体pȝ构中的通信模型。客h是与“协作服务器”通信的单?Eclipse q_实例Q而协作服务器也是一?Eclipse 插g。Koi 使用?JDBC 讉K的关pL据库作ؓ数据存储。可?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资?/A>中找到指向完整的、经q分cȝ Eclipse 插g注册表的链接?/P>

参考资?/SPAN>

  • 请参?eclipse.org 上的 Eclipse q_C֌。Eclipse q_源代码遵?Common Public License。Eclipse.org q有一?Eclipse 目的术语和描述词汇表,以及技术文章和新闻l。Eclipse q_白皮书(可在 Eclipse.org 主页获取Q详l描qC Eclipse 的主要组件和功能?BR>
  • ?eclipse.org 下蝲 KOI 插g?BR>
  • 查看 Eclipse 插g的完整的、经q分cȝ注册?/A>?BR>
  • ?CVS 主页?LORIA 站点下蝲 CVS 客户机、服务器和源代码?BR>
  • 请参?developerWorks 文章?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Working the Eclipse Platform”,以了解关?Eclipse q_的背景知识?BR>
  • 请参?developerWorks 文章?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Getting started with the Eclipse Platform”,q篇文章介绍了用 Eclipse q_以及使用 Eclipse 插g~辑、编译和调试应用E序?BR>
  • 请参?developerWorks 文章?A >开?Eclipse 插g”,q篇文章介绍了如何开?Eclipse 插g?BR>
  • ?developerWorks 的这些文章中获取关于 Eclipse 的更多信息:

  • ?developerWorks 开放源码项目专区查?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">更多有关 Eclipse 和开放源码参考资?/A>?BR>

关于作?/SPAN>
Pawel Leszek ?Studio B 的一位作Ӟ他是一位专长于 Linux/Win/Mac OS pȝ体系l构和管理的独立软gN和作家。他h许多操作pȝ、编E语a和网l协议方面的l验Q尤其是 Lotus Domino ?DB2 斚w。Pawel q在 LinuxWorld 上发表过一pd文章Q他?PC World 波兰版的 Linux 专栏作家。Pawel 和他的妻子以及可q女儿住在华沙。欢q提问ƈ提出意见Q?zhn)可以通过 pawel.leszek@ipgate.pl ?Pawel 联系?/TD>



2005-10-13 09:26 发表评论
]]>
վ֩ģ壺 jlzzjlzzjzjzjz| sɫƬ߹ۿ| ˳վ߹ۿ| ƷһƵ| ޾Ʒ˽Ĺ| Ļȫȫ1 ĻmvߵӰ | ޶߹ۿվ| ˳С˵վɫ| Ƶһ| AVһַ| ůůѸձһ| ޸Ů侫| jjzzŮ| ĻһƵ| ޹þþþƷС˵ | ƵƵ| AVô뾫Ʒ| ߾ƷaaaƬ| Ƶվ| 鶹һѲվ | þþþþùƷ | aձѿ| þ޾ƷĻ| ձվ| ɫվ| Ļ벻Ӱ| 97avƵ| ɫۺϾþþƷ޹| ˳wwwӰҳ | һësuvÿĹվ | AVһϵ | ߲91| ˳վ߹ۿŶ | ƷѵӰ| 99Ƶѹۿ| һ鶹| ѿŮճˮƵ| AAAձ߲ѹۿ| 㽶߹ۿ| ޾Ʒ޿һ| ֳִִƵ|