「如何使用Jsch複製文件?」是第一個問題。由於使用Jsch非常複雜且容易出錯,而且工作量很低,所以您需要編寫幾行代碼才能獲得簡單的scp。使用Jsch實施SCP,另外不推倒重來
那麼,如何實現一個SCP(甚至SFTP)與代碼儘可能少的線的Java並沒有違反DRY原則?
「如何使用Jsch複製文件?」是第一個問題。由於使用Jsch非常複雜且容易出錯,而且工作量很低,所以您需要編寫幾行代碼才能獲得簡單的scp。使用Jsch實施SCP,另外不推倒重來
那麼,如何實現一個SCP(甚至SFTP)與代碼儘可能少的線的Java並沒有違反DRY原則?
您可以使用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:
這個例子可以容易地擴展到上傳文件或使用SFTP代替。
幾行可能嗎?試試這個時髦的例子,它利用了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依賴項。
謝謝你的回答。我忘了提及解決方案必須使用Java。我會在這個問題上加上這個。但你的方式看起來很迷人。 – SimonTheSorcerer
@SimonTheSorcerer瞭解。你的例子也使用了ANT任務,所以兩種解決方案基本相同。 linecount差異歸結爲語言實現的差異。 (Groovy可以很容易地編譯到/使用Java)。 –
兩者都使用Ant,這是正確的。因爲我是Groovy的初學者,但我不知道如何從Java調用您的示例。而且,例如我需要如何設置我的Maven pom.xml或我需要下載哪些庫才能運行。 – SimonTheSorcerer
西門,你是我心目中的英雄的一週。我有一個gradle插件,我嘗試使用antBuilder並通過反射提供taskdef類路徑。我所有的測試工作和部署失敗。使用你的方法(我已經用於操作系統檢測,但忘記了)在我的測試和執行環境中工作。謝謝你,謝謝你,謝謝你。彼得 –
@PeterKahn很高興能夠幫助你! – SimonTheSorcerer