53 votes

Ant à Maven - construire plusieurs objectifs

J'ai une Fourmi version qui est actuellement en cours de conversion à Maven. Cependant, l'Ant a 2 build targets, laquelle repose l'ensemble de l'application, et celui qui construit un POT de certains de ces fichiers (seulement un peu). En Ant, il est facile d'avoir plusieurs build targets pour gérer cela, mais je suis en train de déterminer la meilleure façon de gérer cela dans Maven.

J'ai pu diviser le sous-ensemble de fichiers dans un second projet, et il aura son propre POM. Puis le premier projet pourrait dépendre sur celui-ci. Cependant, depuis le sous-ensemble de fichiers est de petite taille (moins de 10), il semble peut-être exagéré d'avoir un tout nouveau projet pour cet.

Il existe d'autres moyens de gérer cela?

76voto

Tim O'Brien Points 4769

Vous pouvez le faire avec des profils...

Si vous avez vraiment envie d'utiliser deux profils séparés et personnaliser le JAR du plugin pour inclure et exclure des modèles de classe et les noms de paquets, vous pouvez facilement le faire en mettant quelque chose comme ceci dans votre POM:

<profiles>
  <profile>
    <id>everything</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <classifier>everything</classifier>
            <includes>
              <include>**/*</include>
            </includes>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>only-library</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <classifier>only-library</classifier>
            <excludes>
              <exclude>**/Main*</exclude>
            </excludes>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

Aparté: Si cela ressemble à beaucoup de configuration, polyglotte Maven soutien du Groovy Pdm est tout prêt. Il permettra de réduire le nombre de lignes considérablement diminué.

