web-dev-qa-db-fra.com

Maven: comment copier un artefact dans un répertoire spécifique?

L'objectif "installer" copie l'artefact dans le répertoire cible et dans le référentiel local.

Comment puis-je dire à Maven de le copier également dans un répertoire donné (comme le répertoire de déploiement de JBoss par exemple).

24
Mr.Eddart

Le but copier du plugin maven-dependency fait ce que vous voulez, voir exemple .

Ce n'est cependant pas une bonne idée de copier quoi que ce soit en dehors de votre répertoire cible (ou ${project.build.directory} pour être précis) - surtout si une telle action est attachée à une phase de construction, car elle introduit des effets secondaires inattendus de la construction, et parfois même une perte de reproductibilité.

Comme le note @Andreas_D, il existe une meilleure alternative pour le déploiement de JBoss; de même pour le déploiement sur d'autres serveurs d'applications.

17
Petr Kozelka

Selon http://maven.Apache.org/plugins/maven-dependency-plugin/examples/copying-artifacts.html vous pouvez copier l'artefact qui vient d'être construit dans un répertoire spécifique:

<project>
    [...]
    <build>
      <plugins>
        <plugin>
          <groupId>org.Apache.maven.plugins</groupId>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.8</version>
          <executions>
            <execution>
              <id>copy-installed</id>
              <phase>install</phase>
              <goals>
                <goal>copy</goal>
              </goals>
              <configuration>
                <artifactItems>
                  <artifactItem>
                    <groupId>${project.groupId}</groupId>
                    <artifactId>${project.artifactId}</artifactId>
                    <version>${project.version}</version>
                    <type>${project.packaging}</type>
                  </artifactItem>
                </artifactItems>
                <outputDirectory>some-other-place</outputDirectory>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
    [...]
  </project>
11
Jörg

Si vous souhaitez copier le fichier sur un serveur Web (local ou distant), vous pouvez utiliser le plugin de téléchargement Maven:

                <plugin>
                    <groupId>com.atlassian.maven.plugins</groupId>
                    <artifactId>maven-upload-plugin</artifactId>
                    <version>1.1</version>
                    <configuration>
                        <resourceSrc>
                            ${project.build.directory}/${project.build.finalName}.${project.packaging}
                        </resourceSrc>
                        <resourceDest>${jboss.deployDir}</resourceDest>
                        <serverId>${jboss.Host}</serverId>
                        <url>${jboss.deployUrl}</url>
                    </configuration>
                </plugin>

Et pour configurer les paramètres de manière intelligente, j'utilise des profils maven:

<profiles>
    <!-- local deployment -->
    <profile>
        <id>developpement</id>
        <properties>
            <jboss.Host>localhost</jboss.Host>
            <jboss.deployDir>appli/jboss-4.0.4.GA/server/default/deploy/</jboss.deployDir>
            <jboss.deployUrl>file://C:/</jboss.deployUrl>
        </properties>
    </profile>
    <!-- distant deployment -->
    <profile>
        <id>validation</id>
        <properties>
            <jboss.Host>ENV_val</jboss.Host>
            <jboss.deployDir>/home/envval/jboss/server/default/deploy/</jboss.deployDir>
            <jboss.deployUrl>scp://PROJECT_LAN_Host</jboss.deployUrl>
        </properties>
    </profile>
</profiles>

J'ai créé un "lanceur de fourmis", pour l'utiliser en cliquant sous la vue des fourmis Eclipse:

<target name="copy war to JBoss local" description="Copy war to local JBoss">
    <maven goal="upload:upload" options="-Pdeveloppement" />
</target>

Mais vous pouvez simplement l'exécuter sur une ligne de commande:

mvn upload:upload -Pdeveloppement

Par ailleurs, pour un déploiement à distance, vous aurez peut-être besoin d'un mot de passe de connexion pour que scp fonctionne. Vous devez les ajouter à votre fichier Maven settings.xml:

<settings>
  ...
  <servers>
    <server>
      <id>ENV_val</id>
      <username>login</username>
      <password>password</password>
    </server>
  </servers>
  ...
</settings>
9
Tristan

La meilleure approche serait d'utiliser un plugin qui déploiera réellement votre application, tel que cargo ou plugin jboss-maven (crédit à @Andreas_D pour celui-là).

Ce serait une meilleure approche pour utiliser une copie ou un outil de téléchargement générique, car le déploiement est ce que vous essayez réellement de faire.

Avec le plugin cargo, vous avez la possibilité de déployer sur une variété de serveurs en cours d'exécution . Nous avons adopté cette approche pour tester localement dans la jetée en utilisant le plugin de la jetée pendant la construction et avions un profil à déployer sur Tomcat à la demande via le fret.

Remarque: Si votre serveur cible (JBOSS) est également installé localement sur la boîte de développement, vous pouvez également utiliser cargo pour démarrer/arrêter votre serveur pendant votre processus de construction aussi. L'inconvénient de cette approche est que vous en aurez besoin pour référencer son emplacement dans le fichier pom, donc tous les développeurs l'installent au même emplacement ou une propriété système qui définit où il se trouve (similaire à Java_HOME).

3
Robin