Как я могу ссылаться на библиотеки в другом проекте в Eclipse Helios? - PullRequest
6 голосов
/ 11 ноября 2010

У нас проблема в том месте, где я работаю со ссылками на несколько проектов в нашем коде.По сути, у нас есть продукт, который я назову Левиафаном.Этот проект имеет целый ряд других версий, каждую из которых мы поддерживаем в Eclipse как отдельные проекты.Как разработчики, у нас обычно есть несколько проектов (несколько версий), открытых в Eclipse одновременно, так как мы получаем звонки по горячей линии о старых версиях (а также разрабатываем одновременно несколько версий).

У нас также есть тестовый код, который находится вотдельный проект для каждого распределения Левиафана.Я называю свои проекты 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>

Когда разработчик загружает тестовый проект в свое индивидуальное рабочее пространство Eclipse, ему / ей нужно будет связатьпроект в исходный проект Leviathan, перейдя в Preference-> Java Build Path-> Projects и добавьте проект Leviathan_scott.

Дело в том, что это, конечно, не меняет ни одну из <classpathentry ... > записей, которые ссылаются на «Левиафан \ lib».Итак, нам нужно сделать одну из двух вещей:

  1. Измените все ссылки с Leviathan на Leviathan_<branch name> в моем .classpath с помощью текстового редактора find / replace.
  2. Удалите все ссылки на Leviathan * .jar в Java Build Path и повторно добавьте jar в Leviathan_scott * .jar.

Проблема в том, что это нужно сделать каждый раз .classpath изменяется, что делает их обоих не идеальными.Наш путь к классам не меняется супер-регулярно, но я бы сказал, что он меняется один или два раза в две недели.Я хотел бы иметь возможность связать свой проект и выполнить только один шаг, чтобы связать эти проекты.

Похоже, мы могли бы установить переменную окружения в Eclipse и добавить ее в записи .classpath.Но теперь у нас есть проблема, потому что если у нас есть несколько тестовых проектов в нашей рабочей области, которые мы хотим скомпилировать, это не сработает.Оба элемента .classpath тестовых проектов будут ссылаться на одну и ту же переменную среды, которая, конечно, может указывать только на одно местоположение суперпроекта.

Кажется, я должен быть в состоянии сделать это, но я не знаю точно, как это сделать в Eclipse.Любые мысли будут с благодарностью.

~ Скотт

Ответы [ 3 ]

2 голосов
/ 11 ноября 2010

Попробуйте использовать Eclipse 'Classpath Variables'.

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

Определите одну или несколько переменных, например, «Leviathan_under_test», и укажите для нее версию, которую вы хотите протестировать.Затем в пути сборки проекта измените ссылку на библиотеку, включив в нее переменную.

Когда вы изменяете версию Левиафана, которую вы хотите проверить, вы меняете переменную и идете.При необходимости вы можете даже иметь несколько переменных для версий, которые проверяются чаще, например «LEVIATHAN_LATEST», ИЛИ «LEVIATHAN_PROBLEM_CHILD» и т. Д.

2 голосов
/ 11 ноября 2010

Это проблема управления зависимостями, и существует множество стандартных инструментов, которые могут вам помочь!Я настоятельно рекомендую вам использовать ANT с Ivy's Управление зависимостями или использовать Maven (или любой другой инструмент сборки, имеющий управление зависимостями).любой из тех, кого я бы использовал для работы с хранилищем артефактов, например Nexus или Artifactory, так что у вас есть единственный истинный источник для ваших встроенных артефактов.иметь каноническую версию библиотеки, которую вы хотите, когда вы хотите.

1 голос
/ 11 ноября 2010

Если вы не хотите использовать внешние инструменты для управления различными проектными зависимостями, попробуйте перейти к одному свойству пути сборки Build проектов Leviathan на вкладке «Порядок и экспорт» и проверить библиотеки, необходимые для запуска тестов.,таким образом вам не нужно импортировать библиотеки в тестовом проекте, и, переключая тестируемый проект, вы автоматически обновляете библиотеки

...