Vous pouvez mettre ceci à la fin de votre pom.xml (au sein de l'élément de projet), et il ajoute deux profils. Le premier profil "tout" est vraiment juste là pour démontrer la configuration. Ce "tout" profil est unnecesary simplement parce que cela duplique le comportement par défaut JAR du plugin jar but de l'exécution. Le second profil "seulement-bibliothèque" exclut toute classe dans un paquet qui commence avec le texte "Principal". Pour faire appel à ces profils:

mvn package -Peverything
mvn package -Ponly-library

J'ai testé cet égard l'exemple d'application est livré avec le Chapitre 6 de Maven par l'Exemple, et l'exécution de ces commandes permet de produire un fichier JAR dans ${basedir}/cible qui a un classificateur. Depuis le JAR du plugin jar objectif est lié à l'emballage de la phase en défaut de maven cycle de vie, ces deux profils sont pour modifier la configuration de ce plugin.

Ou, vous pouvez le faire avec deux JAR du plugin exécutions...

Si vous avez besoin de créer deux Pots sans l'aide de profils. Vous pouvez lier le JAR du plugin jar objectif pour le package phase du cycle de vie plusieurs fois et utilisent une configuration différente pour chaque configuré exécution. Si vous configurez deux exécutions, chaque exécution a exécution de la configuration spécifique du bloc de sorte que vous pouvez fournir un identifiant unique et d'inclure ou d'exclure modèle pour chaque exécution.

Ici est l'accumulation de l'élément que vous utiliseriez pour ajouter à la fois personnalisée Pots de à la phase du cycle de vie "package". Faire cela sur un projet avec l'emballage "pot" aurait lieu dans le pot de but exécuté trois fois. Une fois que le cycle de vie par défaut de liaison, puis à deux reprises pour deux personnalisées, classées Pots.

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <executions>
          <execution>
            <id>only-library</id>
            <goals><goal>jar</goal></goals>
            <phase>package</phase>
            <configuration>
              <classifier>only-library</classifier>
              <excludes>
                <exclude>**/Main*</exclude>
              </excludes>
            </configuration>
          </execution>
          <execution>
            <id>everything</id>
            <goals><goal>jar</goal></goals>
            <phase>package</phase>
            <configuration>
              <classifier>everything</classifier>
              <includes>
                <include>**/*</include>
              </includes>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Si vous n'êtes pas en parler, y compris un ensemble différent de classes dans chaque artefact, vous aurez envie d'utiliser Maven Assemblées. Si vous voulez connaître les détails des assemblages, il y a un chapitre énumérés à la fin de cette réponse de Maven: La Référence Complète. Franchement, je ne pense pas que ce chapitre est une bonne introduction de référence; en fait, j'ai eu de nombreux rapports que ce chapitre est quasiment illisible (et nous travaillons pour corriger cela). Si vous êtes à la recherche d'utiliser des assemblages, je recommanderais le Maven Assemblée du Plugin de la documentation. Dans la partie gauche de nav menu, vous verrez une liste d'exemples de l'assemblée des descripteurs.

Avertissement: (s'il vous Plaît) à ne pas faire. Si vous êtes à la création de deux différence de Pots avec deux types de jeu de classes je vous recommande fortement de scinder le projet en deux modules interdépendants.

Alors que vous pouvez le faire avec les profils, ça va être plus facile pour vous de diviser le projet en deux (en fait trois). À plus long terme, il va y avoir des défis que vous aurez à faire face en tant que votre demande d'échelles. Vous serez responsable de figurer hors de ce manuel liste de classes et de packages pour être inclus dans chacune de vos petites Jarres.

Il y a un minimum de frais généraux pour avoir une simple projet parent qui fait référence à deux modules distincts. Si vous regardez le gratuit Maven par l'Exemple du livre, nous montrons comment faire la transition entre un module simple et multi-projet de module. Les chapitres 3-5 concentrer sur un seul module de projets, et le Chapitre 6 vous montre comment vous permettrait de combiner ces composants du module dans un plus grand multi-projet de module.

Pour plus d'informations:

Vous question porte sur les rubriques suivantes, voici quelques liens qui pourront vous fournir plus de détails pour chaque:

Le Maven JAR du Plugin: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html

Multi-module Maven Projets: Chapitre 6 de Maven par l'Exemple et l'Article 3.6.2 de Maven: La Référence Complète.

Le Cycle de vie de Maven (pot est lié à forfait si votre emballage est "jar"): la Section 3.5.2 de Maven par l'Exemple "Concepts de Base" et le Chapitre 4 de Maven: La Référence Complète

Maven Assemblées: tout d'Abord, le Maven Assembly site Plugin, puis le Chapitre 8 de Maven: La Référence Complète pour certaines lourd (presque trop lourd) détails.

23voto

Glen Points 13521

Votre première pensée est la bonne. Diviser les 2 morceaux dans 2 projets.

Le maven philosophie est que chaque projet doit construire un et seul artefact (jar, war, peu importe)

Vous pourriez probablement hack quelque chose ensemble, de sorte que vous n'avez qu'un projet maven bâtiment 2 atrifacts, mais il serait un hack.

Vous pouvez appeler ant de maven, donc si vous voulez vraiment le faire, alors je vous suggère de commencer à regarder le maven ant plugin. L'artefact id est "maven-antrun-plugin"

5voto

crowne Points 6002

Vous avez 2 choix:

Si le sous-ensemble n'est qu'une collection de ressources, alors je ne voudrais pas en faire un module séparé.

Si le projet est toujours dépendante sur le sous-ensemble qui est emballé dans une manière uniforme, puis le sous-ensemble est un bon candidat pour devenir un module.

Si le sous-ensemble est reconditionné dans plusieurs différentes "saveurs", alors je voudrais définir des assemblages pour chaque "saveur" et de qualifier l'artefact noms avec un "classificateur" voir coordonnées maven.

Enfin, vous pouvez utiliser des profils pour déterminer les assemblées produit, votre profil par défaut ne peut créer la première artefact de la "saveur" qui est nécessaire au cours du développement.
Un "plein" de profil peut produire l'ensemble de la "saveur" des variantes de l'artefact pour le déploiement final une fois le développement terminé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X