2013-04-25 29 views
6

Tôi cần triển khai nhiệm vụ Gradle sẽ tải lên nhiều JAR hiện có vào kho lưu trữ Maven.Tải lên nhiều JAR hiện có vào kho lưu trữ Maven với Gradle

Phần khó khăn là danh sách các JAR không được biết trước. Cách tôi muốn nó hoạt động là để dowload một số tập tin ".tar.gz" đầu tiên, untar nó, sau đó quét cho JAR và tải lên chúng với một số loại quy ước đặt tên (như sử dụng tên JAR như artifactId và phiên bản của .tar. gz là phiên bản).

Cách dễ nhất để làm điều đó với Gradle là gì? Hiện tại nó là một tập lệnh bash đơn giản để tìm kiếm các JAR và chạy Maven triển khai: triển khai tập tin cho mỗi người trong số họ, nhưng tôi cần phải kết hợp chức năng đó trong kịch bản xây dựng gradle.

Lý tưởng nhất, tôi cần tác vụ như "deployJars" có thể tải lên mọi thứ và tùy thuộc vào tác vụ "downloadTarGz".

Cập nhật:

Làm cách nào để tải lên POM không có bất kỳ JAR nào được đính kèm? Tôi cần phải tạo ra một số POMs sẽ phụ thuộc vào các JAR được phát hiện động và tải chúng lên. "hiện vật" yêu cầu tôi chỉ định tệp để tải lên.

Trả lời

14

Để tải lên một jar qua gradle bạn phải khai báo jar đó như là một xuất bản tạo tác và thêm nó vào một cấu hình cụ thể bằng cách sử dụng vật đóng cửa:

apply plugin:'maven' 

configurations{ 
    allJars 
} 

artifacts{ 
    allJars file("path/to/jarFile.jar") 
} 

bây giờ bạn có thể cấu hình các uploadAllJars nhiệm vụ tự động tạo ra:

uploadAllJars { 
    repositories { 
     mavenDeployer { 
      repository(url: 'http://localhost:8081/artifactory/acme') { 
       authentication(userName: 'admin', password: 'password'); 
      } 
     } 
} 

Vấn đề là bạn muốn tải lên nhiều hiện vật. Để đạt được điều đó, bạn cần một số động hơn trong kịch bản xây dựng của bạn. Việc tạo ra các bản phát hành năng động cho tất cả các lọ được phát hiện có thể được bao bọc trong một nhiệm vụ. Trong ví dụ của tôi, nhiệm vụ discoverAllJars chỉ đơn giản là tìm trong một thư mục được chỉ định cho các tệp jar. Ở đây bạn cần phải thực hiện logic của riêng bạn để tra cứu các lọ trong kho lưu trữ tgz của bạn.

group = "org.acme" 
version = "1.0-SNAPSHOT" 

task discoverAllJars{ 
    ext.discoveredFiles = [] 
    doLast{ 
     file("jars").eachFile{file -> 
      if(file.name.endsWith("jar")){ 
       println "found file ${file.name}" 
       discoveredFiles << file 
       artifacts{ 
        allJars file 
       } 
      } 
     } 
    } 
} 

Để có thể tải lên nhiều hiện vật trong tác vụ uploadAllJars, bạn phải sử dụng bộ lọc pom. Để biết chi tiết về bộ lọc pom, hãy xem hướng dẫn sử dụng tốt nhất tại http://www.gradle.org/docs/current/userguide/maven_plugin.html#uploading_to_maven_repositories

Vì chúng tôi đã di chuyển cấu hình của các tạo phẩm đã xuất bản sang giai đoạn thực hiện, chúng tôi cũng phải định cấu hình uploadAllJars trong giai đoạn thực thi. Vì vậy, tôi sẽ tạo một tác vụ configureUploadAllJars. Lưu ý cách chúng tôi tham khảo các tập tin jar phát hiện bằng cách sử dụng 'discoverAllJars.discoveredFiles':

task configureUploadAllJars{ 
    dependsOn discoverAllJars 
    doLast{ 
     uploadAllJars { 
      repositories { 
       mavenDeployer { 
        repository(url: 'http://yourrepository/') { 
         authentication(userName: 'admin', password: 'password'); 
        } 
        discoverAllJars.discoveredFiles.each{discoveredFile -> 
         def filterName = discoveredFile.name - ".jar" 
         addFilter(filterName) { artifact, file -> 
          file.name == discoveredFile.name 
         } 
         pom(filterName).artifactId = filterName 
        } 
       } 
      } 
     } 
    } 
} 

Bây giờ bạn chỉ cần thêm một sự phụ thuộc giữa uploadAllJars và configureUploadAllJars:

uploadAllJars.dependsOn configureUploadAllJars  

Ví dụ này sử dụng cùng một nhóm và phiên bản cho tất cả các tệp jar được phát hiện và tên jar là artifactId. bạn có thể thay đổi điều này như bạn muốn bằng cách sử dụng cơ chế lọc pom.

hy vọng rằng đã giúp,

cổ vũ, René

+0

Cảm ơn, René! Đó chính xác là những gì tôi cần! Tôi mới vào Gradle và tôi không biết rằng bạn có thể cấu hình các nhiệm vụ trong quá trình thực thi.Tôi đã thử một cái gì đó tương tự với plugin 'maven-publish' mới, nhưng nó không hoạt động vì nó không cho phép thay đổi các ấn phẩm trong quá trình thực hiện. –

+0

Ok, bây giờ tôi đang mắc kẹt với tải lên "nguyên" POMs (không có bất kỳ hiện vật gắn liền với họ). –

+0

tác vụ 'discoveryAllJars' không hoạt động 4 me.it chạy vào lỗi' Không thể tìm thấy các tạo phẩm phương thức() cho đối số ' – Marks

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