web-dev-qa-db-ja.com

MavenはSSHを使用してローカルファイルをリモートサーバーにコピーします

MavenはSSHを使用してローカルファイルをリモートサーバーにコピーできますか?

Maven構成ファイルで場所を指定し、展開フェーズが実行されるたびにそのファイルをサーバーにコピーします。

56
mgamer

Maven-deploy-pluginを使用すると、scpを使用してサーバーにデプロイするデプロイフェーズを構成できます。 documentation には、その方法を説明するページがあります。

これにより、通常の展開に追加するのではなく置き換えられるため、目的の展開にならない場合があります。

ファイルをリモートサーバーに配信するだけでなく、従来のMavenリポジトリにデプロイする必要がある場合は、他の回答が示すようにscpタスクを使用する必要があります。

この答え ftpタスクの設定方法を説明しましたが、キーファイルとパスフレーズの属性を追加する必要がある場合を除き、scpタスクはほとんど同じです(タスク名をftpからscpに変更するのは明らかです) 。

37
Rich Seller

Maven Wagonプラグイン をご覧ください

簡単なコマンドラインで手動で試すには: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

どちらの場合も、WagonのSSH拡張をpom.xmlに追加してください:

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

Maven内で実行できるAnt [〜#〜] scp [〜#〜] タスクを使用しないのはなぜですか?

15
Brian Agnew

Mavenは汎用ツールではなく、ビルドプロセスを再利用可能にするツールです。 embedded antrun ビルドステップを使用することをお勧めします。このステップでは、build.xmlで使用する通常のant構文を使用して何でもできます。

7
Aaron Digulla

PaoloCと同じアイデア、wagon-ssh拡張でMaven Wagonプラグインを使用しますが、pomファイルで設定して実行します指定されたフェーズ、この例では、SSHを使用してwarファイルをリモートサーバーにコピーします。

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

<phase>タグはオプションです。次のコマンドを使用して、アップロード実行のみを実行できます。

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

この質問はまったく新しいものではありませんが、今日も同様の状況に陥っています。私の目標は、(別のサーバーを介して)トンネルする必要があるリモートサーバーでファイルをアップロードし、コマンドを実行することです。私はant(ここで述べたように再びmavenからトリガーすることができます)を使用して、そのためのソリューションを作成しました。

Ant sshsessionタスクは、内部のタスクに使用できるトンネルのみを作成します。内のタスクはリモートサーバーで自動的に実行されませんが、sshexecタスクとtunnelを組み合わせて使用​​することができます。また、scpタスクは、トンネルを介してリモートサーバーにアップロードできるようになりました。以下に例を示します。

<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