2013-04-25 8 views
6

Potrzebuję wykonać zadanie Gradle, które prześle wiele istniejących plików JAR do repozytorium Maven.Przesyłanie wielu istniejących plików JAR do repozytorium Maven za pomocą Gradle

Trudnym elementem jest to, że lista JAR-ów nie jest znana z góry. Sposób, w jaki chcę, aby to działało, polega na pobieraniu najpierw pewnego pliku ".tar.gz", rozpakowywaniu go, a następnie skanowaniu pod kątem JAR-ów i wysyłaniu ich za pomocą konwencji nazewnictwa (np. Użyj nazw JAR jako artefactId's i wersji .tar. gz jako wersja).

Jaki byłby najłatwiejszy sposób na zrobienie tego przy pomocy Gradle? Obecnie jest to prosty skrypt bash, który wyszukuje pliki JAR i uruchamia Maven deploy: deploy-file dla każdego z nich, ale muszę włączyć tę funkcję do skryptu gradle build.

Idealnie potrzebuję zadania typu "deployJars", które przesyła wszystko i zależą od zadania "downloadTarGz".

Aktualizacja:

Jak o POM przesyłania bez jakiegokolwiek JAR z nim związane? Potrzebuję wygenerować kilka POM, które będą zależeć od tych dynamicznie wykrytych JARów i przesłać je również. "artefakty" wymagają podania pliku do przesłania.

Odpowiedz

14

Aby przesłać słoik poprzez Gradle trzeba zadeklarować, że słoik jak publikować artefakt i dodać go do konkretnej konfiguracji za pomocą zamknięcia artefakty:

apply plugin:'maven' 

configurations{ 
    allJars 
} 

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

teraz można konfigurować dynamicznie utworzony zadanie uploadAllJars:

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

Problem polega na tym, że chcesz przesłać wiele artefaktów. Aby to osiągnąć, potrzebujesz więcej dynamiki w swoim skrypcie kompilacji. Dynamiczne tworzenie publikowanych grafik dla wszystkich odkrytych słoików można zawijać w zadanie. W moim przykładzie zadanie discoverAllJars po prostu wyszukuje w określonym folderze pliki jar. Tutaj musisz zaimplementować własną logikę, aby wyszukać słoiki w twoim archiwum tgz.

Aby móc załadować wiele artefaktów w ramach zadania uploadAllJars, należy użyć filtru pom. Aby uzyskać szczegółowe informacje na temat filtru pom, spójrz na gradle userguide pod adresem http://www.gradle.org/docs/current/userguide/maven_plugin.html#uploading_to_maven_repositories

Ponieważ przenieśliśmy konfigurację opublikowanych artefaktów do fazy wykonania gradle, musimy również skonfigurować uploadAllJars w fazie wykonania. Dlatego też utworzę zadanie configureUploadAllJars. Zauważ, w jaki sposób odwoływać pliki jar wykryte za pomocą „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 
        } 
       } 
      } 
     } 
    } 
} 

Teraz wystarczy dodać zależność między uploadAllJars i configureUploadAllJars:

uploadAllJars.dependsOn configureUploadAllJars  

tym przykładzie użyto tej samej grupy wersja dla wszystkich odkrytych plików jar i nazwa jar jako artifactId. możesz to zmienić, jak chcesz, używając mechanizmu pom.

nadzieję, że pomogło,

okrzyki, René

+0

Dzięki René! Dokładnie tego potrzebuję! Jestem nowy w Gradle i nie wiedziałem, że możesz skonfigurować zadania podczas wykonywania.Próbowałem czegoś podobnego za pomocą nowej wtyczki "maven-publish", ale nie działało, ponieważ nie pozwala na modyfikowanie publikacji podczas wykonywania. –

+0

Ok, teraz utknąłem z ładowaniem "surowych" POM (bez żadnych artefaktów z nimi związanych). –

+0

Zadanie 'discoverAllJars' nie działa 4 me.it napotkasz błąd' Nie można znaleźć artefaktów metody() dla argumentów ' – Marks

Powiązane problemy