【问题标题】:Use Jsch to implement scp and additionally not reinvent the wheel使用 Jsch 实现 scp 并且不重新发明轮子
【发布时间】:2012-09-05 10:16:24
【问题描述】:

“如何使用 Jsch 复制文件?”是第一个问题。由于使用 Jsch 复杂且容易出错,而且工作级别非常低,因此您需要编写几行代码才能让一个简单的 scp 工作。

那么,如何在 Java 中用尽可能少的代码行来实现一个 scp(甚至是 sftp)而不违反 DRY 原则?

【问题讨论】:

    标签: java ant scp


    【解决方案1】:

    您可以使用 Ant scp 任务使用的库:

    package org.example.scp;
    
    import org.apache.tools.ant.Project;
    import org.apache.tools.ant.taskdefs.optional.ssh.Scp;
    
    public class ScpCopyExample {
    
        public void downloadFile( String remoteFilePath, String localFilePath ) {
            Scp scp = new Scp();
            scp.setFile("username:password@host.example.org:" + remoteFilePath);
            scp.setLocalTofile(localFilePath);
            scp.setProject(new Project()); // prevent a NPE (Ant works with projects)
            scp.setTrust(true); // workaround for not supplying known hosts file
    
            scp.execute();
        }
    
        public static void main(String[] args) {
            ScpCopyExample scpDemo = new ScpCopyExample();
            scpDemo.downloadFile("~/test.txt", "testlocal.txt");
        }
    
    }
    

    我在类路径中使用了以下 jars:

    • jsch-0.1.48.jar
    • ant-jsch-1.6.5.jar
    • ant-1.7.0.jar
    • ant-launcher-1.7.0.jar

    此示例可以轻松扩展为上传文件或使用 SFTP。

    【讨论】:

    • 西蒙,你是我这一周的英雄。我有一个 gradle 插件,我尝试使用 antBuilder 并通过反射提供 taskdef 类路径。我所有的测试都成功了,部署失败了。使用您的方法(我已经用于操作系统检测但忘记了)在我的测试和执行环境中有效。谢谢你,谢谢你,谢谢你。彼得
    • @PeterKahn 很高兴能为您提供帮助!
    【解决方案2】:

    尽可能少的行?试试这个利用 ANT scp task 的 groovy 示例。

    @Grapes([
        @Grab(group='org.apache.ant', module='ant-jsch', version='1.8.4'),
        @GrabConfig(systemClassLoader=true)
    ])
    
    def ant = new AntBuilder()    
    ant.scp(file:"helloworld.doc", todir:"mark@remotehost:/home/mark/docs", password:"sEcReT")
    

    Grape annotations 将在运行时下载 jar 依赖项。

    【讨论】:

    • 感谢您的回答。我忘了提到解决方案必须在 Java 中。我会将这个添加到问题中。但是你的方式看起来确实很迷人。
    • @SimonTheSorcerer 明白了。您的示例还使用了 ANT 任务,因此两种解决方案基本相同。行数差异归结为语言实现的差异。 (Groovy 可以很容易地编译成/使用 Java)。
    • 两者都使用 Ant,这是正确的。不过,由于我是 Groovy 的初学者,我不知道如何从 Java 中调用您的示例。而且,例如我需要如何设置我的 Maven pom.xml 或者我需要下载哪些库才能使其正常工作。
    • @SimonTheSorcerer 这很简单,使用 Maven:docs.codehaus.org/display/GMAVEN/Building+Groovy+Projects
    • 我错过了 GroovyScp scp = new GroovyScp(); scp.download(...); 我想插入到我的 Java 代码中。
    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2023-03-14
    相关资源
    最近更新 更多