Това е често срещан проблем, можете да намерите много хора в интернет, които търсят правилно решение, опитвайки се да заменят изпълнението knownHostsProvider
с екземпляр на SingleKnownHostsProvider
, както обяснихте във вашия пример.
Първо, ето защо не е толкова лесно да направите това:
Когато URL адресът на хранилището започва с scp:
, Plexus, мениджърът на компоненти, използван от Maven, търси компонент с роля org.apache.maven.wagon.Wagon
и намек scp
и намира единствения, който отговаря на тези нужди в текущата реализация на Wagon (до 3.0.1 на най-малко), което е от клас org.apache.maven.wagon.providers.ssh.jsch.ScpWagon
. Този клас разширява класа AbstractJschWagon
в същия пакет и последният клас дефинира статично подсказка за роля file
за избор на екземпляр KnownHostProvider
.
Следователно този file
намек за роля кара Plexus да използва класа FileKnownHostsProvider
за инстанциране на KnownHostsProvider
обект, който е даден на ScpWagon
екземпляра. Това е така, защото класът FileKnownHostsProvider
е дефиниран по следния начин в началото на своя изходен файл:
public class FileKnownHostsProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
* role-hint="file"
Напротив, класът SingleKnownHostProvider
е не дефиниран с подсказка за роля file
, а с подсказка за роля single
:
public class SingleKnownHostProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
* role-hint="single"
Така че обвързването към този нежелан (във вашата ситуация) FileKnownHostsProvider
е статично дефинирано в изходния файл AbstractJschWagon
. Това е цялата трудноста
Ето как да разрешите проблема:
Използвайте тази реализация на Maven wagon, достъпна тук в GitHub, като изпълните тези стъпки:
1- във вашия pom.xml
може да имате някакво разширение на maven, дефинирано по този начин:
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>3.0.1</version>
</extension>
</extensions>
</build>
Имайте предвид, че можете да използвате друга версия, различна от 3.0.1.
Както и да е, променете тази дефиниция с конкретната версия 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- Тази конкретна версия 3.0.1-SINGLE
е версия на Wagon, която съм закърпил, за да разреша този много често срещан проблем, който също съм срещал. Не е наличен в Maven central, но в GitHub.
Така че трябва да го инсталирате сами, например по следния начин:
% git clone https://github.com/AlexandreFenyo/maven-wagon.git
% cd maven-wagon
% mvn install
3- Сега конфигурирайте своя setup.xml
по следния начин:
<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>
Сега всичко трябва да работи както искате: ако ключът на хоста, дефиниран във файла setup.xml
, е правилен, maven няма да покаже отпечатъка на ключа, нито ще ви помоли да потвърдите този ключ на хост.
Надявам се това да помогне.
person
Alexandre Fenyo
schedule
18.08.2017