Каталог сборки проекта 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 непосредственно под выходным каталогом веб-приложения.


person eastwater    schedule 29.06.2017    source источник


Ответы (2)


Ты должен сделать

 war {
      from createProperties
      ...
 }

это автоматически добавит неявную зависимость от задачи createProperties, поэтому нет необходимости в dependOn.

Чтобы это работало, вам нужно четко указать вывод вашего 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'
}

Если ваши свойства рассчитываются динамически, а не статически (как я предполагаю, иначе вы могли бы просто создать файл вручную), вы также должны установить динамические части в качестве входных данных задачи, чтобы проверки актуальности задач работали правильно, а задача запускается только при необходимости, потому что некоторые входные данные изменились.

person Vampire    schedule 29.06.2017
comment
в чем разница между $buildDir и ${project.buildDir}? Спасибо. - person eastwater; 29.06.2017
comment
Его нет, вам просто не нужно квалифицировать вызов. Вы также можете использовать ${project.buildDir}, они действительно идентичны в этом контексте. - person Vampire; 29.06.2017

Попробуйте так:

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 стирается перед попыткой найти.

person ToYonos    schedule 29.06.2017
comment
в этом случае $project.buildDir не совпадает с $buildDir? - person LazerBanana; 29.06.2017
comment
Тот же объем, то же значение, project. здесь можно опустить - person ToYonos; 29.06.2017