2009-09-22 16 views
20

Estoy intentando utilizar el complemento de ensamblaje de Maven para compilar un jar-with-depencies, excepto que han proporcionado alcance.Excluyendo dependencias "proporcionadas" del ensamblaje de Maven

He copiado las jar-with-dependencias en un archivo assembly.xml y he configurado su uso en mi pom. Aquí es para referencia:

<?xml version="1.0" encoding="UTF-8"?> 
<assembly> 
    <id>injectable-jar</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <scope>runtime</scope> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.outputDirectory}</directory> 
    </fileSet> 
    </fileSets> 
</assembly> 

he descubierto, que si fijo el alcance de provided, entonces yo puedo construir un frasco que contiene exactamente lo que No quieren, pero no puedo averiguar cómo comportarse de manera inversa.

+0

Qué contiene el archivo JAR con el conjunto que se muestra como ejemplo? ¿Contiene solo las dependencias de tiempo de ejecución? – romaintaz

+0

Parece que contiene todo menos las dependencias del 'test'-scope. –

+0

No, también tiene dependencias de 'prueba'. ¿De qué manera puede ser eso un defecto lógico, me pregunto? –

Respuesta

17

Esto es un poco torpe, pero puede usar maven-dependency-plugin para copiar/descomprimir todas las dependencias en su proyecto, luego use el plugin de ensamblaje para hacer el empaquetado.

Los objetivos copy-dependencies y unpack-dependencies tienen una propiedad opcional excludeScope que puede establecer para omitir las dependencias provided. La siguiente configuración copia todas las dependencias en target/lib, su descriptor de complemento de ensamblaje puede modificarse para usar un fileSet para incluir esos archivos jar.

Actualización: Acabo de probar esto para confirmar que funciona. Se agregó la configuración para vincular el complemento de ensamblaje a la fase del paquete y las modificaciones relevantes al descriptor de ensamblaje.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
    <execution> 
     <id>copy-dependencies</id> 
     <phase>process-resources</phase> 
     <goals> 
     <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
     <excludeScope>provided</excludeScope> 
     <outputDirectory>${project.build.directory}/lib</outputDirectory> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2-beta-4</version> 
    <executions> 
    <execution> 
     <id>jar-with-deps</id> 
     <phase>package</phase> 
     <goals> 
     <goal>single</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <descriptors> 
     <descriptor>src/main/assembly/my-assembly.xml</descriptor> 
    </descriptors> 
    </configuration> 
</plugin> 

La sección de catálogo de archivos del descriptor my-assembly se vería así:

<assembly> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.directory}/lib</directory> 
     <outputDirectory>/</outputDirectory> 
     <includes> 
     <include>*.*</include> 
     </includes> 
    </fileSet> 
    </fileSets> 
... 

</assembly> 
+1

No puedo encontrar la manera de excluir la dependencia de "prueba" que tengo, pero aparte de eso, funciona perfectamente. :) –

+0

esto es incluso más complicado, pero si necesita excluir el alcance de la prueba, puede definir varias ejecuciones del complemento de dependencia, y en cada ejecución especificar un alcance diferente para ser incluido (es decir, omitir prueba y proporcionar, definir dos ejecuciones , uno para cada compilación y runtime) –

+14

Resulta que una ejecución es suficiente. ' runtime' es todo lo que necesito, implícitamente excluye 'test',' provided' y 'system', que es perfecto. –

0

Con la última Maven (I estaba probando en Maven 3.0) esto parece funcionar como se esperaba, con algunas salvedades:

el alcance solicitado (en el dependencySet) puede incluir alcances adicionales basados ​​en la siguiente definición: http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope

Por lo tanto, si solicita el ámbito de compilación, obtendrá tanto compilación como provisión. Sin embargo, si solicita el alcance del tiempo de ejecución, debe obtener compilación y tiempo de ejecución (pero no provisto).

+0

¿Esta función excluiría correctamente la dependencia proporcionada si también pertenece a dependencias transitivas en tiempo de ejecución al mismo tiempo? – Vadzim

4

En teoría, las etiquetas "ignoreNonCompile" y "excludeScope" deberían ayudar, pero tenga en cuenta que no necesariamente funcionan correctamente.

Con maven3 y el maven-dependencia-plugin 2.4, una solución es:

<configuration> 
<excludeArtifactIds>junit,mockito-all</excludeArtifactIds> 
<excludeTransitive>true</excludeTransitive> 
</configuration> 
0

Esta es una entrada antigua, pero el experto-dependencia-plugin ahora tiene una opción "excludeScope" que se puede establecer a "provisto" o cualquier alcance que necesite.

http://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html#excludeScope

Por ejemplo,

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.10</version> 
    <executions> 
     <execution> 
      <id>copy-dependencies</id> 
      <phase>prepare-package</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${project.build.directory}/lib</outputDirectory> 
       <overWriteReleases>false</overWriteReleases> 
       <overWriteSnapshots>false</overWriteSnapshots> 
       <overWriteIfNewer>true</overWriteIfNewer> 
       <excludeScope>provided</excludeScope> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
Cuestiones relacionadas