2010-01-14 11 views
50

estoy usando el plugin de maven-ensamblaje para crear un frasco de mi solicitud, incluyendo sus dependencias de la siguiente manera:Maven 2 con dependencias: Tarro en Ámbito del "sistema" no incluye

<assembly> 
    <id>macosx</id> 
    <formats> 
     <format>tar.gz</format> 
     <format>dir</format> 
    </formats> 
    <dependencySets> 
     <dependencySet> 
      <includes> 
       <include>*:jar</include> 
      </includes> 
      <outputDirectory>lib</outputDirectory> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

(omití alguna otra cosas que no están relacionadas con la pregunta)

Hasta ahora, esto ha funcionado bien porque crea un directorio lib con todas las dependencias. Sin embargo, recientemente agregué una nueva dependencia cuyo alcance es system, y no la copia en el directorio de salida lib. Debo estar perdiendo algo básico aquí, así que pido ayuda.

La dependencia que acabo añadido es:

<dependency> 
    <groupId>sourceforge.jchart2d</groupId> 
    <artifactId>jchart2d</artifactId> 
    <version>3.1.0</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/external/jchart2d-3.1.0.jar</systemPath> 
</dependency> 

La única forma que era capaz de incluir esta dependencia era mediante la adición de lo siguiente a la elemento de montaje:

<files> 
    <file> 
     <source>external/jchart2d-3.1.0.jar</source> 
     <outputDirectory>lib</outputDirectory> 
    </file> 
</files> 

Sin embargo, este fuerzas a mí para cambiar el pom y el archivo de ensamblaje cada vez que se cambia el nombre de este jar, si es que lo hace alguna vez. Además, parece simplemente incorrecto.

He intentado con <scope>runtime</scope> en el dependencySets y <include>sourceforge.jchart2d:jchart2d</include> sin tener suerte.

Entonces, ¿cómo se incluye un tarro de system scoped en su archivo de ensamblaje en maven 2?

Muchas gracias

+0

El alcance "runtime" no cambiaría el resultado, porque es el predeterminado. – khmarbaise

+0

¡Acabo de enviar jchart2d a Maven Central! http://sourceforge.net/news/?group_id=50440 - ¡disfrútalo! – halfdan

Respuesta

68

no me sorprende que las dependencias de alcance del sistema no se agregan (después de todo, las dependencias de alcance del sistema deben constar de forma explícita por definición). En realidad, si usted realmente no quiere poner esa dependencia en su repositorio local (por ejemplo, debido a que desea distribuir como parte de su proyecto), esto es lo que haría:

  • yo pondría la dependencia en un "repositorio de sistema de archivos" local al proyecto.
  • Me declaro que repositorio en mi pom.xml así:

    <repositories> 
        <repository> 
        <id>my</id> 
        <url>file://${basedir}/my-repo</url> 
        </repository> 
    </repositories> 
    
  • me acaba de declarar el artefacto sin que el alcance system, esto es sólo una fuente de problemas:

    <dependency> 
        <groupId>sourceforge.jchart2d</groupId> 
        <artifactId>jchart2d</artifactId> 
        <version>3.1.0</version> 
    </dependency> 
    

No estoy 100% seguro de que esto se adapte a sus necesidades, pero creo que es una solución mejor que usar el alcance del sistema.

Actualización: Debería haber mencionado eso en mi respuesta original y lo estoy arreglando ahora. Para instalar una biblioteca de terceros en el repositorio basado en archivos, utilizar install:install-file con el parámetro localRepositoryPath:

mvn install:install-file -Dfile=<path-to-file> \ 
         -DgroupId=<myGroup> \ 
         -DartifactId=<myArtifactId> \ 
         -Dversion=<myVersion> \ 
         -Dpackaging=<myPackaging> \ 
         -DlocalRepositoryPath=<path-to-my-repo> 

puede pegar esto como está en una cáscara * nix. En Windows, elimine "\" y coloque todo en una sola línea.

+0

Excelente idea, lo intentaré. – YuppieNetworking

+1

Funcionó, pero no fue una tarea trivial instalar el archivo en un repositorio local diferente de $ HOME/.m2/repository. Tuve que hacer una instalación de mvn: install-file [... install-file options ...] -Dmaven.repo.local = path_to_my_local_repo que obligó a maven a descargar sus complementos más básicos. ¿Podría sugerirnos cómo instalar archivos en este repositorio local? – YuppieNetworking

+0

Debería haber mencionado eso :) Hubiera instalado el artefacto en el repositorio local ('~ /.m2/repository') con 'install: install-file' y luego movió el árbol de directorios a' $ {basedir}/my-repo'. Solo eliminaría las cosas no deseadas de '$ {basedir}/my-repo' en tu caso. –

19

