当前页面: 开发资料首页 → Eclipse 专题 → 共享: Eclipse和WebSphere Studio新的项目交换功能
摘要: 本文讲解关于存储库和非存储库代码共享的几种不同方法,并且说明每种方法的优点和缺点。本文还将介绍一种新的项目交换(Project Interchange)功能,这种功能提供了一个可选的方式,可以在不能使用存储库的情况下共享代码。
?IBM版权所有,2003年。保留所有权利。
引言
一位“牛气”的程序员独自一人就能够编写代码的年代已经过去了。事实上,在每个重要的开发项目中共享代码都是有必要的。Eclipse和IBM? WebSphere? Studio提供了几种方法,可以用于把您的代码与同事共享,其中每一种方法都既有优点也有缺点。在大型开发项目中,最常用的共享方法是通过储存库(repository)进行共享。然而,有时您可能希望在不使用储存库的情况下共享您的工作。
本文讲解关于存储库和非存储库代码共享的几种不同方法,并且说明每种方法的优点和缺点。本文还将介绍一种新的项目交换(Project Interchange)功能,这种功能提供了一个可选的方式,可以在不能使用存储库的情况下共享代码。
设置环境
为了演示本文中的示例,您将需要运行两个工作区。可以采用两种方式:
在运行Eclipse或WebSphere Studio时使用
-data
启动参数,您可以在同一台机器上运行两个工作区,其中,
workspaceLocation
的值是指向您的本地驱动器的绝对路径(absolutepath)。在Windows?平台上,您可以简单地创建一个指向可执行文件(
eclipse.exe
或
wsappdev.exe
)的快捷方式,并且把该参数添加到
目标
字段就行了。无论您是使用两台机器还是同一台机器,我们都把创建项目的工作区称为
源工作区,而把您想要装载共享的工作的工作区称为
目标工作区。
首先,您将需要把一些项目存放在您的源工作区中。如果您已经有了一组具有依赖性的项目,您就可以使用这些项目;您也可以使用样本项目,为此,您需要执行下面的操作步骤来添加它们。本文将使用通过添加
Auction
示例创建的项目(可以利用WebSphere Studio Application Developer),然后再给它增添一些细节。要将这些项目添加到您的工作区中,可以执行下面的操作步骤:
把三个新的项目添加到您的工作区中:
AuctionExample、AuctionRunV5EJB
和
AuctionRunV5Web
。对于项目共享而言,这是一个很好的示例,因为您需要以组的形式共享所有的项目,以使它们在另一个工作区中有意义。不过,为了有一些趣味性,让我们添加两种其他的依赖性。首先,将Project Utility JAR添加到EAR中:
AuctionUtils
的Java项目。
AuctionUtils
项目,然后单击
Finish按钮:
接着,将依赖性从
AuctionRunV5EJB
添加到
AuctionUtils中:
现在,让我们添加一些类路径(classpath)变量到
AuctionUtils
Java创建路径(buildpath)中:
WAS_50_PLUGINDIR
,然后选择
Extend。
lib/j2ee.jar
和
lib/xerces.jar
。
使用类路径变量是一种最好的方法,会使项目更易于移植和共享,因为它避免了编码项目元数据中的绝对路径。例如,下面是
AuctionUtils
项目中的
.classpath
文件的内容。只引用变量
WAS_50_PLUGINDIR
,而在启动时由平台来计算引用的JAR的绝对路径:
<?xml version="1.0" encoding="UTF-8"?>
</td></tr></table>最后,添加utility类,它需要类路径变量以进行编译:
AuctionUtils
项目中创建名为
test
的包。
DOMClient
。
DOMClient
类中:
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>让我们迅速地回顾一下您的工作区中已有的项目集:
下面的几个部分将回顾共享这些项目的一些方法,并且描述每种方法的实现、优点和缺点。
方法1:使用存储库
对于小组开发,最常用的方法之一是使用后端存储库与本地或第三方工具支持。一个例子是Eclipse和WebSphere Studio中的CVS支持。关于使用CVS功能的详细情况在WebShpere Studio和Eclipse的在线帮助中。
在WebSphere Studio中:
在Eclipse中:
优点
缺点
对于任何大型项目和带有大量产品代码的项目(需要版本控制和频繁备份),我们推荐使用存储库。 方法2:共享整个工作区
这种共享方法采用“强制”方式。您要么复制要么压缩您的整个工作区,并使其可用于另一个开发人员。在目标端,将工作区复制或压缩到本地磁盘上,并且利用上述
需要引起注意的另一件事是,当您共享工作区时,您共享了一切东西,包括您的全部引用。这可能是一个优点也可能是一个缺点,取决于您的目的,如下所述。此外,如果您的项目不在缺省位置(它在工作区根木录下),那么共享将需要进行更多的工作--您必须单独压缩项目,并把它们解压缩到目标机器上相同的物理路径(physical path)中。 优点
缺点
方法3:导出EAR文件(仅限于WebSphere Studio)
使用这个方法,您可以从您的工作区中组成一个企业应用程序的一部分项目生成一个J2EE Enterprise Archive(EAR)文件。许多共享J2EE应用程序的小组使用这种方法,就像我们正在使用的样本那样,因为这种方法捆绑EAR文件所需所有项目的内容的能力非常强。下面是使用此方法的步骤,从这些步骤中可以看出,此方法并不一直是最佳的。首先从您的源工作区导出EAR文件。
现在,您刚在
目标工作区中创建的EAR文件:
现在,您已经完成了导入,并且为部署准备好了一切东西,因为我们包含了源项目并且展开了实用JAR,对吗?基本上是,但还不完全。注意,在实用JAR项目中有编译错误:
为什么存在这些错误呢?回想一下,在创建源项目的过程中,我们添加了类路径变量,以给
在根据manifest文件中指定的依赖性生成Java创建路径方面,EAR导入或许是最佳的,但是它不能决定外部依赖性。您可能会问:“选择保存元数据如何?”之所以存在这种选择,是为了支持用于最优化创建的二进制项目方案(要获得关于二进制项目的更多信息,请参见在线帮助)。当您试图保存元数据并且将EAR作为源文件展开时会带来几种复杂性。例如,如果原始项目结构在一个项目中包含了多个源文件夹会怎样?导入不能决定哪些文件属于哪些源文件夹。有许多方式存在着局限性,这个问题可能会在另一个版本中解决,但或许这不是一个好的策略。人们已经把EAR导入/导出作为一种方便的交换格式,因为直到现在为止,还没有更好的共享项目的方法。然而,对于应用程序服务器,EAR文件是可部署的构件(artifact),并且在通常情况下,它不应该包括源代码和特定工具的元数据。 优点
缺点
方法4:导出ZIP文件
您已经了解了用于在开发人员之间共享项目的三种独立方法。使用存储库是最好的方法,但是有时,您可能需要与没有权利访问您的存储库的开发人员共享项目。您可以像上面所讲的那样共享整个工作区,但是这通常需要共享大量不必要的元数据。如果它是一个J2EE应用程序,您可以导出EAR文件,它比共享整个工作区好一些。但是如上所述,EAR导出没有保留具体项目结构。这给我们带来了第四种共享项目的方法--使用ZIP文件。 要开始用这种方法来共享项目,需要把一组项目导出到ZIP文件中:
如上所示,将项目导出到ZIP文件中是相当简单的。然而,将项目导入到目标工作区中却并不那么容易:
优点
缺点
方法5:使用项目交换ZIP文件
前面讨论的方法都没有提供一种好的机制,可以在不使用存储库的情况下轻松地进行消息共享。一种理想的项目共享方法应该是这样的:它不仅可以保存整个项目结构,包括元数据文件在内,与工作区共享方法中的一样;而且可以方便地计算整个应用程序所需的项目集,与导出EAR文件的方法中的一样。此外,使用一个动作就应该很容易地将项目导入到另一个工作区中,而不应该每个项目都需要几个动作,与导出ZIP文件的方法中的一样。 目前,在Eclipse或WebSphere Studio中并不存在这样的功能。因此,我们开发了项目交换(Project Interchange)功能,它为在一个步骤中共享项目集提供了新的导入和导出向导。在使用这个新的功能之前,您将需要把它添加到您的Eclipse或WebSphereStudio版本中。 安装项目交换功能
项目交换功能通过ZIP文件(它非常类似于前面导出的ZIP文件)来共享项目。然而,它为创建ZIP文件提供了更强大的Export向导。要导出相关的项目集,可以执行如下操作步骤:
现在,您有了所需项目的ZIP文件,与导出ZIP文件部分中的一样,只是您不需要知道所有的项目依赖性。要使用项目交换功能将这些项目导入另一个工作区中,可以执行如下操作步骤:
如上面步骤所示,使用新的项目交换功能共享项目是很简单的。然而,这个项目共享的方法也有一些缺点,并非对于所有情况都是最理想的。您可以通过使用存储库共享代码来避免这些缺点,项目交换方法并无意取代开发小组中共享项目的存储库。 优点
缺点
结束语
本文描述了五种在Eclipse或WebSphere Studio中共享项目的不同方法。对于需要具备版本控制和合并能力的开发小组而言,最好用存储库来共享项目。然而,您可能需要与没有权限访问您的存储库的开发人员共享项目,或者您不能使用存储库,在这些情况下,您可以使用其他四种方法。 共享整个工作区可能相当麻烦,并且它强制您选定整个新的工作区。如果您正使用WebSphere Studio,并且希望共享一个应用程序项目及其全部模块项目,那么您可能很想导出一个EAR文件,并且将它和它的内容导入另一个工作区。不过,带有元数据的EAR导出从来没有打算成为一种共享应用程序项目的方法,并且它将必定没有所期望的结果。一种更好的解决方案是把项目导出到ZIP文件中,然后把内容回导到工作区中,不过,导入需要您首先解压缩内容,然后一个一个地单独导入每个文件。 本文还描述了一种新的项目交换功能,它为不能使用存储库时共享项目提供了最好的方法。其简单性、易于使用和丰富的功能使这种方法成为一种优秀的共享项目的解决方案。 下载 作者简介<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td colspan="3"></td></tr><tr align="left" valign="top"><td>
Daniel Berg是位于美国北卡罗来纳州达勒姆美市的IBM Research Triangle Park Lab的一位软件工程师。他是WebSphere Studio Application Developer的J2EE工具的总设计师。您可以通过
danberg@us.ibm.com与Dan联系。
Ritchie Schacher是位于美国北卡罗来纳州达勒姆美市的IBM Research Triangle Park Lab的一位软件工程师。他是WebSphere Studio Application Developer的J2EE工具的开发人员。您可以通过
schacher@us.ibm.com与Ritchie联系。
<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>-data
启动参数启动工作台。在您使用此方法时,请务必在复制或压缩文件之前关闭工作台,因为即使工作台看起来像是空闲的,但是在后台线程中,元数据文件也可能正处在更新的过程中。
<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>
AuctionExample
,然后单击
Next按钮。
JAR auctionUtils.jar
展开在它自己的Java项目中,就好像它是在源工作区中一样。
xercers.jar
和
j2ee.jar
文件增加可视性。之所以需要这些变量,是为了编译
DOMClient
类中的代码。然而在导入时,此信息丢失了。不过,请注意,该Web项目编译了,而没有产生任何错误,因为导入操作能够从web-app中的
MANIFEST.MF
文件所指定的依赖性,派生出Java创建路径项目依赖性,如下所示:
</td></tr></table>
Manifest-Version: 1.0
Class-Path: AuctionRunV5EJB.jar
<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>
D:\temp\AuctionProjects.zip
):
D:\temp\AuctionProjects
)。
AuctionExample
)的位置(即步骤1中的临时位置):
AuctionExample
项目。
<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>
D:\temp\AuctionProjects2.zip
)。
D:\temp\AuctionProjects2.zip
)。项目列表将根据所选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 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>
</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%">
<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 开发工具