Exclusion des dépendances" fournies " de Maven assembly

j'essaie d'utiliser le plugin Maven assembly pour construire un jar-with-dependencies,sauf ceux qui ont fourni la portée.

j'ai copié les jar-with-dependencies dans une assemblée.fichier xml et configuré son utilisation dans mon pompon. Ici, c'est pour référence:

<?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>

j'ai découvert, que si je mets la portée à provided, alors je peux construire un pot qui contient exactement ce que je ne pas vouloir, mais je ne peux pas trouver comment obtenir inverse le comportement de cette.

22
demandé sur Chris Vest 2009-09-22 13:21:26

4 réponses

C'est un peu grotesque, mais vous pouvez utiliser le plugin Maven-dependency-plugin pour copier/déballer toutes les dépendances dans votre projet, puis utiliser le plugin assembly pour faire l'empaquetage.

copy-dependencies et unpack-dependencies les deux buts ont un excludeScope propriété que vous pouvez définir pour omettre l' provided dépendances. La configuration ci-dessous copie toutes les dépendances dans target/lib, votre descripteur de plugin d'assemblage peut être modifié pour utiliser un fileSet pour inclure ces pots.

mise à jour: vient de tester ceci pour confirmer que cela fonctionne. Ajouté la configuration pour lier le plugin d'assemblage à la phase paquet, et les modifications pertinentes au descripteur d'assemblage.

<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 section fileSet de la my-assembly le descripteur ressemblerait à ceci:

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

</assembly>
18
répondu Rich Seller 2009-09-22 12:11:24

en théorie les tags "ignoreNonCompile" et "exclusidescope" devraient aider, mais être avertis qu'ils ne fonctionnent pas nécessairement correctement.

avec maven3 et le maven-dependency-plugin 2.4, une solution est:

<configuration>
<excludeArtifactIds>junit,mockito-all</excludeArtifactIds>
<excludeTransitive>true</excludeTransitive>
</configuration>
4
répondu lourencoccc 2012-08-08 08:56:56

Avec la dernière Maven (j'ai été le tester sur Maven 3.0) cela semble fonctionner comme prévu, avec quelques mises en garde:

la portée demandée (dans l'ensemble de dépendances) peut inclure des portées supplémentaires basées sur la définition suivante: http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope

ainsi, si vous demandez la compilation scope, vous obtiendrez à la fois la compilation et la fourniture. Cependant, si vous demandez runtime scope, vous devez obtenez la compilation et l'exécution (mais pas fourni).

0
répondu jeckhart 2011-02-04 00:06:24

C'est un ancien post, mais le maven-dependency-plugin a maintenant une option "exclusidescope" que vous pouvez définir à "provided" ou n'importe quelle portée dont vous avez besoin.

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

Par exemple,

<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>
0
répondu Lindsay Thurmond 2016-10-21 12:41:53