Зависимость проекта Gradle не создает проект зависимости

У меня есть мультипроект Gradle.

Одним из проектов является проект Flex, который построен с использованием плагина gradleFx.

Второй - военный проект, и мне нужно включить SWF-файл из проекта Flex в войну.

я добавить

war { 
  from (project(":flex:FlexManager").buildDir) {into ('flash')}
}

и это действительно помещает СФБ в войну, но только если ФГО уже существует.

Тогда я хочу, чтобы gradle собрал проект: flex: FlexManager во время сборки моей войны. Итак, я добавляю

dependencies {
  ....
  runtime project(path : ':flex:FlexManager')
}

Единственный способ начать сборку проекта Flex во время войны был

war { 
  ...
   dependsOn ':flex:FlexManager:build'
}

но это выглядит не лучшим образом - я предпочитаю определять зависимости проекта вместо задач задач

2 ответа

Решение

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

Сказал, что для задачи, которая собирает ваш SWF-файл, необходимо указать его выходные данные. Я быстро взглянул на GradleFx и, к сожалению, похоже, что задача compileFlex этого не делает. Итак, сначала вам нужно будет указать выходные данные для задачи следующим образом:

compileFlex {
    outputs.dir project.buildDir
}

а затем измените конфигурацию вашей боевой задачи:

war {
    from project(":flex:FlexManager").compileFlex {
        into ('flash')
    }
}

Вы, вероятно, также должны быть недовольны разработчиками GradleFx, чтобы добавить результаты к своим задачам.:)

РЕДАКТИРОВАТЬ:

Из обсуждения в комментариях я понял, что вместо зависимости от задачи вы можете зависеть от артефакта проекта. Самый простой способ - создать пользовательскую конфигурацию, добавить к ней зависимость и затем использовать ее в вызове from при настройке военного задания:

configuration {
    flex
}

dependencies {
    flex project(':flex:FlexManager')
}

war {
    from configurations.flex {
        into ('flash')
    }
}

Вы также можете использовать архивы или конфигурацию по умолчанию :flex:FlexManager непосредственно:

war {
    from project(':flex:FlexManager').configurations.archives {
        into ('flash')
    }
}

В моем проекте было похожее требование. Мне нужно включить SWF-файл, который является выводом проекта Flex в проект Java и построить войну.

1. I created a two sub project under war project, flex and java.
2. Included them in settings file.
3. The main build.gradle file has basic configuration.
4. In flex sub project gradlefx plugin is applied and the output swf file is copied to the directory using a copy task.
5. In java sub project war plugin is applied and the source directory is mentioned from which war has to be generated.

Вот пример кода для вашей справки:

settings.xml:

include myproject,
myproject:mysubproject:flex,
myproject:mysubproject:java

файл build.gradle в директории myproject:

buildscript {
    dependencies {
        classpath project (":FlexProject") //include all the flex project from which the swf file to be included
    }
}
dependencies {
    classpath project (":JavaProject") //include all the dependent java project if any
}

sourceSets {
  main {
    output.classesDir   = 'root/WEB-INF/classes' //This is the directory from which I am going to generate war.
  }
}

Файл build.gradle в каталоге myproject/mysubproject/flex:

apply plugin: 'gradlefx'
type = 'swf'
dependencies{
    merged project (":FlexProject")
}

String rootProjectDir = rootDir
rootProjectDir = rootProjectDir.replaceAll("\\\\","/")

task copyTask <<{
    copy{
        from rootProjectDir +'/MyFlexProject1/build'
        into rootProjectDir +'/myproject/root'
        include '**/*.swf'
    }
}
build.finalizedBy(copyTask)

Файл build.gradle в каталоге myproject/mysubproject/java:

String rootProjectDir = rootDir
rootProjectDir = rootProjectDir.replaceAll("\\\\","/")
String rootProjectDirDocRoot = rootProjectDir + '/myproject/root'

dependencies {
    compile project (":JavaProject")    //to include dependent jars in war
}

group = "com.abc.enterprise"
archivesBaseName = "myprojet"
description = "myproject"
apply plugin: 'war'

war{
    from rootProjectDirDocRoot
    exclude('.gradle')
    exclude('.settings')
}

Это будет компилировать проект flex каждый раз, и он будет включен в каталог, из которого должна быть построена война. Надеюсь это поможет.

Другие вопросы по тегам