Каталог сборки проекта gradle не существует
Попытка создать файл свойств (foo.properties) и добавить его в корень войны.
apply plugin: 'war'
task createProperties {
FileOutputStream os = new FileOutputStream("${project.buildDir}/foo.properties");
...
}
war {
dependsOn createProperties
from "${project.buildDir}/foo.properties"
...
}
Что пошло не так:
A problem occurred evaluating project ':app'.
> E:\app\build\build.properties (The system cannot find the path specified)
Нужно ли создавать каталог сборки?
для войны есть ли выходной каталог для веб-приложения? (sourceSet: src/main/webapp) Лучше создать foo.properties
прямо под выходным каталогом приложения.
2 ответа
Ты должен сделать
war {
from createProperties
...
}
это автоматически добавит неявную зависимость к задаче createProperties, поэтому нет необходимости в зависимости от.
Чтобы это работало, вам нужно указать вывод вашего createProperties
чисто как
task createProperties {
outputs.file("$buildDir/foo.properties")
doLast {
FileOutputStream os = new FileOutputStream("$buildDir/foo.properties");
...
}
}
Но на самом деле вы должны использовать задачу типа WriteProperties
, который выглядит чище и лучше для воспроизводимых сборок. Что-то вроде этого:
task createProperties(type: WriteProperties) {
outputFile "$buildDir/foo.properties"
property 'foo', 'bar'
}
Если ваши свойства рассчитываются динамически, а не статически (что, как я полагаю, в противном случае вы могли бы просто создать файл вручную), вы также должны установить динамические части в качестве входных данных задачи, чтобы современные проверки задач работали правильно и Задача запускается только при необходимости, потому что некоторые входные данные изменились.
Попробуйте вот так:
task createProperties {
doFirst {
FileOutputStream os = new FileOutputStream("${project.buildDir}/foo.properties");
...
}
}
Пояснение с примером:
task foo {
println 'foo init line'
doFirst {
println 'foo doFirst'
}
doLast {
println 'foo doLast'
}
}
task bar {
println 'bar init line'
doFirst {
println 'bar doFirst'
}
doLast {
println 'bar doLast'
}
}
Теперь для командира gradle clean bar
Вы получите как результат:
foo init line
bar init line
:clean
:foo
foo doFirst
foo doLast
:bar
bar doFirst
bar doLast
clean
шаг пошел после этапа инициализации, следовательно, в вашем случае, foo.properties
стирается, прежде чем пытаться найти.