Đây là một vấn đề phổ biến, bạn có thể tìm thấy nhiều người trên Internet tìm kiếm một giải pháp đúng, cố gắng ghi đè lên việc triển khai knownHostsProvider
với một phiên bản SingleKnownHostsProvider
, như bạn đã giải thích trong ví dụ của mình.
Thứ nhất, đây là lý do tại sao nó không phải là dễ dàng như vậy để làm điều đó:
Khi URL kho bắt đầu với scp:
, Plexus, người quản lý thành phần được sử dụng bởi Maven, trông cho một thành phần với vai trò org.apache.maven.wagon.Wagon
và gợi ý scp
, và tìm chỉ có một phù hợp với những nhu cầu trong việc thực hiện Wagon hiện tại (lên đến 3.0.1 ít nhất), đó là của lớp org.apache.maven.wagon.providers.ssh.jsch.ScpWagon
. Lớp này mở rộng lớp AbstractJschWagon
trong cùng một gói và lớp sau này định nghĩa tĩnh một gợi ý vai trò file
để chọn một ví dụ KnownHostProvider
.
Vì vậy, đây file
nhập vai gợi ý làm Plexus sử dụng lớp FileKnownHostsProvider
để instanciate một đối tượng KnownHostsProvider
được trao cho các ScpWagon
dụ.Điều này là do lớp FileKnownHostsProvider
được định nghĩa theo cách sau vào lúc bắt đầu của tập tin nguồn của nó:
public class FileKnownHostsProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
* role-hint="file"
Ngược lại, lớp SingleKnownHostProvider
là không định nghĩa với vai trò-gợi ý file
nhưng với vai trò-gợi ý single
:
public class SingleKnownHostProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
* role-hint="single"
Vì vậy, các ràng buộc để không mong muốn này (trong trường hợp của bạn) FileKnownHostsProvider
được tĩnh được định nghĩa trong tập tin AbstractJschWagon
nguồn. Đây là toàn bộ khó khăn.
Bây giờ, ở đây là làm thế nào để giải quyết vấn đề:
Sử dụng Maven toa xe vá thi này available here on GitHub, bằng cách chạy những bước sau:
1- trong pom.xml
của bạn, bạn có thể có một số phần mở rộng maven được xác định theo cách này:
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>3.0.1</version>
</extension>
</extensions>
</build>
Lưu ý rằng bạn có thể sử dụng phiên bản khác với 3.0.1.
Dù sao, thay đổi định nghĩa này bằng phiên bản cụ thể 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- phiên bản cụ thể này 3.0.1-SINGLE
là một phiên bản Wagon Tôi đã vá để giải quyết vấn đề rất phổ biến này, tôi đã cũng gặp phải. Nó không có sẵn trên trung tâm Maven, nhưng trên GitHub.
Vì vậy, bạn phải cài đặt nó cho mình, theo cách sau ví dụ:
% git clone https://github.com/AlexandreFenyo/maven-wagon.git
% cd maven-wagon
% mvn install
3- Bây giờ, cấu hình setup.xml
bạn theo cách này:
<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>
Mọi thứ bây giờ nên làm việc như bạn muốn: nếu khóa máy chủ được xác định trong tệp setup.xml
là chính xác, thì maven sẽ không hiển thị vân tay khóa, cũng như không yêu cầu bạn xác thực khóa máy chủ này.
Hy vọng điều đó sẽ hữu ích.
Giải pháp rất đẹp và sạch sẽ. Rất thích nhìn thấy nó sáp nhập với thực hiện chính thức. Bạn đã liên hệ với người bảo trì chính thức chưa? – YoYo
Tôi chưa đề xuất chúng, nhưng tôi sẽ. Cảm ơn. –