2009-09-09 10 views
1

Mon projet utilise plusieurs assemblages, donc je ne m'intéresse qu'aux assemblages. Lors de l'exécution de mvn install en dehors des assemblys, j'obtiens le package .jar par défaut. Comment puis-je éviter cela?Maven-2: éviter l'emballage par défaut?


J'ai un fichier pom.xml similaire à celui que vous avez fourni. sur l'exécution mvn install, je reçois App1.jar, App2.jar et pot instantané contenant tout le contenu

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.2-beta-2</version> 
      <executions> 
       <execution> 
        <id>assemblyone</id> 
        <phase>compile</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
        <configuration> 
         <finalName>App1</finalName> 
         <appendAssemblyId>false</appendAssemblyId> 
         <descriptors> 
          <descriptor>${basedir}/src/main/resources/assemblies/report.xml</descriptor> 
         </descriptors> 
        </configuration> 
       </execution> 
       <execution> 
        <id>assemblytwo</id> 
        <phase>compile</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
        <configuration> 
         <finalName>App2</finalName> 
         <appendAssemblyId>false</appendAssemblyId> 
         <descriptors> 
          <descriptor>${basedir}/src/main/resources/assemblies/src.xml</descriptor> 
         </descriptors> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

Comment puis-je éviter ce cliché pot (pas sûr du terme exact) et faire en sorte que seulement les assemblées sont créées?

Répondre

2

Je peux lire votre question de deux façons, j'ai souligné les réponses ci-dessous. Si aucun n'est correct, pouvez-vous modifier votre question avec un peu plus d'explications s'il vous plaît.

1) Voulez-vous dire que vous avez un projet avec un emballage par défaut (jar), et que vous voulez éviter la création du pot quand aucun assemblage n'est défini? Si tel est le cas, quel est le résultat de la construction si aucun assemblage n'est défini?

2) Voulez-vous dire à la place que vous exécutez mvn assembly: assembly pour générer l'assembly et que vous voulez savoir comment obtenir cet assembly lors de l'exécution de l'objectif d'installation?


Pour l'option 2, vous pouvez lier le module d'assemblage à une phase du cycle de vie pour vous assurer qu'il est toujours exécuté, si vous spécifiez que <appendAssemblyId> doit être faux, l'assemblée remplacera le pot par défaut.

Par exemple, cette configuration invoquera le plug-in d'assemblage pendant la phase d'emballage et de remplacer le pot par défaut:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2-beta-2</version> 
    <executions> 
    <execution> 
     <phase>package</phase> 
     <goals> 
     <goal>single</goal> 
     </goals> 
     <configuration> 
     <appendAssemblyId>false</appendAssemblyId> 
     <descriptors> 
      <descriptor>src/main/assembly/archive.xml</descriptor> 
     </descriptors> 
     </configuration> 
    </execution> 
    </executions> 
</plugin>  

Pour l'option 1, cela est en fait assez difficile à faire. Le mieux que je peux penser est de spécifier que le projet a empaquetage de pom et configurer le projet avec les exécutions normalement liées au cycle de vie de pot dans un profile. Les liaisons de cycle de vie que vous devez configurer sont listées dans le introduction to the build lifecycle

0

Je ne suis pas sûr que vous puissiez vraiment le faire d'une manière très simple.

Une solution est d'appeler le plug-in clean une fois que la construction est réalisée, en faisant cela:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-clean-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>auto-clean</id> 
        <phase>package</phase> 
        <goals> 
         <goal>clean</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    ... 
</build> 

De cette façon, le JAR créé dans le répertoire target/ seront supprimés à la fin de l'exécution Maven2.

Cependant, vous devrez définir un autre répertoire pour stocker les assemblages créés par Maven2. Dans le cas contraire, il sera supprimé par l'appel du plugin clean ... Si vous voulez les stocker dans le répertoire assemblies-target/, vous pouvez l'ajouter dans le fichier pom.xml:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2-beta-4</version> 
    <configuration> 
     ... 
     <!-- Copy the ZIP in target/ of the ROOT directory. --> 
     <outputDirectory>assemblies-target</outputDirectory> 
    </configuration> 
    ... 
0

je pense que ce serait beaucoup plus clair si vous nous avez montré votre POM entière et les artefacts qui sont en cours de construction. Je ne peux que deviner quel est le problème parce que votre terminologie n'est pas ce que je connais.C'est ma conjecture quant au problème: vous avez un POM configuré pour générer deux JAR d'assemblage, mais vous obtenez un troisième JAR pour le POM lui-même. En d'autres termes, si artefact de votre POM est MyApp, vous obtenez un MyApp-1.0.0.jar ou similaire en plus des deux JAR que vous voulez réellement.

Si tel est le cas, le problème se résume à ce que vous utilisez Maven pour créer plusieurs artefacts à partir d'un seul module. Maven est conçu pour produire un seul artefact primaire de chaque module. Ce que je ferais est de changer votre POM pour avoir un type d'empaquetage de "pom" et lui donner deux modules dans une section <modules> nommée App1 et App2. Créez des sous-répertoires sous votre module, un pour chaque application. Donnez-leur chacun un POM configuré pour un seul assemblage, avec un type d'empaquetage de "pot". Déplacez le code/les fichiers/etc. comme il convient dans chaque sous-module, il n'y en a plus dans le module parent. Avec Maven, si vous générez deux artefacts d'un module (ce que vous êtes), vous devez d'abord considérer que vous vivez probablement une bonne pratique de Maven et réorganiser les choses pour ne produire qu'un artefact par module.

S'il vous plaît laissez-moi savoir si cela n'a pas de sens et je vais essayer de clarifier.

+0

Salut Merci pour les entrées.je ne pense pas que je serais en mesure de créer des modules séparés disent App1, App2..bcoz mes pots d'assemblage à savoir App1.jar, App2.jar ont des fichiers communs à inclure. Si je spécifie les paquets comme 'pom', le fichier MyApp-1.0.0 ne sera pas créé? – user170114

+0

Eh bien, ces fichiers communs seraient placés dans un troisième emplacement, soit dans leur propre assemblage qui est décompressé dans chaque module, soit (moins propre) dans le module parent et référencé par chaque enfant. Marquer votre module parent comme un "pom" ne créera pas le JAR, cependant, vous violeriez toujours les principes de Maven sans faire ce que je suggère. Recherche sur "Maven: The Definitive Guide" - un très beau livre gratuit sur Maven. – SingleShot

+0

Merci .. bien je pense que je dois aller pour l'option de mettre ces paquets communs dans le parent et l'accès de l'enfant. Dans ce cas, où dois-je conserver mes descripteurs d'assembly? Sous assemblys parent/enfant? Comment pointer vers les dossiers de parent ..je ne peux pas utiliser -project.build.outputDirectory non? – user170114