2013-02-10 5 views
0

У меня есть многопроектный (несколько подпроектов java) в классе, и я планирую загрузить его в репозиторий maven (в настоящее время локальный), в том числе артефакты и javadoc , Я просто добавить следующий код для каждого подпроекта, а затем maven install делает работу:Перемещение общего кода в `subprojects {}` block breaks build

apply plugin: 'maven' 

task sourcesJar(type: Jar, dependsOn:classes) { 
     from sourceSets.main.allSource 
     classifier = 'sources' 
} 
task javadocJar(type: Jar, dependsOn:javadoc) { 
     from javadoc.destinationDir 
     classifier = 'javadoc' 
} 
artifacts { 
     archives jar 
     archives sourcesJar 
     archives javadocJar 
} 

Теперь его не так приятно иметь один и тот же код в 10 подпроектов, поэтому я решил, что будет перенести этот код в subprojects { ... } конфигурации родительский проект. Однако теперь это больше не работает: создаются только пустые источники и javadoc jars, нормальный jar игнорируется, а maven install больше не копирует файлы в локальный репозиторий maven. Как это сделать правильно?

Спасибо.

ответ

1

Сценарий сборки родительского проекта оценивается перед его скриптами сборки подпроектов. Когда вы поднимаете какой-то код в сценарий сборки родительского проекта, вам нужно убедиться, что порядок оценки остается неизменным, то есть, что снятый код не с нетерпением читает свойства, которые задаются только сценарием сборки подпроекта. Например, если javadoc.destinationDir задан сценарием сборки подпроекта, вам придется либо снять этот код, либо отложить оценку выражения from javadoc.destinationDir в родительском скрипте сборки.

Существует несколько методов для отсрочки оценки. Некоторые свойства (например, задачи архива from и into) принимают закрытие; поэтому вы можете просто сделать from { javadoc.destinationDir }. Другой вариант - использовать крючки, такие как gradle.projectsEvaluated {}, project.afterEvaluate {}, или task.doFirst {}. Первый шаг в определении того, какой метод использовать, - это поиск соответствующего объекта в Gradle Build Language Reference.

Не видя больше ваших сценариев сборки, я думаю, что ваши конкретные проблемы связаны с тем, что не снимают apply plugin: "java" в блок subprojects {} родительского скрипта.

Альтернативой инъекции конфигурации (например, через subprojects {}) является включение общего кода в отдельный сценарий сборки, а сценарии построения проекта включают этот код с apply from:. В некоторых случаях это более простой способ (выборочно) совместного использования кода, чем инсталляция конфигурации. Часто два подхода используются вместе.

+0

Привет, Питер, спасибо, переместив «применить плагин:« java »в« подпроекты », решила проблему! –

 Смежные вопросы

  • Нет связанных вопросов^_^