Por cierto, puede automatizarlo y hacer que forme parte de su construcción de maven. A continuación se instalará el frasco en su repositorio local antes de la compilación:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-install-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>hack-binary</id> 
        <phase>validate</phase> 
        <configuration> 
         <file>${basedir}/lib/your-lib.jar</file> 
         <repositoryLayout>default</repositoryLayout> 
         <groupId>your-group</groupId> 
         <artifactId>your-artifact</artifactId> 
         <version>0.1</version> 
         <packaging>jar</packaging> 
         <generatePom>true</generatePom> 
        </configuration> 
        <goals> 
         <goal>install-file</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
+0

¿No es compatible con la instalación de múltiples archivos a la vez? –

+0

¡Guau, esto es muy bonito! ¡Muchas gracias! @Tuukka Mustonen tiene que copiar la parte ... para cada archivo – timaschew

+5

Lamentablemente, esto no funciona. Llegué a esta solución también, pensando que parecía la más fácil, sin embargo, Maven requiere que todas las dependencias se resuelvan antes de ejecutar complementos enlazados a la fase 'validate' (que precede a' compile', etc ...). Por lo tanto, una vez que se instala el artefacto, se volverá a instalar, pero no hará una instalación inicial, es un problema de huevo/gallina. Uno podría vincular esto a la fase de 'limpieza' (ya que no requiere resolución de dependencia primero) y decirles a los desarrolladores que primero ejecuten 'mvn clean', pero luego ya no funciona usando los" procedimientos estándar "listos para usar. – Chadwick

14

encuentro solución fácil en caso de que la creación de tarro

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
    <configuration> 
    <webResources> 
    <resource> 
     <directory>dependencies/mydep</directory> 
     <targetPath>WEB-INF/lib</targetPath> 
     <filtering>true</filtering> 
     <includes> 
      <include>**/*.jar</include> 
     </includes> 
    </resource> 
    </webResources> 
</configuration> 
</plugin> 
+3

Esto es mucho más simple ... ¿Por qué agregar al repositorio local, etc.? –

+0

Esta es una forma rápida y sucia de hacer las cosas. Gracias. Una vez que el mundo todo estará en maven pero hasta entonces, esto nos salvará la vida. – Jacob

+0

En mi humilde opinión, sería más seguro con el filtrado: falso – ATorras

4

También puede manejar esto a través de la adición de un dependencySet suplementario en sus dependencySets.

<dependencySet> 
    <scope>system</scope> 
    <includes> 
    <include>*:jar</include> 
    </includes> 
    <outputDirectory>lib</outputDirectory> 
</dependencySet> 

Lo mejor sería utilizar un administrador de repositorio (como Nexus, Artifactory, Archiva) e instalar este tipo de dependencia en un repositorio en particular. Después de eso puedes usar cosas como una dependencia simple. Esto simplificará tu vida.

Docs: https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

1

Editado: Lo siento que no me daba cuenta ALX también mencionado acerca de la solución ciclo de vida limpia.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-install-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>hack-binary</id> 
      <phase>clean</phase> 
      <configuration> 
       <file>${basedir}/lib/your-lib.jar</file> 
       <repositoryLayout>default</repositoryLayout> 
       <groupId>your-group</groupId> 
       <artifactId>your-artifact</artifactId> 
       <version>0.1</version> 
       <packaging>jar</packaging> 
       <generatePom>true</generatePom> 
      </configuration> 
      <goals> 
       <goal>install-file</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Basándose en la solución proporcionada por alx, puede ejecutar el paso del archivo de instalación en fase limpia. pero dado que la fase de limpieza no está en el ciclo de vida predeterminado, debe ejecutar mvn clean la primera vez para asegurarse de que el contenedor esté listo en el repositorio local.

ex: mvn clean; mvn package

2

Una solución simple para esto es añadir que en el repositorio local de Maven

Una forma de hacerlo es a través de mvn instalar comandos como se sugiere en el post anterior.

Otra manera fácil es, 1) En su eclipse, haga clic derecho en el proyecto y seleccione la opción Maven. 2) Seleccione Instalar o implementar un artefacto en una opción de repositorio maven y haga clic en siguiente. 3) Haga clic en Examinar junto a la casilla de verificación archivo Artefacto & seleccionar el archivo jar 4) Introducir el GroupId y artifactId y la versión garantizar generar pom & crear suma de comprobación se comprueba & envase es frasco

Haga clic en el acabado, Wallah !! ! su trabajo está hecho, el jar se agrega en su repositorio local que puede definir en el directorio setting.xml o m2

Ahora solo agregue la dependencia maven simple según la versión de jar GroupId, ArtifactId & que ha ingresado según el importar y eso es todo, su mazo externo será empaquetado por maven.

+0

Gracias por la ayuda. Funcionó muy bien para mí y es definitivamente más fácil que las otras formas dadas aquí. Saludos :) –

Cuestiones relacionadas