2010-07-19 28 views
5

Estoy intentando compilar mi aplicación utilizando maven y eclipse. Tengo dependencias en jarras de terceros que están en mi máquina local. aquí es mi pom.xmlLos archivos jar locales no están incluidos en la ruta de clase (`<scope> sistema</scope>`)

<dependency> 
    <groupId>sourceforge.net</groupId> 
    <artifactId>zipdiff</artifactId> 
    <version>0.4</version> 
    <scope>system</scope> 
    <systemPath>C:/gelcap/lib/zipdiff-0.4.jar</systemPath> 
</dependency> 

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.11</version> 
</dependency> 

cuando corro mvn: instalarlo crea archivo de la guerra para mi proyecto. Pero el problema es que no incluye el archivo zipdiff.jar en la carpeta web-inf/lib, solo incluye los archivos que se descargan. También necesito incluir los archivos de mi sistema local pero maven los ignora. No tengo ni idea de por qué está sucediendo por qué maven no incluye archivos con alcance de sistema en mi archivo war. Por favor, dame alguna idea de cómo se puede resolver este problema. Gracias de antemano

Respuesta

7

Con el alcance de "sistema", se espera que el contenedor proporcione el artefacto. Desde el maven docs:

proporcionan

Esto es muy parecido compilación, pero indica que espera el JDK o un recipiente para proporcionar la dependencia en tiempo de ejecución. Por ejemplo, en la construcción de una aplicación web para el Java Enterprise Edition, se debe establecer la dependencia en la API de Servlet y relacionados con las API de Java EE en el alcance proporcionado porque el contenedor web proporciona esas clases. Este alcance es solo disponible en la compilación y test class , y no es transitivo.

[...]

sistema

Este ámbito es similar al de siempre, excepto que usted tiene que proporcionar al JAR que lo contiene explícitamente. El artefacto siempre está disponible y no se busca en un repositorio .

Al usar un alcance de sistema, indica al plugin de guerra que el contenedor proporcionará esta dependencia. Como esto no es lo que pretendes hacer, la solución más simple es colocar el artefacto en un repositorio, ya sea tu repositorio maven local o tu propio repositorio maven en tu intranet, si tienes uno.

El objetivo install:install-file se puede utilizar para instalar un único archivo (sin POM) en su repositorio local. Después de hacer esto, cambie el tipo de dependencia a "compilar" y elimine el elemento "systemPath".

En mi trabajo diario, utilizamos Nexus para administrar un repositorio de toda la empresa en nuestra intranet. Puede tener repositorios separados para sus propios artefactos, frente a artefactos de terceros. Nexus también actúa como proxy, almacenando artefactos en caché de repositorios externos, lo que acelera la construcción bastante. Esto significa que solo el desarrollador que usa una nueva dependencia que no está disponible en los demás reposs tiene que cargar, luego de eso, todos los demás desarrolladores pueden usarla, pueden realizar el pago desde SCM y compilar sin preocuparse de dónde se encuentran las dependencias.

+0

+1 para Nexus y otro +1 virtual para el consejo de solo crear artefactos para las bibliotecas (con nexus puede hacerlo desde la interfaz web, así que recomendaría un nexo incluso para un entorno local de usuario único) –

0

Sólo una cosa que me llamó la atención: En la ruta de acceso está utilizando las barras de estilo de unix normales /. Windows usa barras diagonales inversas para las rutas:. No sé si es experto es capaz de convertir los unos con otros, así que tal vez tratar de entrar en el camino de la siguiente manera:

C: \ cápsula de gel \ lib \ zipdiff-0.4.jar

+0

Nops no hizo la diferencia – viren

1

Pruebe installing the jars to your local repository. Que cuando es tiempo de compilación no debería haber una diferencia entre tus jar y jars locales en los repositorios mayores.

+0

Hola Allain, instalé mi archivo jar en el repositorio maven local pero cuando ejecuto el maven objetivo: instale el eclipse de formulario pero todavía no copió el archivo jar a la carpeta web-inf/lib. Hice los siguientes pasos: 1. Ejecute el siguiente comando mvn install: install-file -DgroupId = sourceforge.net -DadifactId = zipdiff -Dversion = 0.4 -Dfile = C: /gelcap/lib/zipdiff-0.4.jar - Dpackaging = jar -DgeneratePom = true Creó una carpeta para el archivo jar zipdiff en el repositorio local de maven. Luego ejecuta maven: install from eclipse. BUt todavía creado war no tiene archivo zipdiff.jar – viren

+0

También tiene que cambiar su archivo pom y eliminar el alcance de la dependencia. Maven debería sacar la dependencia del repositorio e incluirlo en la guerra. – Cliff

+0

Sí funciona esto Gracias allain – viren

-1

Al no haber probado este antes, por lo que puede no funcionar, ¿puede cambiar el alcance para compilar?

<dependency> 
    <groupId>sourceforge.net</groupId> 
    <artifactId>zipdiff</artifactId> 
    <version>0.4</version> 
    <scope>compile</scope> 
    <systemPath>C:/gelcap/lib/zipdiff-0.4.jar</systemPath> 
</dependency> 
+1

Hola Chris, FYI No se puede usar la ruta del sistema con compile scope para – viren

+0

cool, no sabía que –

6

no tengo ningún pensamiento por qué está sucediendo qué experto no está incluyendo archivos con el alcance del sistema a mi archivo de la guerra. Por favor, dame alguna idea de cómo se puede resolver este problema.

Esto es por diseño, se supone system dependencias de ámbito de proporcionarse como documented.

En realidad, he escrito en numerosas ocasiones (here, here, here y here) que system dependencias de ámbito debe ser evitado. En la mayoría de los casos, son una mala práctica, las personas abusan de ellos y generan casi siempre más problemas que beneficios.

Permítanme citar el Dependency Scopes mini-guía si quieres un punto de "oficial" de vista:

  • system: Se requiere esta dependencia en alguna fase del ciclo de vida del proyecto, pero es sistema- específico. Se desaconseja el uso de este alcance: se considera un tipo de función "avanzada" y solo se debe utilizar cuando se entienden todas las ramificaciones de su uso, que puede ser extremadamente difícil si no imposible de cuantificar. Este alcance, por definición, hace que su compilación no sea portátil. Puede ser necesario en ciertos casos de borde. El alcance del sistema incluye el elemento <systemPath> que apunta a la ubicación física de esta dependencia en la máquina local. Por lo tanto, se usa para referirse a algún artefacto que se espera que esté presente en la máquina local dada y no en un repositorio; y cuya ruta puede variar de máquina a máquina. El elemento systemPath puede hacer referencia a variables de entorno en su ruta: ${JAVA_HOME}, por ejemplo.

Así, en lugar de utilizar el system alcance, ya sea:

  • añaden sus bibliotecas a su repositorio local a través de install:install-file. Esta es una manera rápida y sucia de hacer que las cosas funcionen, podría ser una opción si estás solo pero hace que tu compilación no sea portátil.
  • Instale y ejecute un "repositorio empresarial" como Nexus, Archiva o Artifactory y agregue sus bibliotecas a través del deploy:deploy-file. Este es el escenario Ideal.
  • Configure un repositorio basado en archivos como se describe en this previous answer y coloque sus bibliotecas allí. Este es el mejor compromiso si no tiene un repositorio corporativo pero necesita trabajar en equipo y no quiere sacrificar la portabilidad.

Por favor, deje de usar el alcance system.

Cuestiones relacionadas