Gradle - загрузка всех версий jar одного groupID:artifactID из Artifactory
Я использую Gradle для создания проекта (Java).
Gradle 2.3, Java7 / 8. Работает отлично.
Чтобы построить проект, мы определяем, какие все библиотеки нам нужны на этапах компиляции, тестирования (testRuntime) и выполнения, и мы определяем все эти библиотеки в разделе зависимостей, например:
dependencies {
compile 'some_groupID:some_artifactID:some_version_x.y.z@ext_if_any'
testRuntime 'SomeOtherOrSame_groupID:some_other_or_same_artifactID:some_version_x.y.z@ext_if_any'
runtime 'SomeOtherOrSame_groupID:some_other_or_same_artifactID:some_version_x.y.z@ext_if_any'
}
У нас есть несколько таких записей в разделе зависимостей для всех библиотек, которые понадобятся нашему приложению / службе для запуска сборок / тестов / ИТ-тестов и т. Д. (Во время выполнения).
Пока Gradle хорошо работает и загружает все артефакты из Artifactory.
Я работаю над проектом, в котором мне нужно получить все версии артефакта (что все доступно в разделе зависимостей) для одного groupID: только artifactID), то есть мне нужен следующий.jar (расширение по умолчанию) и создать ZIP-файл, содержащий все версионные файлы.jars:
compile 'my.company.com:cool_library:1.0.0'
compile 'my.company.com:cool_library:1.0.1'
compile 'my.company.com:cool_library:1.1.0'
compile 'my.company.com:cool_library:1.2.0'
runtime 'my.company.com:another_cool_library:1.0.0'
runtime 'my.company.com:another_cool_library:1.2.0'
runtime 'my.company.com:cool_library:1.0.1'
Я знаю, как создать файл.zip в Gradle (это легко), но Gradle НЕ получает / не загружает все файлы.jar (для каждой версии, как я перечислил выше) из Artifactory или из заданной системы двоичного репозитория.
Он получает только последнюю версию (т.е. cool_service-1.2.0.jar). Gradle делает это хорошо, потому что, таким образом, у вас не будет дублирующегося класса в пути к классу, исходящего из того же проекта (cool_library), и из-за этого его различные версии упоминаются в разделе зависимостей.
Кто-то скажет, зачем мне нужны старые версии, когда последний / самый лучший код есть в версии 1.2.0 cool_library и если проект, который использует эту библиотеку, хочет этого, просто скажите, что я хочу my.company.com:cool_library:1.2.0 и покончим с этим или получите любую единственную версию, которую вы хотите для компиляции. В моем случае, команда разработчиков написала код приложения таким образом, что они определяют здесь cool_library-1.0.0.jar, но где-то в другом месте - cool_library-1.2.0.jar. По сути, мне нужно все, что определил разработчик в файле build.gradle.
Как я могу создать файл custom_zip.zip, в котором будут все файлы cool_library-xyzjar, которые я упомянул в разделе зависимостей для заголовка "compile".
Благодарю.
2 ответа
Используя этот замечательный инструмент, это возможно. Прочитайте все это (для различных способов сделать вещи).
Задача загрузки Link Gradle: https://github.com/michel-kraemer/gradle-download-task
Например: в вашем build.gradle у вас будет это:
plugins {
id "de.undercouch.download" version "1.2"
}
import de.undercouch.gradle.tasks.download.Download
apply plugin: 'java'
apply plugin: 'de.undercouch.download'
repositories {
maven {
url "http://yourartifatory:1020/artifactory/virtual-repos"
}
}
//Lets says, I want to download my.company.com:CoolServices:1.0 jar or any extension file
//Then I can create a list and specify what all I need as:
def deps = [
[ "my/company/com", "CoolServices", "1.0", "jar" ],
[ "my/company/com", "CoolServices", "1.1", "jar" ],
[ "my/company/com", "CoolServices", "1.2", "jar" ]
]
task downloadArts << {
//Iterate over each dependencies as per the list
deps.each { groupId, artifactId, version, extn ->
download {
src "http://yourartifactory.fqdn.com:1020/artifactory/simple/some-physical-actual-repository-local/$groupId/$artifactId/$version/$artifactId-$version.$extn"
dest buildDir
//If you want the downloaded files inside build/xxx folder, create that xxx folder first outside of the clousure i.e. file("build/xxx").mkdir()
}
}
}
Теперь запустите " gradle clean downloadArts ", и он напечатает то, что собирается загрузить / line, и внутри папки build или build / xxx, где вы найдете все ваши загруженные файлы (файлы с расширением.jar / etc, которые вы упомянули в переменная списка deps).
Вы также можете использовать его для вставки в раздел зависимостей для компиляции, выполнения, testRuntime ИЛИ создать файл custom_zip.zip, если это необходимо.
Например:
dependencies {
compile fileTree( dir: "build", include: '*.*' )
runtime fileTree( dir: "build/xxx", include: '*.*' )
}
Или создайте файл custom_zip.zip (содержащий все загруженные файлы.jar/extension).
У меня есть простой проект, который я использую для загрузки определенных выпусков зависимостей в каталог, который я затем загружаю в наше локальное хранилище IVY, чтобы мы могли контролировать и иметь в наличии определенные версии программного обеспечения в случае их исчезновения.
Суть его в том, чтобы использовать ant.retrieve, чтобы вытащить файлы из внешнего репозитория для нужной вам версии в каталог, а затем делать с ними, как вы захотите.
Это не полный сценарий, но я надеюсь, что этого хватит для работы. Ant будет использовать директорию ivy-cache для кеша, и ваш репозиторий, содержащий все ваши файлы jar, будет находиться в ivy-repo
реж. Вы можете настроить задачу antRetrieve, чтобы сгладить структуру вашего файла (изменить переменные шаблона) и удалить файлы ivy / src по своему усмотрению, но я представляю вам скрипт, который у меня есть:
project.ext.REPO_DOWNLOADER_DIR = "ivy-repo"
project.ext.IVY_SETTINGS = 'ivy-settings.xml'
project.ext.IVY_CACHE = file('ivy-cache')
dependencies {
compile ':ivy:2.3+'
}
def antRetrieve(dep) {
// in each of the following patterns, the file will be downloaded with the [name] values filled in correctly,
// e.g. from ant:retrieve(..."src,source"), the [type] will be either "src" or "source" depending on which was available to download.
def jarPattern = "$REPO_DOWNLOADER_DIR/[organisation]/[revision]/[module]/[type]s/[artifact]-[revision].[ext]"
def srcPattern = "$REPO_DOWNLOADER_DIR/[organisation]/[revision]/[module]/[type]s/[artifact]-[revision](-[classifier]).[ext]"
def docPattern = "$REPO_DOWNLOADER_DIR/[organisation]/[revision]/[module]/[type]s/[artifact]-[revision](-[classifier]).[ext]"
def ivyPattern = "$REPO_DOWNLOADER_DIR/[organisation]/[revision]/[module]/ivy.xml"
def (org, module, rev) = dep.split(':')
println "retrieving $org:$module:$rev"
ant.retrieve(inline: "true", type: "jar,bundle", transitive: "true", pattern: "$jarPattern", ivypattern: "$ivyPattern", organisation: "$org", module: "$module", revision: "$rev", conf: "runtime,default")
ant.retrieve(inline: "true", type: "src,source,sources", transitive: "true", pattern: "$srcPattern", organisation: "$org", module: "$module", revision: "$rev", conf: "sources")
ant.retrieve(inline: "true", type: "doc,docs,javadoc,javadocs", transitive: "true", pattern: "$docPattern", organisation: "$org", module: "$module", revision: "$rev", conf: "javadoc")
}
task retrieve << {
ant.taskdef(resource: 'org/apache/ivy/ant/antlib.xml', classpath: configurations.compile.asPath)
ant.properties['repo.downloader.cache'] = IVY_CACHE
ant.settings(file: IVY_SETTINGS)
if (project.hasProperty('modules')) {
def moduleList = project.modules.split(',')
moduleList.each { module ->
antRetrieve(module)
}
}
if (project.hasProperty("modfile")) {
def modulesFile = file(project.modfile)
if (! modulesFile.exists()) {
throw new GradleException("Could not find specified modules file: $modulesFile")
}
modulesFile.eachLine { module ->
antRetrieve(module)
}
}
}
Затем файл ivy-settings.xml устанавливает внешние репозитории, из которых вы хотите извлечь ant. Добавьте любые дополнительные, как вы считаете нужным (например, clojars для clojure jar):
<ivysettings>
<settings defaultResolver="spring-chain" />
<caches defaultCacheDir="${repo.downloader.cache}" />
<resolvers>
<chain name="spring-chain">
<url name="com.springsource.repository.bundles.release">
<ivy pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
<artifact pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
</url>
<url name="com.springsource.repository.bundles.external">
<ivy pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
<artifact pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
</url>
<ibiblio name="ibiblio" m2compatible="true" />
<ibiblio name="uk-maven" m2compatible="true" root="http://uk.maven.org/maven2"/>
</chain>
</resolvers>
</ivysettings>
Вы можете назвать все это одним из следующих способов:
./gradlew retrieve -Pmodules='a:b:1.0,x:y:1.1'
./gradlew retrieve -PmodFile='/path/to/modlist.txt'
который позволяет вывести все версии в текстовый файл или указать их в командной строке.
Это также опустит зависимости. Единственное, что он не делает, это извлекает src-файлы для зависимостей (это делает для основного именованного архива), но у меня есть сценарий оболочки, который просто запрашивает директории в поисках отсутствующего src и выполняет итерацию retrieve
Задача с тем, как основные записи, но если вы не после источников, то все будет в порядке.
Если вы примете эту стратегию, вам еще предстоит проделать определенную работу, но она загрузит все файлы для любой зависимости, которую вы захотите, и вы можете отключить и сжать их все в соответствии с вашими потребностями. Вышеуказанное просто работает для прямой загрузки в локальный репозиторий ivy.