使用 Maven 通过 SFTP 传输工件

Transfer artifact via SFTP using Maven

我正在尝试将构建任务添加到 Maven pom 文件中,以便我可以将 jar 文件以及一些 xml 文件传输到 SFTP 服务器(它是一个 VM安装了 Tomcat),但到目前为止我还不能。

我查看了几个链接,但它们要么不太符合要求,要么缺少步骤,要么不起作用。我基本上是 Maven 的初学者,所以我不确定我是否做对了。

要求是我想调用一个 Maven 构建,使用主机名、用户名和密码(我正在使用)的命令行参数,然后上传一个 jar 文件和 xml 文件通过 SFTP 连接到带有 Tomcat 运行 的虚拟机(FTP 不起作用,而且我认为 SCP 不会起作用,因为我没有密码文件)。我也不想弄乱主要的 Maven settings.xml 文件来添加连接细节,我发现的一些链接似乎依赖于它。

到目前为止,我有以下配置文件,使用 FTP,但由于没有使用 SFTP,所以它不起作用。

<profiles>
    <profile>
        <!-- maven antrun:run -Pdeploy -->
        <id>deploy</id>
        <build>
            <plugins>
                <plugin>
                    <inherited>false</inherited>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.6</version>
                    <configuration>
                        <target>
                            <!-- <loadproperties srcFile="deploy.properties" /> -->

                            <ftp action="send" server="${server-url}"
                                remotedir="/usr/share/myappserver/webapps/myapp/WEB-INF/lib"
                                userid="${user-id}" password="${user-password}" depends="no"
                                verbose="yes" binary="yes">
                                <fileset dir="target">
                                    <include name="artifact.jar" />
                                </fileset>
                            </ftp>

                            <ftp action="send" server="${server-url}"
                                remotedir="/var/lib/myappserver/myapp/spring"
                                userid="${user-id}" password="${user-password}" depends="no"
                                verbose="yes" binary="yes">
                                <fileset dir="src/main/resource/spring">
                                    <include name="*.xml" />
                                </fileset>
                            </ftp>

                            <!-- calls deploy script -->
                            <!-- <sshexec host="host" trust="yes" username="usr" password="pw" 
                                command="sh /my/script.sh" /> -->

                            <!-- SSH -->
                            <taskdef name="sshexec" classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec" 
                                classpathref="maven.plugin.classpath" />
                            <taskdef name="ftp"
                                classname="org.apache.tools.ant.taskdefs.optional.net.FTP"
                                classpathref="maven.plugin.classpath" />
                        </target>

                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>commons-net</groupId>
                            <artifactId>commons-net</artifactId>
                            <version>1.4.1</version>
                        </dependency>
                        <dependency>
                            <groupId>ant</groupId>
                            <artifactId>ant-commons-net</artifactId>
                            <version>1.6.5</version>
                        </dependency>
                        <dependency>
                            <groupId>ant</groupId>
                            <artifactId>ant-jsch</artifactId>
                            <version>1.6.5</version>
                        </dependency>
                        <dependency>
                            <groupId>jsch</groupId>
                            <artifactId>jsch</artifactId>
                            <version>0.1.29</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

我尝试将 ftp 换成 sftp,然后改用 org.apache.tools.ant.taskdefs.optional.ssh.SFTP,但似乎没有用。

总而言之,SFTP 配置需要尽可能多地包含在 pom 文件中,调用时传入主机 url、用户名和密码等内容.

我将使用 Wagon Maven plugin 及其目标 upload-singleupload 而不是 antrun:

  • wagon:upload-single uploads the specified file to a remote location.

  • wagon:upload uploads the specified set of files to a remote location.

我最终能够使用 PuTTy pcsp 使它正常工作

<PUTTY_DIRECTORY>/pscp.exe" -l <USERNAME> -pw <PASSWORD> ./fileToTransfer.file <PUTTY_SESSION_ID>:/destination-directory/fileToTransfer.file

我也可以 运行 使用 plink 的脚本

<PUTTY_DIRECTORY>/plink.exe" <PUTTY_SESSION> -l <USERNAME> -pw <PASSWORD> -m ./myScriptToRunRemotely.sh

它不是最干净的解决方案,但它仍然允许我在 Jenkins 上使用它进行部署测试。