Я борюсь с жизненным циклом сборки Gradle; особенно с разделением между фазами configuration
и execution
. Я прочитал несколько разделов в руководстве по Gradle и видел несколько идей в Интернете, но не нашел решения следующей проблемы:
Я хочу запустить определенную задачу для создания артефакта в конце моей сборки java-library-distribution
, который представляет собой сглаженную версию jar-файлов конфигурации runtime
. То есть я хочу создавать артефакт только тогда, когда запускаю конкретную задачу по созданию артефакта.
Я создал следующую задачу:
task packageSamplerTask(type: Tar, dependsOn: distTar) {
description "Packages the build jars including dependencies as a flattened tar file. Artifact: ${distsDir}/${archivesBaseName}-${version}.tar"
from tarTree("${distsDir}/${archivesBaseName}-${version}.tar").files
classifier = 'dist'
into "${distsDir}/${archivesBaseName}-dist-${version}.tar"
}
Хотя эта задача действительно создает требуемый артефакт, задача выполняется во время фазы configuration
gradle. Такое поведение имеет следующие последствия:
- Независимо от того, какую задачу я запускаю из командной строки, эта
packageSamplerTask
задача запускается всегда, часто без необходимости; и - Если я
clean
проект, то при следующем запуске сборка завершится ошибкой, потому что$distsDir
не существует на этапеconfiguration
(очевидно).
Похоже, что если я расширяю задачу Copy
таким образом, я всегда буду получать такое преждевременное поведение.
Есть ли способ использовать объявления << closure
/doLast
, чтобы получить то, что я хочу? Или есть что-то еще, что я упускаю/должен делать?
Обновить
После дальнейшей работы я уточнил свои требования и решил свой вопрос следующим образом (в частности):
"Я хочу упаковать свой код и зависимости моего кода в виде плоского архива jar-файлов, который можно развернуть как подключаемый модуль jMeter. Затем пакет можно установить, распаковав в каталог jMeter
lib/ext
как есть. Таким образом, пакет , не должны включать JAR-файлы jMeter (и их зависимости), которые используются для сборки и тестирования"
Поскольку Gradle
не поддерживает подобное Maven управление зависимостями provided
, я создал новую конфигурацию для своего пакета, исключающую JAR-файлы jMeter.
configurations {
jmpackage {
extendsFrom runtime
exclude group: 'org.apache.jmeter', name: 'ApacheJMeter_core', version: '2.11'
exclude group: 'org.apache.jmeter', name: 'ApacheJMeter_java', version: '2.11'
}
}
А затем создал следующую задачу (используя рекомендацию по закрытию от Питера Нидервизера):
task packageSamplerTask(type: Tar, dependsOn: assemble) {
from { libsDir }
from { configurations.jmpackage.getAsFileTree() }
classifier = 'dist'
}
Похоже, это решение работает и позволяет мне использовать только плагин Gradle
java
.
distsDir
? - person Opal   schedule 10.08.2014distsDir
задается как часть подключаемого модуля Java. Вы найдете упоминание об этом в документации Gradle здесь. - person s5b   schedule 11.08.2014