Tenemos un problema en el lugar donde trabajo al hacer referencia a varios proyectos en nuestro código. Básicamente, tenemos un producto que llamaré Leviatán. Este proyecto tiene bastantes otras versiones, cada una de las cuales mantenemos como proyectos separados en Eclipse. Como desarrolladores, generalmente tenemos múltiples proyectos (múltiples versiones) abiertos en Eclipse simultáneamente, a medida que recibimos llamadas de la línea de ayuda sobre versiones anteriores (y también desarrollamos simultáneamente varias versiones).¿Cómo puedo hacer referencia a las bibliotecas en otro proyecto dentro de Eclipse Helios?
También tenemos código de prueba, que se encuentra en un proyecto diferente para cada distribución de Leviathan. Nombro mis proyectos Leviathan_<branch name>
. Así, por ejemplo, en mi espacio de trabajo de Eclipse, que podría tener proyectos como:
Leviathan_scott\ (my branch) Leviathan_9.2\ Leviathan_9.3\ Leviathan_10.0\ Leviathan_10.1\ Test_scott\ Test_10.0
Mi rama es una copia de nuestro tronco, por lo que podemos considerar que la línea de desarrollo más activo.
El problema es que hacemos referencia a algunas bibliotecas en Leviathan \ lib en nuestro código de prueba. Cada desarrollador puede nombrar sus proyectos de forma ligeramente diferente. Entonces, al desarrollar el .classpath del proyecto de prueba, hacemos referencia al proyecto Leviathan \ (sin adiciones). La ruta de clases para este proyecto (que se registró en nuestro sistema de control de código fuente) podría ser:
<?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>
Cuando un desarrollador carga el proyecto de prueba en su/su persona espacio de trabajo de Eclipse, él/ella tendría que vincular el proyecto al proyecto Leviathan original yendo a Preferencia-> Ruta de creación de Java-> Proyectos y agregue el proyecto Leviathan_scott.
El hecho es que esto, por supuesto, no cambia ninguna de las entradas <classpathentry ... >
que hacen referencia a "Leviathan \ lib". Por lo tanto, tenemos que hacer una de dos cosas:
- cambiar todas las referencias de
Leviathan
aLeviathan_<branch name>
en mi .classpath utilizando un editor de texto buscar/reemplazar. - Elimine todas las referencias a Leviathan * .jar en Java Build Path y vuelva a agregar las jarras en Leviathan_scott * .jar.
El problema con ellos es que hay que hacer cada vez que se cambia el .classpath, lo que hace que ambos parecen menos que ideal. Nuestro classpath no se cambia súper regularmente, pero yo diría que ha cambiado una o dos veces cada dos semanas. Me gustaría poder vincular mi proyecto y tener que realizar solo un paso para vincular estos proyectos.
Parece que podríamos configurar una variable de entorno dentro de Eclipse y agregar esto en las entradas de .classpath. Pero ahora tenemos un problema porque si tenemos varios proyectos de prueba en nuestro área de trabajo que queremos compilar, esto no funcionará. Ambas entradas de .classpath de los proyectos de prueba se referirán a la misma variable de entorno, que por supuesto solo puede apuntar a una ubicación de súper proyecto.
Parece que debería ser capaz de hacer esto, pero no sé exactamente cómo lograrlo en Eclipse. Cualquier pensamiento sería muy apreciado.
~ Scott
Apache Maven soluciona este tipo de problemas como un amuleto. –
De acuerdo, pero es difícil conseguir que 20 desarrolladores cambien a un nuevo sistema de compilación ... Si tenemos que * absolutamente * tener que hacerlo, puedo defenderlo, pero si es posible prescindir de esto, entonces Me gustaría lograrlo de esa manera. – jwir3