Maven可以使用SSH将本地文件复制到远程服务器吗?
我想在maven配置文件中指定位置,并在每次执行部署阶段时将该文件(或多个文件)复制到服务器。
答案 0 :(得分:36)
maven-deploy-plugin允许您使用scp配置部署阶段以部署到服务器。 documentation中有一个页面描述了如何完成它。
我相信这会取代正常部署而不是添加它,所以它可能不是你想要的。
如果您需要部署到传统的Maven存储库并将文件传递到远程服务器,则需要使用scp任务,如其他答案所示。
在this answer我已经描述了如何配置ftp任务,scp任务几乎完全相同,除了你可能需要添加密钥文件和密码短语属性(并明确地将任务名称从ftp更改为scp)。
答案 1 :(得分:16)
使用简单的命令行手动尝试: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>
答案 2 :(得分:15)
为什么不使用可以在Maven中运行的Ant SCP任务?
答案 3 :(得分:7)
Maven不是一个通用工具,它是一个使您的构建过程可重用的工具。我建议使用embedded antrun构建步骤。在此步骤中,您可以使用在build.xml中使用的常规ant语法执行任何操作。
答案 4 :(得分:4)
与 PaoloC 相同的想法,使用带有wagon-ssh扩展名的 Maven Wagon插件,但是在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>
<phase>
标记是可选的。您可以使用以下命令运行上载执行:
mvn wagon:upload-single@upload-to-myserver
答案 5 :(得分:3)
虽然这个问题并不是全新的,但我今天发现自己处于类似情况。我的目标是在我必须隧道(通过另一台服务器)的远程服务器上上传文件和运行命令。我设法使用ant
为此创建了一个解决方案(这也可以从maven中触发,如此处所述)。
蚂蚁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>