2010-11-11 15 views
5

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:

  1. cambiar todas las referencias de Leviathan a Leviathan_<branch name> en mi .classpath utilizando un editor de texto buscar/reemplazar.
  2. 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

+0

Apache Maven soluciona este tipo de problemas como un amuleto. –

+0

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

Respuesta

2

Pruebe usar las 'Variables de clase de Eclipse'.

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

definir una o más variables como "Leviathan_under_test" y el punto a la versión que desea probar. Luego, en la ruta de compilación del proyecto, cambie la referencia de la biblioteca para incluir la variable.

Cuando cambie la versión de Leviathan que desea probar, cambie la variable y vaya. Si es necesario, incluso puede tener múltiples variables para versiones que se prueban con mayor frecuencia, es decir, "LEVIATHAN_LATEST", O "LEVIATHAN_PROBLEM_CHILD", etc.

+0

Bueno, esto es lo que quise decir cuando hablé sobre variables de entorno. Entonces, el problema aquí es que aún tengo que cambiar la ruta de compilación; si, por ejemplo, quisiera descargar Test_10.0 y Test_scott, y hacer que se compilen en el mismo espacio de trabajo, necesitaría cambiar la variable en el archivo .classpath en al menos uno de los dos proyectos de prueba. Idealmente, nos gustaría evitar esto, porque en realidad no es mejor que lo que tenemos en este momento, tener que cambiar Leviathan a Leviathan_scott o algo similar. – jwir3

+0

En realidad, una vez que la variable está en el archivo .classpath, no la cambia; al menos en el caso de $ LEVIATHAN por ejemplo. La compilación funciona con el valor de la variable classpath que ha establecido en su espacio de trabajo. Puede apuntarlo a un objetivo diferente sin tener que editar archivos en su proyecto. –

+0

Bueno, no del todo. ¿Cómo resolvería el problema donde tengo Leviathan_10.0, Leviathan_Test_10, Leviathan_scott y Leviathan_test_scott en mi espacio de trabajo, todos abiertos al mismo tiempo, y quiero que Leviathan_test_scott apunte a Leviathan_scott y Leviathan_test_10 para apuntar a Leviathan_10.0? – jwir3

2

Se trata de un problema de gestión de la dependencia y hay un montón de herramientas estándar de facto para ayudar! Le sugiero que utilice ANT con Ivy's Gestión de dependencias o use Maven (o cualquier otra herramienta de compilación que tenga administración de dependencias).

Con cualquiera de esos usaría un maanger de repositorio de artefactos como Nexus o Artifactory también, por lo que tiene la única fuente verdadera para sus artefactos construidos internamente.

De esta manera, siempre tendrá la versión canónica de la biblioteca que desee, cuando lo desee.

1

Si no desea utilizar herramientas externas para gestionar las diversas dependencias de proyectos, puede intentar ir a la propiedad de ruta de compilación única de Leviathan projects, en la pestaña Order and Export, y comprobar las bibliotecas que necesita para ejecutar su pruebas. de esta manera no necesita importar las bibliotecas en el proyecto de prueba y al cambiar el proyecto bajo prueba actualiza automáticamente las bibliotecas

+0

Hm ... esto parece prometedor. Entonces, ¿está diciendo que en lugar de importar todas las bibliotecas por separado dentro de un proyecto de prueba, exportarlas desde el proyecto leviathan original, entonces todo lo que tengo que hacer es importar el proyecto Leviathan al proyecto de prueba? – jwir3

+0

sí, esto debería funcionar – pbanfi

Cuestiones relacionadas