2009-09-24 24 views
15

Stiamo cercando di utilizzare Apache Commons VFS per accedere a qualcosa su SFTP. It claims to support SFTP, tuttavia riceviamo un MalformedURLException all'avvio. Scavando in giro vedo che apache vfs usa java.net.URL. Tuttavia, la documentazione mi dice che in realtà non supporta gli URL sftp://.Commons VFS e Java.net.URL - Aggiunta del supporto per il protocollo "sftp: //"

gestori di protocollo per i seguenti protocolli sono garantiti di esistere con il percorso di ricerca: - i gestori

http, https, ftp, file, and jar 

protocollo per protocolli addizionali possono anche essere disponibili.

Sto usando java 1.6.0 su Linux. Come posso impedire a java.net.URL di generare un wobbly quando viene visualizzato un URL sftp://? Devo continuare ad usare la libreria VFS di Apache Commons, che usa java.net.URL.

+0

Come stai creando la connessione SFTP? Usando la fabbrica cliente Sftp, o qualcos'altro? – Yishai

risposta

20

Vedere l'elenco dei beni comuni che dependencies-VFS richiede per SFTP al lavoro.Una volta che JSch si trova nel classpath, la tua eccezione non si verifica più. Dai un'occhiata a Apache's Wiki per esempi di collegamento via sftp.

+0

Installare JSch e includerlo nel mio file jar ha corretto automaticamente tutto. – Rory

+0

Ho aggiunto la dipendenza \t com.jcraft jsch 0.1.51 al mio pom.xml. Ma il problema esiste ancora, qualche idea? –

+0

Grazie, mi hai salvato la giornata! – oli206

2

Io uso jsch per gestire sftp e ssh. Non ti aiuterà a prevenire un'eccezione da java.net.URL, ma ti aiuterà a fare cose sftp.

+0

Ho bisogno di usare il modulo VFS di Apache Commons. Non voglio riscrivere parti fondamentali di questo. – Rory

1

A seconda di come è strutturato il codice, è possibile rimuovere s prima di assegnare la stringa al metodo di analisi dell'URL, impostare un flag e, se convalida, controllare tale flag e reinserirlo se è impostato. È brutto, ma fornirà una soluzione alternativa.

3

Dai un'occhiata a this description su come implementare un nuovo gestore di protocollo URL (il documento descrive un tipo di URL LDAP, ma dovresti essere in grado di generalizzare da quello allo schema sftp).

Dal documento:

Come si può vedere, l'unica differenza tra i due esempi è che abbiamo usato un URL LDAP nel secondo caso. Tuttavia, per l'esecuzione del campione LDAP in primo luogo sarà necessario registrarsi il gestore di protocollo LDAP di IAIK-JCE a dire il quadro URL java.net dove cercare il LDAP supporto classi di IAIK-JCE:

System.getProperties().put("java.protocol.handler.pkgs", "iaik.x509.net");

Dopo aver registrati il ​​protocollo gestore IAIK LDAP, un oggetto IAIK-JCE LdapURLConnection viene restituito quando si chiama url.openConnection per un URL LDAP.

(sottolineatura mia)

4

Non ho mai usato VFS prima, ma sembra che avresti bisogno di (almeno) un registerSFTP FileProvider. Sembra Si richiede qualcosa come:

DefaultFileSystemManager fsm = ... /* Create and configure your FSM. */ 
fsm.addProvider("sftp", new SftpFileProvider()); 

v'è probabilmente un modo per fare la stessa cosa attraverso configuration file syntax.