站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Eclipse 专题共享: Eclipse和WebSphere Studio新的项目交换功能

共享: Eclipse和WebSphere Studio新的项目交换功能

摘要: 本文讲解关于存储库和非存储库代码共享的几种不同方法,并且说明每种方法的优点和缺点。本文还将介绍一种新的项目交换(Project Interchange)功能,这种功能提供了一个可选的方式,可以在不能使用存储库的情况下共享代码。

?IBM版权所有,2003年。保留所有权利。

引言

一位“牛气”的程序员独自一人就能够编写代码的年代已经过去了。事实上,在每个重要的开发项目中共享代码都是有必要的。Eclipse和IBM? WebSphere? Studio提供了几种方法,可以用于把您的代码与同事共享,其中每一种方法都既有优点也有缺点。在大型开发项目中,最常用的共享方法是通过储存库(repository)进行共享。然而,有时您可能希望在不使用储存库的情况下共享您的工作。

本文讲解关于存储库和非存储库代码共享的几种不同方法,并且说明每种方法的优点和缺点。本文还将介绍一种新的项目交换(Project Interchange)功能,这种功能提供了一个可选的方式,可以在不能使用存储库的情况下共享代码。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

设置环境

为了演示本文中的示例,您将需要运行两个工作区。可以采用两种方式:

在运行Eclipse或WebSphere Studio时使用 -data 启动参数,您可以在同一台机器上运行两个工作区,其中, workspaceLocation 的值是指向您的本地驱动器的绝对路径(absolutepath)。在Windows?平台上,您可以简单地创建一个指向可执行文件( eclipse.exewsappdev.exe )的快捷方式,并且把该参数添加到 目标 字段就行了。无论您是使用两台机器还是同一台机器,我们都把创建项目的工作区称为 源工作区,而把您想要装载共享的工作的工作区称为 目标工作区

首先,您将需要把一些项目存放在您的源工作区中。如果您已经有了一组具有依赖性的项目,您就可以使用这些项目;您也可以使用样本项目,为此,您需要执行下面的操作步骤来添加它们。本文将使用通过添加 Auction 示例创建的项目(可以利用WebSphere Studio Application Developer),然后再给它增添一些细节。要将这些项目添加到您的工作区中,可以执行下面的操作步骤:

  1. 从Workbench窗口中,选择 File => New => OtherExamples => Enterprise Applications 1.3 => Auction
  2. 单击 Next按钮,接受缺省设置,然后单击 Finish按钮。

把三个新的项目添加到您的工作区中: AuctionExample、AuctionRunV5EJBAuctionRunV5Web 。对于项目共享而言,这是一个很好的示例,因为您需要以组的形式共享所有的项目,以使它们在另一个工作区中有意义。不过,为了有一些趣味性,让我们添加两种其他的依赖性。首先,将Project Utility JAR添加到EAR中:

  1. 创建一个新的名为 AuctionUtils 的Java™项目。
  2. 打开Application Deployment Descriptor编辑器,然后转向Modules页面。
  3. 在Utility JARs字段,单击 Add按钮。
  4. 在打开的对话框中,选择 AuctionUtils 项目,然后单击 Finish按钮:

接着,将依赖性从 AuctionRunV5EJB 添加到 AuctionUtils中:

  1. 在Resource Navigator或J2EE Navigator中,选择 AuctionRunV5EJB项目,打开弹出菜单,然后选择 Properties
  2. 选择Java JAR Dependencies页面,再选择 AuctionUtils.jar作为依赖性:

现在,让我们添加一些类路径(classpath)变量到 AuctionUtils Java创建路径(buildpath)中:

  1. 选择 AuctionUtils项目,打开弹出菜单,再选择 Properties
  2. 选择Java Build Path页面,再选择 Libraries选项卡。
  3. 单击 Add Variable
  4. 在打开的对话框,向下滚屏到列表,选择变量 WAS_50_PLUGINDIR ,然后选择 Extend
  5. 选择两个JAR: lib/j2ee.jarlib/xerces.jar
  6. 在对话框中单击 OK按钮以保存创建路径:

使用类路径变量是一种最好的方法,会使项目更易于移植和共享,因为它避免了编码项目元数据中的绝对路径。例如,下面是 AuctionUtils 项目中的 .classpath 文件的内容。只引用变量 WAS_50_PLUGINDIR ,而在启动时由平台来计算引用的JAR的绝对路径:

<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>

<?xml version="1.0" encoding="UTF-8"?>







    
</td></tr></table>

