【问题标题】:Maven copy local file to remote server using SSHMaven 使用 SSH 将本地文件复制到远程服务器
【发布时间】:2009-05-26 09:49:07
【问题描述】:

Maven 可以使用 SSH 将本地文件复制到远程服务器吗?

我想在 Maven 配置文件中指定位置,并在每次执行部署阶段时将该文件(或多个文件)复制到服务器。

【问题讨论】:

    标签: maven-2 ssh deployment


    【解决方案1】:

    maven-deploy-plugin 允许您配置部署阶段以使用 scp 部署到服务器。 documentation 中有一个页面描述了它是如何完成的。

    我相信这将取代正常的部署而不是添加到它,所以它可能不是你所追求的。

    如果您需要部署到传统的 Maven 存储库并将文件传送到远程服务器,则需要按照其他答案的建议使用 scp 任务。

    在this answer 中我已经描述了如何配置 ftp 任务,scp 任务几乎相同,只是您可能需要添加 keyfile 和 passphrase 属性(并且显然将任务名称从 ftp 更改为 scp)。

    【讨论】:

    • 使用maven-deploy-plugin的一个缺点是它总是上传一个maven artifact,它会上传到一个groupId/artifactId/version/artifactId-version.ext路径位置,如果你只是想上传一个文件到某个特定的位置带有scp 任务的服务器位置antrun 插件可以完成工作。
    • 这个答案已经过时了。有一种使用 Wagon 插件复制文件的直接方法。见stackoverflow.com/a/29208672/318054。
    • @fnt 你能详细说明一下吗?查看链接的文档,似乎这确实是最“官方”的方式。
    • @Zero3 当一切都是痛苦和眼泪时,它是多么“官方”并不重要。关于这件事我写了一个全面的答案——stackoverflow.com/a/42468595/318054
    • @fnt 我不确定这是否可以解释为什么这个答案已经过时,但我最终使用了 Wagon 的upload-single(将 .war 部署到 Jetty)。在这里,无论如何都要投赞成票!
    【解决方案2】:

    看看Maven Wagon plugin

    使用简单的命令行手动尝试: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>
    

    【讨论】:

      【解决方案3】:

      为什么不使用可以在 Maven 中运行的 Ant SCP 任务?

      【讨论】:

      • 值得一提的是,您可以使用 antrun maven 插件在 maven 上运行它
      【解决方案4】:

      与 PaoloC 的想法相同,使用 Maven Wagon 插件 并带有 wagon-ssh 扩展名,但在 pom 文件中配置并在指定阶段运行它,此示例复制了战争使用 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>
      

      &lt;phase&gt; 标签是可选的。您可以使用以下命令只运行上传执行:

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

      【讨论】:

      • 有没有办法信任服务器密钥?
      【解决方案5】:

      Maven 不是通用工具,它是使构建过程可重用的工具。我建议使用embedded antrun 构建步骤。在这一步中,您可以使用在 build.xml 中使用的普通 ant 语法来做任何事情。

      【讨论】:

      【解决方案6】:

      虽然这个问题并不完全是新问题,但我今天发现自己处于类似情况。我的目标是在我必须通过隧道连接到的远程服务器上(通过另一台服务器)上传文件并运行命令。我设法用ant 打造了一个解决方案(同样可以从这里提到的maven 触发)。

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

      【讨论】:

        猜你喜欢
        • 2016-09-13
        • 2016-05-23
        • 2015-03-19
        • 2012-02-17
        • 2012-02-23
        • 2018-09-04
        • 1970-01-01
        • 1970-01-01
        • 2010-09-09
        相关资源
        最近更新 更多