2015-07-31 20 views
9

Trong Maven settings.xml, tôi muốn xác định một máy chủ SSH và cung cấp:Làm thế nào để cung cấp máy chủ chính để sử dụng Maven SSH trong server.xml

  • The Host để kết nối với
  • Người dùng để kết nối với
  • vị trí của một khóa riêng (để xác thực bản thân mình)
  • thủ cung cấp một host Key (khóa công khai để xác minh các máy chủ)

Tôi không muốn:

  • phụ thuộc vào ~/.ssh/known_hosts tập tin
  • được yêu cầu chấp nhận một loạt chính
  • để bỏ qua xác nhận chính chủ

Như vậy, câu trả lời có sẵn trên StackExchange không giúp tôi, bao gồm:

Đây là một ví dụ về cách tôi hình dung nó có thể được thiết lập trong maven setup.xml:

<servers> 
    <server> 
    <id>gitcloud.myserver.net:8001</id> 
    <username>git</username> 
    <privateKey>C:/data/home/.ssh/id_rsa</privateKey> 
    <configuration> 
     <knownHostsProvider implementation="org.apache.maven.wagon.providers.ssh.knownhost.SingleKnownHostProvider"> 
     <hostKeyChecking>yes</hostKeyChecking> 
     <contents>codecloud.web.att.com ssh-rsa XXXXA3NvvFakeSSHKEYsdfADA...doLQ==</contents> 
     </knownHostsProvider> 
    </configuration> 
    </server> 
</servers> 

Trả lời

3

Đâ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 SingleKnownHostProviderkhô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.

+1

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

+1

Tôi chưa đề xuất chúng, nhưng tôi sẽ. Cảm ơn. –

Các vấn đề liên quan