最后,添加utility类,它需要类路径变量以进行编译:

  1. AuctionUtils 项目中创建名为 test 的包。
  2. 在测试包中创建类 DOMClient
  3. 将以下的内容添加到 DOMClient 类中:
<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>

package test;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

/**
* @author schacher
*
* This class introduces a hard requirement on DOM APIs.
* Code is for illustrative purposes only.
*/
public class DOMClient {

public static DocumentBuilder getDefaultDocumentBuilder() throws

ParserConfigurationException {
javax.xml.parsers.DocumentBuilderFactory dbf =
javax.xml.parsers.DocumentBuilderFactory.newInstance();
return dbf.newDocumentBuilder();
}

public static Document parseDocument(InputSource inputSource)
throws ParserConfigurationException, IOException, SAXException
{
ClassLoader prevClassLoader =
Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(
DOMClient.class.getClassLoader());
javax.xml.parsers.DocumentBuilder db = getDefaultDocumentBuilder();
return db.parse(inputSource);
} finally {
Thread.currentThread().setContextClassLoader(prevClassLoader);
}

       }
       }
    
</td></tr></table>

让我们迅速地回顾一下您的工作区中已有的项目集:

下面的几个部分将回顾共享这些项目的一些方法,并且描述每种方法的实现、优点和缺点。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

方法1:使用存储库

对于小组开发,最常用的方法之一是使用后端存储库与本地或第三方工具支持。一个例子是Eclipse和WebSphere Studio中的CVS支持。关于使用CVS功能的详细情况在WebShpere Studio和Eclipse的在线帮助中。

在WebSphere Studio中:

  1. 选择 Help > Help Contents
  2. 选择 Application Developer Information => Workbench Basics => Tasks => Working in a team environment

在Eclipse中:

  1. 选择 Help > Help Contents
  2. 选择 Workbench User Guide => Tasks => Working in a team environment

优点

缺点

对于任何大型项目和带有大量产品代码的项目(需要版本控制和频繁备份),我们推荐使用存储库。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

方法2:共享整个工作区

这种共享方法采用“强制”方式。您要么复制要么压缩您的整个工作区,并使其可用于另一个开发人员。在目标端,将工作区复制或压缩到本地磁盘上,并且利用上述 -data 启动参数启动工作台。在您使用此方法时,请务必在复制或压缩文件之前关闭工作台,因为即使工作台看起来像是空闲的,但是在后台线程中,元数据文件也可能正处在更新的过程中。

需要引起注意的另一件事是,当您共享工作区时,您共享了一切东西,包括您的全部引用。这可能是一个优点也可能是一个缺点,取决于您的目的,如下所述。此外,如果您的项目不在缺省位置(它在工作区根木录下),那么共享将需要进行更多的工作--您必须单独压缩项目,并把它们解压缩到目标机器上相同的物理路径(physical path)中。

优点

缺点


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

方法3:导出EAR文件(仅限于WebSphere Studio)

使用这个方法,您可以从您的工作区中组成一个企业应用程序的一部分项目生成一个J2EE Enterprise Archive(EAR)文件。许多共享J2EE应用程序的小组使用这种方法,就像我们正在使用的样本那样,因为这种方法捆绑EAR文件所需所有项目的内容的能力非常强。下面是使用此方法的步骤,从这些步骤中可以看出,此方法并不一直是最佳的。首先从您的源工作区导出EAR文件。

  1. 从WebSphere Studio Workbench窗口中,选择 File => Export => EAR file,然后单击 Next按钮。
  2. 从下一个窗口中,选择 AuctionExample
  3. 定位到或输入文件位置。
  4. 选择 Export source files
  5. 选择 Include project build paths and metadata files
  6. 单击 Finish按钮以完成导出:

现在,您刚在 目标工作区中创建的EAR文件:

  1. 选择 File => Import => EAR file,然后单击 Next按钮。
  2. 定位到EAR文件的位置,输入项目名 AuctionExample ,然后单击 Next按钮。
  3. 务必选择 Create a new Java project defined as a utility JAR or web library,确保 JAR auctionUtils.jar 展开在它自己的Java项目中,就好像它是在源工作区中一样。
  4. 单击 Finish按钮来完成导入:

现在,您已经完成了导入,并且为部署准备好了一切东西,因为我们包含了源项目并且展开了实用JAR,对吗?基本上是,但还不完全。注意,在实用JAR项目中有编译错误:

为什么存在这些错误呢?回想一下,在创建源项目的过程中,我们添加了类路径变量,以给 xercers.jarj2ee.jar 文件增加可视性。之所以需要这些变量,是为了编译 DOMClient 类中的代码。然而在导入时,此信息丢失了。不过,请注意,该Web项目编译了,而没有产生任何错误,因为导入操作能够从web-app中的 MANIFEST.MF 文件所指定的依赖性,派生出Java创建路径项目依赖性,如下所示:

