Я изучил тысячи подобных вопросов по SO, и я все еще потерялся.У меня есть простая многопроектная сборка:
rootProject.name = 'mwe'
include ":Generator"
include ":projectB"
include ":projectC"
с верхним уровнем build.gradle
следующим образом (settings.gradle
):
plugins { id "java" }
allprojects { repositories { jcenter() } }
и с двумя типами файлов проекта build.gradle,Первый (Generator
) предоставляет команду запуска, которая запускает генератор с аргументом командной строки:
plugins {
id "application"
id "scala"
}
dependencies { compile "org.scala-lang:scala-library:2.12.3" }
mainClassName = "Main"
ext { cmdlineargs = "" }
run { args cmdlineargs }
Генератор кода должен вызываться из projectB (и аналогичного projectC, и многих других),Я пытаюсь сделать это следующим образом (projectB / build.gradle):
task TEST {
project (":Generator").ext.cmdlineargs = "Hurray!"
println ("Value set:" + project(":Generator").ext.cmdlineargs )
dependsOn (":Generator:run")
}
Что бы я ни пытался сделать (новичок здесь), я не получаю то, что мне нужно.У меня две проблемы:
- Свойство
cmdlineargs
не установлено в момент запуска задачи :projectB:TEST
.println
видит правильное значение, но аргумент, передаваемый исполняемому основному методу, - это аргумент, настроенный в Generator/build.gradle
, а не аргумент в projectB/build.gradle
.Как указывалось в ответах, это может быть обходной прием с использованием отложенной оценки свойств, но это не решает вторую проблему. - Генератор запускается только один раз, даже если я собираю и
projectB
, и projectC
.Мне нужно запустить Generator:run
для каждого из projectB
и projectC
отдельно (для генерации разных источников для каждого зависимого проекта).
Как мне заставить это работать?Я полагаю, что нужна совершенно другая стратегия.Мне не нужно использовать командную строку и запустить;Я также могу попытаться запустить основной класс генератора более напрямую и передать ему аргументы, но я нахожу задачу запуска довольно удобной (сложный путь к классу устанавливается автоматически и т. Д.).Генератор - это сам проект Java / Scala, который скомпилирован в одной и той же многопроектной сборке.