如何在Eclipse Helios中的另一个项目中引用库?

时间:2010-11-11 16:24:01

标签: java eclipse jar libraries

我在代码中引用多个项目的地方遇到问题。基本上,我们有一个产品,我称之为Leviathan。这个项目有很多其他版本,我们在Eclipse中作为单独的项目维护。作为开发人员,我们通常在Eclipse中同时打开多个项目(多个版本),因为我们获得了有关旧版本的帮助热线调用(以及同时开发多个版本)。

我们还有测试代码,这是针对Leviathan的每个发行版的不同项目。我将我的项目命名为Leviathan_<branch name>。因此,例如,在我的Eclipse工作区中,我可能会有以下项目:

Leviathan_scott\ (my branch)
Leviathan_9.2\
Leviathan_9.3\
Leviathan_10.0\
Leviathan_10.1\
Test_scott\
Test_10.0

我的分支是我们主干的副本,因此我们可以考虑最活跃的开发线。

问题是我们在测试代码中引用了Leviathan \ lib中的一些库。每个开发人员可能会略微区别他们的项目因此,在开发测试项目的.classpath时,我们引用了项目Leviathan \(没有添加)。此项目的类路径(在我们的源代码管理系统中检查)可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry excluding="**/*.MySCMServerInfo" kind="src" path="src"/>
    <classpathentry kind="lib" path="lib/abbot-1.0.2/abbot.jar"/>
    <classpathentry kind="lib" path="lib/abbot-1.0.2/costello.jar"/>
    <classpathentry kind="lib" path="lib/dbunit-2.4.8/dbunit-2.4.8.jar"/>
    <classpathentry kind="lib" path="lib/easymock-3.0/easymock-3.0.jar" sourcepath="lib/easymock-3.0/easymock-3.0-sources.jar">
        <attributes>
            <attribute name="javadoc_location" value="jar:platform:/resource/Test/lib/easymock-3.0/easymock-3.0-javadoc.jar!/"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="lib" path="lib/objenesis-1.2/objenesis-1.2.jar"/>
    <classpathentry kind="lib" path="lib/privilegedAccessor-1.0.2/privilegedAccessor_1.0.2.jar"/>
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-core/unitils-core-3.1.jar" sourcepath="lib/unitils-3.1/unitils-core/src"/>
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-database/unitils-database-3.1.jar"/>
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-dbmaintainer/unitils-dbmaintainer-3.1.jar"/>
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-dbunit/unitils-dbunit-3.1.jar" sourcepath="lib/unitils-3.1/unitils-dbunit/src"/>
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-inject/unitils-inject-3.1.jar"/>
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-mock/unitils-mock-3.1.jar" sourcepath="lib/unitils-3.1/unitils-mock/src"/>
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-orm/unitils-orm-3.1.jar"/>
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-spring/unitils-spring-3.1.jar" sourcepath="lib/unitils-3.1/unitils-spring/src"/>
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-testng/unitils-testng-3.1.jar" sourcepath="lib/unitils-3.1/unitils-testng/src"/>
    <classpathentry kind="lib" path="data"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="lib" path="lib/unitils-3.1/unitils-core/lib/ognl-2.6.9.jar"/>
    <classpathentry kind="lib" path="lib/testng-5.14.1/testng-5.14.1.jar" sourcepath="lib/testng-5.14.1/testng-5.14.1-src.zip"/>
    <classpathentry combineaccessrules="false" kind="src" path="/Leviathan"/>
    <classpathentry kind="lib" path="/Leviathan/lib/slf4j-api-1.6.1.jar"/>
    <classpathentry kind="lib" path="/Leviathan/lib/hibernate3.jar" sourcepath="/Leviathan/lib/src/hibernate-3.6.0-src.zip"/>
    <classpathentry kind="output" path="classes"/>
</classpath>

当开发人员将Test项目加载到他/她的个人Eclipse工作区时,他/她需要通过转到Preference-&gt; Java Build Path-&gt; Projects并添加Leviathan_scott将项目链接到原始的Leviathan项目。项目。

问题是,这当然不会改变任何引用“Leviathan \ lib”的<classpathentry ... >条目。所以,我们必须做两件事之一:

  1. 使用文本编辑器查找/替换,将.classpath中的所有引用从Leviathan更改为Leviathan_<branch name>
  2. 删除Java Build Path中对Leviathan * .jar的所有引用,并在Leviathan_scott * .jar中重新添加jar。
  3. 这些问题是每次更改.classpath时都需要完成,这使得这两者看起来都不太理想。我们的课程路径不会经常更改,但我会说它每两周更换一次或两次。我希望能够链接我的项目,并且必须只执行一个步骤才能链接这些项目。

    似乎我们可以在Eclipse中设置一个环境变量并将其添加到.classpath条目中。但是,现在我们遇到了一个问题,因为如果我们想要编译的工作空间中有多个Test项目,那么这将无法工作。两个测试项目的.classpath条目都将引用相同的环境变量,当然这只能指向一个超级项目位置。

    似乎我应该能够做到这一点,但我不知道如何在Eclipse中完成它。任何想法将不胜感激。

    〜斯科特

3 个答案:

答案 0 :(得分:2)

这是一个依赖管理问题,有许多事实上的标准工具可以提供帮助!我强烈建议您使用ANT Ivy's依赖管理或使用Maven(或任何具有依赖关系管理的工具构建工具)。

使用其中任何一个我都会使用工件存储库maanger,例如Nexus或Artifactory,所以你有一个真正的内部构建工件源。

通过这种方式,您可以随时拥有所需的库的规范版本。

答案 1 :(得分:2)

尝试使用Eclipse的'Classpath Variables'。

Window->Preferences->Java->Build Path->Classpath Variables

定义一个或多个变量,如“Leviathan_under_test”,并将其指向您要测试的版本。然后,在项目构建路径中,更改库引用以包含变量。

当您更改要测试的Leviathan版本时,您可以更改变量并继续。如果必须,您甚至可以为经常测试的版本提供多个变量,即“LEVIATHAN_LATEST”或“LEVIATHAN_PROBLEM_CHILD”等。

答案 2 :(得分:1)

如果您不想使用外部工具来管理各种项目依赖项,您可以尝试转到单个Leviathan项目构建路径属性,在Order and Export选项卡中,并检查运行测试所需的库。 通过这种方式,您无需在测试项目中导入库,并且通过切换测试项目,您可以自动更新库