<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>

Manifest-Version: 1.0
Class-Path: AuctionRunV5EJB.jar
    
</td></tr></table>

在根据manifest文件中指定的依赖性生成Java创建路径方面,EAR导入或许是最佳的,但是它不能决定外部依赖性。您可能会问:“选择保存元数据如何?”之所以存在这种选择,是为了支持用于最优化创建的二进制项目方案(要获得关于二进制项目的更多信息,请参见在线帮助)。当您试图保存元数据并且将EAR作为源文件展开时会带来几种复杂性。例如,如果原始项目结构在一个项目中包含了多个源文件夹会怎样?导入不能决定哪些文件属于哪些源文件夹。有许多方式存在着局限性,这个问题可能会在另一个版本中解决,但或许这不是一个好的策略。人们已经把EAR导入/导出作为一种方便的交换格式,因为直到现在为止,还没有更好的共享项目的方法。然而,对于应用程序服务器,EAR文件是可部署的构件(artifact),并且在通常情况下,它不应该包括源代码和特定工具的元数据。

优点

缺点


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

方法4:导出ZIP文件

您已经了解了用于在开发人员之间共享项目的三种独立方法。使用存储库是最好的方法,但是有时,您可能需要与没有权利访问您的存储库的开发人员共享项目。您可以像上面所讲的那样共享整个工作区,但是这通常需要共享大量不必要的元数据。如果它是一个J2EE应用程序,您可以导出EAR文件,它比共享整个工作区好一些。但是如上所述,EAR导出没有保留具体项目结构。这给我们带来了第四种共享项目的方法--使用ZIP文件。

要开始用这种方法来共享项目,需要把一组项目导出到ZIP文件中:

  1. 选择 File => Export来打开Export向导:

  2. 选择 Zip file,然后单击 Next按钮。
  3. 选择所有您需要共享的项目,这意味着您必须知道项目之间的关系,这样您才能共享完整的项目集。输入ZIP文件的位置(如 D:\temp\AuctionProjects.zip ):

  4. 单击 Finish按钮来导出项目。

如上所示,将项目导出到ZIP文件中是相当简单的。然而,将项目导入到目标工作区中却并不那么容易:

  1. AuctionProjects.zip文件解压缩到一个目录。这个目录将是项目的实际地址,所以您可能需要把内容解压缩到您现有的工作区中。出于演示的目的,将内容导出到临时位置(如 D:\temp\AuctionProjects )。
  2. 选择 File => Import来打开Import向导:

  3. 选择 Existing Project into Workspace,然后单击 Next按钮。
  4. 单击 Browse来定位到第一个项目目录( AuctionExample )的位置(即步骤1中的临时位置):

  5. 单击 Finish按钮。这将在工作区(位置与步骤4相同)中创建 AuctionExample 项目。
  6. 对于您想要共享的每个项目,重复步骤2到5。

优点

缺点


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

方法5:使用项目交换ZIP文件

前面讨论的方法都没有提供一种好的机制,可以在不使用存储库的情况下轻松地进行消息共享。一种理想的项目共享方法应该是这样的:它不仅可以保存整个项目结构,包括元数据文件在内,与工作区共享方法中的一样;而且可以方便地计算整个应用程序所需的项目集,与导出EAR文件的方法中的一样。此外,使用一个动作就应该很容易地将项目导入到另一个工作区中,而不应该每个项目都需要几个动作,与导出ZIP文件的方法中的一样。

目前,在Eclipse或WebSphere Studio中并不存在这样的功能。因此,我们开发了项目交换(Project Interchange)功能,它为在一个步骤中共享项目集提供了新的导入和导出向导。在使用这个新的功能之前,您将需要把它添加到您的Eclipse或WebSphereStudio版本中。

安装项目交换功能

  1. com.ibm.etools.project.interchange.feature.zip解压缩到您的WebSphere Studio或Eclipse安装目录。
  2. 启动WebSphere Studio或Eclipse。系统会提示您有正在进行的更改。单击 Yes按钮。如果提示没有出现,则可以选择 Help => Software Updates => Pending Changes
  3. 在打开的Pending Configuration Changes窗口中展开树型目录。选择顶层日期(top leveldate),它应该包括 Project Interchange功能(它应该是第一个和惟一的项目)。
  4. 单击 Finish
  5. 在系统提示重新启动时,单击 Yes按钮,这样所作的更改就将生效。

