我在代码中引用多个项目的地方遇到问题。基本上,我们有一个产品,我称之为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 ... >
条目。所以,我们必须做两件事之一:
Leviathan
更改为Leviathan_<branch name>
。这些问题是每次更改.classpath时都需要完成,这使得这两者看起来都不太理想。我们的课程路径不会经常更改,但我会说它每两周更换一次或两次。我希望能够链接我的项目,并且必须只执行一个步骤才能链接这些项目。
似乎我们可以在Eclipse中设置一个环境变量并将其添加到.classpath条目中。但是,现在我们遇到了一个问题,因为如果我们想要编译的工作空间中有多个Test项目,那么这将无法工作。两个测试项目的.classpath条目都将引用相同的环境变量,当然这只能指向一个超级项目位置。
似乎我应该能够做到这一点,但我不知道如何在Eclipse中完成它。任何想法将不胜感激。
〜斯科特
答案 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选项卡中,并检查运行测试所需的库。 通过这种方式,您无需在测试项目中导入库,并且通过切换测试项目,您可以自动更新库