Java FTP库Jsch使用问题求助(Java 1.7、jsch 0.1.54、commons-vfs2 2.1)
Let me break down the potential issues in your setup and share actionable fixes based on the versions you're using:
1. Critical Protocol Configuration Mix-Up
First, I notice you're using FtpFileSystemConfigBuilder alongside JSch—but JSch is built for SFTP (SSH File Transfer Protocol), not traditional FTP. The FtpFileSystemConfigBuilder is designed for plain FTP connections, which explains why your JSch settings might not be taking effect at all.
Switch to SftpFileSystemConfigBuilder instead—it’s the correct builder for SFTP connections in Commons VFS2.
2. KEX Algorithm Compatibility with Java 1.7
Java 1.7 has limited support for modern key exchange (KEX) algorithms like curve25519-sha256@libssh.org—this algorithm was officially added in Java 8. JSch 0.1.54 also has spotty support for this algorithm on Java 7, which will cause handshake failures if your server prioritizes it.
Fix: Adjust Your KEX List
Remove unsupported algorithms and prioritize ones that work reliably with Java 1.7 and JSch 0.1.54:
JSch.setConfig("kex", "diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1");
3. Corrected Code Example
Here’s a revised, working version of your code with proper SFTP configuration:
import org.apache.commons.vfs2.FileObject; import org.apache.commons.vfs2.FileSystemOptions; import org.apache.commons.vfs2.StandardFileSystemManager; import org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder; import com.jcraft.jsch.JSch; public class SftpClientExample { public static void main(String[] args) { // Adjust KEX algorithms for Java 1.7 compatibility JSch.setConfig("kex", "diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1"); final StandardFileSystemManager manager = new StandardFileSystemManager(); try { manager.init(); final FileSystemOptions opts = new FileSystemOptions(); // Configure SFTP-specific settings SftpFileSystemConfigBuilder sftpBuilder = SftpFileSystemConfigBuilder.getInstance(); sftpBuilder.setUserDirIsRoot(opts, false); // Don't treat user's home directory as the root sftpBuilder.setUserName(opts, "your-username"); sftpBuilder.setPassword(opts, "your-password"); sftpBuilder.setPort(opts, 22); // Default SFTP port // Optional: Disable strict host key checking (for testing only; use "ask" or "yes" in production) sftpBuilder.setStrictHostKeyChecking(opts, "no"); // Connect to the SFTP server FileObject remoteFile = manager.resolveFile("sftp://your-server-hostname/path/to/target/file", opts); // Example: Verify file existence if (remoteFile.exists()) { System.out.println("Target file found: " + remoteFile.getName().getPath()); } // Add your upload/download/modify logic here // ... } catch (Exception e) { e.printStackTrace(); } finally { if (manager != null) { try { manager.close(); } catch (Exception e) { e.printStackTrace(); } } } } }
4. Additional Tips
- Key-Based Authentication: If you’re using SSH keys instead of passwords, configure them with:
sftpBuilder.setIdentities(opts, new File[]{new File("/path/to/your/private-key")}); sftpBuilder.setIdentityPassphrase(opts, "your-key-passphrase"); // Only if your key is encrypted - Dependency Check: Ensure your project includes both JSch 0.1.54 and Commons VFS2 2.1 JARs—version mismatches can cause silent, hard-to-debug failures.
- Java Security Policy: If you still get algorithm errors, add the BouncyCastle security provider to Java 1.7 to gain support for more modern encryption algorithms.
内容的提问来源于stack exchange,提问作者Gaetan56