项目交换功能通过ZIP文件(它非常类似于前面导出的ZIP文件)来共享项目。然而,它为创建ZIP文件提供了更强大的Export向导。要导出相关的项目集,可以执行如下操作步骤:

  1. 选择 File => Export来打开Export向导:

  2. 选择 Project Interchange,然后单击 Next按钮:

  3. 选择 AuctionExample项目,然后单击 Select Referenced。这将自动选择选中的项目所需的全部项目。
  4. To ZIP file字段中输入ZIP文件(如 D:\temp\AuctionProjects2.zip )。
  5. 单击 Finish按钮来创建ZIP文件。

现在,您有了所需项目的ZIP文件,与导出ZIP文件部分中的一样,只是您不需要知道所有的项目依赖性。要使用项目交换功能将这些项目导入另一个工作区中,可以执行如下操作步骤:

  1. 选择 File => Import来打开导入向导:

  2. 选择 Project Interchange,然后单击 Next按钮:

  3. 定位到刚导出的ZIP文件( D:\temp\AuctionProjects2.zip )。项目列表将根据所选ZIP文件中的项目进行刷新。
  4. 在缺省情况下,Project location root(项目位置根)就是您的工作区,不过,您可以将其更改为任何位置,您想把这个位置作为项目将要解压缩到的目录。
  5. 选择 AuctionExample项目。单击 Select Referenced来自动选择全部所需的项目。
  6. 单击 Finish来将全部所选的项目从ZIP文件解压缩到项目位置根目录中,然后导入工作区。

如上面步骤所示,使用新的项目交换功能共享项目是很简单的。然而,这个项目共享的方法也有一些缺点,并非对于所有情况都是最理想的。您可以通过使用存储库共享代码来避免这些缺点,项目交换方法并无意取代开发小组中共享项目的存储库。

优点

缺点


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

结束语

本文描述了五种在Eclipse或WebSphere Studio中共享项目的不同方法。对于需要具备版本控制和合并能力的开发小组而言,最好用存储库来共享项目。然而,您可能需要与没有权限访问您的存储库的开发人员共享项目,或者您不能使用存储库,在这些情况下,您可以使用其他四种方法。

共享整个工作区可能相当麻烦,并且它强制您选定整个新的工作区。如果您正使用WebSphere Studio,并且希望共享一个应用程序项目及其全部模块项目,那么您可能很想导出一个EAR文件,并且将它和它的内容导入另一个工作区。不过,带有元数据的EAR导出从来没有打算成为一种共享应用程序项目的方法,并且它将必定没有所期望的结果。一种更好的解决方案是把项目导出到ZIP文件中,然后把内容回导到工作区中,不过,导入需要您首先解压缩内容,然后一个一个地单独导入每个文件。

本文还描述了一种新的项目交换功能,它为不能使用存储库时共享项目提供了最好的方法。其简单性、易于使用和丰富的功能使这种方法成为一种优秀的共享项目的解决方案。



<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

下载

<table width="100%" class="data-table-1" cellspacing="0" cellpadding="0" border="0"><tr><th>名字</th><th style="text-align:right;">大小</th><th>下载方法</th></tr><tr><td nowrap="nowrap">com.ibm.etools.project.interchange.feature.zip</td><td style="text-align:right;" nowrap="nowrap">53 KB</td><td nowrap="nowrap">HTTP</td></tr></table><table cellspacing="0" cellpadding="0" border="0"><tr valign="top"><td colspan="5"></td></tr><tr><td></td><td>关于下载方法的信息</td><td></td><td></td><td>Get Adobe® Reader®</td></tr></table>
<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

作者简介<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td colspan="3"></td></tr><tr align="left" valign="top"><td>

</td><td></td><td width="100%">

Daniel Berg是位于美国北卡罗来纳州达勒姆美市的IBM Research Triangle Park Lab的一位软件工程师。他是WebSphere Studio Application Developer的J2EE工具的总设计师。您可以通过 danberg@us.ibm.com与Dan联系。

</td></tr></table>
<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td colspan="3"></td></tr><tr align="left" valign="top"><td>

</td><td></td><td width="100%">

Ritchie Schacher是位于美国北卡罗来纳州达勒姆美市的IBM Research Triangle Park Lab的一位软件工程师。他是WebSphere Studio Application Developer的J2EE工具的开发人员。您可以通过 schacher@us.ibm.com与Ritchie联系。

</td></tr></table>

<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>


↑返回目录
前一篇: 使用 Eclipse 插件 Ruby Development Tools
后一篇: 扩展 Eclipse 的 Java 开发工具