2012-09-12 21 views
3

「如何使用Jsch複製文件?」是第一個問題。由於使用Jsch非常複雜且容易出錯,而且工作量很低,所以您需要編寫幾行代碼才能獲得簡單的scp。使用Jsch實施SCP,另外不推倒重來

那麼,如何實現一個SCP(甚至SFTP)與代碼儘可能少的線的Java並沒有違反DRY原則?

回答

5

您可以使用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:[email protected]:" + 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"); 
    } 

} 

我這樣做,在我的類路徑中添加下列jar:

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

這個例子可以容易地擴展到上傳文件或使用SFTP代替。

+0

西門,你是我心目中的英雄的一週。我有一個gradle插件,我嘗試使用antBuilder並通過反射提供taskdef類路徑。我所有的測試工作和部署失敗。使用你的方法(我已經用於操作系統檢測,但忘記了)在我的測試和執行環境中工作。謝謝你,謝謝你,謝謝你。彼得 –

+0

@PeterKahn很高興能夠幫助你! – SimonTheSorcerer

1

幾行可能嗎?試試這個時髦的例子,它利用了ANT scp task

@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:"[email protected]:/home/mark/docs", password:"sEcReT") 

Grape annotations將在運行時下載jar依賴項。

+0

謝謝你的回答。我忘了提及解決方案必須使用Java。我會在這個問題上加上這個。但你的方式看起來很迷人。 – SimonTheSorcerer

+1

@SimonTheSorcerer瞭解。你的例子也使用了ANT任務,所以兩種解決方案基本相同。 linecount差異歸結爲語言實現的差異。 (Groovy可以很容易地編譯到/使用Java)。 –

+0

兩者都使用Ant,這是正確的。因爲我是Groovy的初學者,但我不知道如何從Java調用您的示例。而且,例如我需要如何設置我的Maven pom.xml或我需要下載哪些庫才能運行。 – SimonTheSorcerer