使用Maven通过SFTP传输工件

时间:2015-09-11 14:55:37

标签: maven tomcat ant sftp

我正在尝试将构建任务添加到Maven pom文件中,以便我可以将jar文件以及一些xml文件传输到SFTP服务器(它是安装了Tomcat的VM)但我无法如此远。

我已经看了几个链接,但它们要么不符合要求,要么缺少步骤,要么不能正常工作。我基本上是Maven的初学者,所以我不确定我是否正确地做到了。

要求是我想调用Maven构建,使用主机名,用户名和密码(我已经工作)的命令行参数,然后将jar文件和xml文件上传到运行Tomcat的VM在它通过SFTP(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,用户名和密码等内容。

2 个答案:

答案 0 :(得分:1)

我使用Wagon Maven plugin及其目标upload-singleupload代替antrun

  
      
  • wagon:upload-single 将指定文件上传到远程位置。

  •   
  • 旅行车:将指定的文件集上传到远程位置。

  •   

答案 1 :(得分:0)

我最终能够使用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上使用它进行部署测试。