Questo è un problema comune, si possono trovare molte persone su Internet alla ricerca di una soluzione giusta, cercando di ignorare l'implementazione knownHostsProvider
con un'istanza di SingleKnownHostsProvider
, come spiegato nell'esempio.
In primo luogo, qui è il motivo per cui non è così facile da fare che:
Quando l'URL del repository inizia con scp:
, Plexus, il manager componente utilizzato da Maven, sembra per un componente con il ruolo org.apache.maven.wagon.Wagon
e suggerire scp
e trova l'unico che risponda a queste esigenze nell'attuale implementazione di Wagon (almeno fino a 3.0.1), ovvero della classe org.apache.maven.wagon.providers.ssh.jsch.ScpWagon
. Questa classe estende la classe AbstractJschWagon
nello stesso pacchetto e quest'ultima classe definisce staticamente un suggerimento di ruolo file
per selezionare un'istanza KnownHostProvider
.
Pertanto, questo file
ruolo-suggerimento rende plesso utilizzare la classe di FileKnownHostsProvider
instanciate un oggetto KnownHostsProvider
che viene dato all'istanza ScpWagon
.Questo è perché la classe FileKnownHostsProvider
è definita nel seguente modo all'inizio del suo file sorgente:
public class FileKnownHostsProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
* role-hint="file"
Al contrario, la classe SingleKnownHostProvider
è non definito con il ruolo-suggerimento file
ma con ruolo-suggerimento single
:
public class SingleKnownHostProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
* role-hint="single"
Quindi, il legame a questa indesiderata (nella vostra situazione) FileKnownHostsProvider
è staticamente definito nel file AbstractJschWagon
sorgente. Questa è l'intera difficoltà.
Ora, ecco come risolvere il problema:
Utilizzare questa Maven carro patchato implementazione available here on GitHub, eseguendo questi passaggi:
1- nel vostro pom.xml
, si può avere qualche estensione Maven definito in questo modo:
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>3.0.1</version>
</extension>
</extensions>
</build>
Nota che è possibile utilizzare un'altra versione rispetto alla 3.0.1.
In ogni caso, cambiare questa definizione con la versione specifica 3.0.1-SINGLE:
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>3.0.1-SINGLE</version>
</extension>
</extensions>
</build>
2- Questa specifica versione 3.0.1-SINGLE
è una versione Wagon ho patchato per risolvere questo problema molto comune, ho anche incontrato. Non è disponibile su Maven central, ma su GitHub.
Quindi, è necessario installare da soli, come segue, per esempio:
% git clone https://github.com/AlexandreFenyo/maven-wagon.git
% cd maven-wagon
% mvn install
3- Ora, configurare il setup.xml
in questo modo:
<servers>
<server>
<id>gitcloud.myserver.net:8001</id>
<username>git</username>
<privateKey>C:/data/home/.ssh/id_rsa</privateKey>
<configuration>
<hostKey>codecloud.web.att.com ssh-rsa XXXXA3NvvFakeSSHKEYsdfADA...doLQ==</hostKey>
</configuration>
</server>
</servers>
tutto dovrebbe ora funzionare come si vuole: se la chiave host definita nel file setup.xml
è corretta, Maven non visualizzerà l'impronta digitale della chiave, né chiederà di convalidare questa chiave host.
Spero che questo aiuti.
Soluzione molto bella e pulita. Mi piacerebbe vederlo fuso con l'implementazione ufficiale. Hai contattato i manutentori ufficiali? – YoYo
Non li ho ancora suggeriti, ma lo farò. Grazie. –