使用SSH将本地文件复制到远程服务器的Maven

63

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

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

6个回答

39

maven-deploy-plugin允许您配置部署阶段,使用scp将文件部署到服务器。在文档中有一页描述了如何完成此操作。

我认为这将替换正常的部署而不是添加到它,因此可能不是您想要的。

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

这个答案中,我描述了如何配置ftp任务,scp任务几乎相同,除了您可能需要添加keyfile和passphrase属性(显然还需要将任务名称从ftp改为scp)。


2
使用maven-deploy-plugin的一个缺点是它总是上传一个maven artifact,也就是说,它会上传到一个groupId/artifactId/version/artifactId-version.ext路径位置。如果你只想上传一个文件到某个特定的服务器位置,那么可以使用antrun插件和scp任务来完成工作。 - Jaime Hablutzel
这个答案已经过时了。使用Wagon插件可以直接复制文件。请参见https://dev59.com/5nNA5IYBdhLWcg3wkuzO#29208672。 - ᄂ ᄀ
@fnt 你能否详细说明一下?看了链接的文档,似乎这确实是最“官方”的方式。 - Zero3
2
@Zero3,无论它有多“正式”,当一切都是痛苦和眼泪时,这都不重要。我在这个问题上写了一个全面的答案-https://dev59.com/-nRB5IYBdhLWcg3wkH5N#42468595 - ᄂ ᄀ
@fnt 我不确定这是为什么这个答案已经过时的解释,但我最终使用了Wagon的upload-single(将.war部署到Jetty)。无论如何,请接受我的点赞! - Zero3
@Zero3 这个答案建议使用不适用于复制文件的工具。maven-deploy-plugin 用于将 构件 部署到 仓库 中。通过 maven-deploy-plugin 在某些情况下可以复制文件,但这并不意味着它是正确的工具。我在上面提到的答案中已经解释了这一点(如果你愿意去读)。由于自从写这篇答案以来,我们已经有了一个适合这项任务的合适工具,因此当前的答案已经过时了。 - ᄂ ᄀ

22

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

在这两种情况下,请务必将SSH扩展程序添加到您的pom.xml中:

<extensions>
    <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-ssh</artifactId>
        <version>2.8</version>
    </extension>
</extensions>

15

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


3
值得一提的是,您可以通过使用"antrun" Maven插件,在Maven中运行它。 - Jaime Hablutzel

8

与PaoloC的想法相同,使用带有wagon-ssh扩展的Maven Wagon插件,但在pom文件中配置并在指定阶段运行它,这个示例将war文件复制到带有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>
<phase> 标签是可选的。您可以使用以下命令仅运行上传执行:
mvn wagon:upload-single@upload-to-myserver

有没有一种方法可以信任服务器密钥? - basin

5
尽管这个问题并不是很新,但今天我发现自己处于类似的情况中。我的目标是上传文件并在远程服务器上运行命令,而我需要通过另一台服务器进行隧道连接。我成功地使用ant(可以从这里提到的maven触发)解决了这个问题。
Ant的sshsession任务只创建一个隧道,您可以在其中使用任务。但是,任务内部并不会自动在远程服务器上运行,但您可以使用sshexec任务和隧道来实现这一点。此外,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>

5

Maven不是通用工具,它是一个使您的构建过程可重用的工具。我建议使用嵌入式antrun构建步骤。在这个步骤中,您可以使用普通的ant语法来执行任何操作,就像在build.xml中一样。


1
值得一提的是,您将需要使用Ant的scp任务,请参阅http://ant.apache.org/manual/Tasks/scp.html。 - Jaime Hablutzel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接