这是一个常见问题,您可以在 Internet 上找到许多人在寻找正确的解决方案,并尝试knownHostsProvider
使用 的实例来覆盖实现SingleKnownHostsProvider
,正如您在示例中所解释的那样。
首先,这就是为什么这样做并不容易:
当存储库 URL 以 开头时scp:
,Maven 使用的组件管理器 Plexus 会查找具有 roleorg.apache.maven.wagon.Wagon
和 hint的组件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
不是用 role-hint 定义的,而是file
用 role-hint定义的single
:
public class SingleKnownHostProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
* role-hint="single"
因此,对这个不需要的(在您的情况下)的绑定是在源文件FileKnownHostsProvider
中静态定义的。AbstractJschWagon
这就是全部的困难。
现在,这是解决问题的方法:
通过运行以下步骤,使用 GitHub 上可用的这个 Maven wagon 修补实现:
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 将不会显示密钥指纹,也不会要求您验证此主机密钥。
希望有帮助。