web-dev-qa-db-fra.com

Maven copie un fichier local sur un serveur distant à l'aide de SSH

Maven peut-il copier un fichier local sur un serveur distant en utilisant SSH?

Je veux spécifier l'emplacement dans le fichier de configuration maven et copier ce fichier (ou ces fichiers) sur le serveur chaque fois que la phase de déploiement est exécutée.

56
mgamer

Le plugin maven-deploy-plugin vous permet de configurer la phase de déploiement à déployer sur un serveur à l'aide de scp. Il y a une page dans la documentation qui décrit comment cela peut être fait.

Je crois que cela remplacera le déploiement normal au lieu de l'ajouter, donc ce n'est peut-être pas ce que vous recherchez.

Si vous devez déployer sur un référentiel Maven traditionnel ainsi que livrer le fichier au serveur distant, vous devrez utiliser la tâche scp comme les autres réponses le suggèrent.

Dans cette réponse J'ai décrit comment configurer la tâche ftp, la tâche scp est presque identique sauf que vous devrez peut-être ajouter les attributs keyfile et passphrase (et changer le nom de la tâche ftp en scp évidemment) .

37
Rich Seller

Jetez un oeil à plugin Maven Wagon

Pour l'essayer manuellement avec une simple ligne de commande: mvn org.codehaus.mojo:wagon-maven-plugin:1.0:upload -Dwagon.url=scp://username:userpassword@myserver -Dwagon.fromDir=target -Dwagon.includes=*.ear -Dwagon.toDir=/home/elisabetta

Dans les deux cas, assurez-vous d'ajouter l'extension SSH pour Wagon à votre pom.xml:

<extensions>
    <extension>
        <groupId>org.Apache.maven.wagon</groupId>
        <artifactId>wagon-ssh</artifactId>
        <version>2.8</version>
    </extension>
</extensions>
17
PaoloC

Pourquoi ne pas utiliser la tâche Ant SCP , que vous pouvez exécuter dans Maven?

15
Brian Agnew

Maven n'est pas un outil générique, c'est un outil pour rendre votre processus de construction réutilisable. Je suggère d'utiliser une étape de construction antrun intégrée . Dans cette étape, vous pouvez faire n'importe quoi en utilisant la syntaxe de fourmi normale que vous utiliseriez dans build.xml.

7
Aaron Digulla

Même idée que PaoloC , en utilisant plugin Maven Wagon avec l'extension wagon-ssh, mais configuration dans le fichier pom et exécutez-le sur phase spécifiée, cet exemple copie le fichier war sur un serveur distant avec SSH:

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>wagon-maven-plugin</artifactId>
      <version>1.0</version>
      <executions>
        <execution>
          <id>upload-to-myserver</id>
          <phase>deploy</phase>
          <goals>
            <goal>upload-single</goal>
          </goals>
          <configuration>
            <fromFile>${project.build.directory}/${project.build.finalName}.war</fromFile>
            <url>scp://username@myserver/path</url>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <!-- other plugins ... -->
  </plugins>
  <extensions>
    <extension>
      <groupId>org.Apache.maven.wagon</groupId>
      <artifactId>wagon-ssh</artifactId>
      <version>2.8</version>
    </extension>
  </extensions>
</build>

Le <phase> la balise est facultative. Vous pouvez exécuter uniquement l'exécution de téléchargement avec la commande:

mvn wagon:upload-single@upload-to-myserver
4
holmis83

Bien que cette question ne soit pas exactement nouvelle, je me suis retrouvé dans une situation similaire aujourd'hui. Mon objectif est de télécharger des fichiers et d'exécuter des commandes sur un serveur distant auquel je dois tunneler (via un autre serveur). J'ai réussi à forger une solution pour cela avec ant (qui peut encore être déclenchée depuis maven comme mentionné ici).

La tâche Fourmis sshsession crée uniquement un tunnel que vous pouvez utiliser pour les tâches à l'intérieur. Les tâches à l'intérieur ne sont pas exécutées automatiquement sur le serveur distant, mais vous pouvez utiliser la tâche sshexec avec tunnel pour y parvenir. La tâche scp peut également être téléchargée via le tunnel vers le serveur distant. Voici un exemple:

<sshsession Host="${jumphost}" port="22" username="${user}" password="${password}" trust="true">
    <localtunnel lport="${localTunnelPort}" rhost="${targethost}" rport="22"/>
    <sequential>
        <!-- run a command on the remote server (here mkdir) -->
        <sshexec Host="localhost" port="${localTunnelPort}" username="${user.param}" password="${password.param}" command="mkdir ${home}/foobar" trust="true" />
        <!-- upload a file to the remote server -->
        <scp port="${localTunnelPort}" file="test_file.txt" todir="${user.param}:${password.param}@localhost:${home}/foobar/" trust="true" />
    </sequential>
</sshsession>
3
SebastianH