Это распространенная проблема, вы можете найти много людей в Интернете, которые ищут правильное решение, пытаясь переопределить реализацию 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, но доступен на 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