1

我有一个 Gradle 多项目。

其中一个项目是 Flex 项目,它是使用 gradleFx 插件构建的。

第二个是战争项目,我需要将 Flex 项目中的 SWF 文件包含到战争中。

我加

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

它确实使 SWF 陷入战争,但前提是 SWF 已经存在。

然后我希望 gradle 在构建我的战争期间构建 :flex:FlexManager 项目。所以我添加

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

我发现在战争构建期间启动 flex 项目构建的唯一方法是

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

但它看起来不是最好的方法 - 我更喜欢定义项目依赖项而不是任务依赖项

4

2 回答 2

2

您需要更改的只是指定要从任务或任务输出而不是目录复制 - 这将注册您的战争任务和构建 swf 文件的任何任务之间的隐式依赖关系。

表示构建 swf 文件的任务有必要指定其输出。我快速浏览了 GradleFx,不幸的是,compileFlex 任务似乎没有这样做。因此,首先您需要通过以下方式指定任务的输出:

compileFlex {
    outputs.dir project.buildDir
}

然后修改你的war任务配置:

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

您可能还应该唠叨 GradleFx 开发人员为他们的任务添加输出。:)

编辑:

从评论中的讨论中,我了解到,您可以依赖项目工件,而不是依赖任务。最干净的方法是创建一个自定义配置,为其添加依赖项,然后在配置 war 任务时在 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')
    }
}
于 2013-02-14T17:54:29.650 回答
0

我的项目中有类似的要求。我需要将作为 flex 项目输出的 swf 文件包含到 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.

这是一个示例代码供您参考:

设置.xml:

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

myproject 目录中的 build.gradle 文件:

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.
  }
}

myproject/mysubproject/flex 目录中的 build.gradle 文件:

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)

myproject/mysubproject/java 目录中的 build.gradle 文件:

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 项目,并且他的 swf 文件将包含在必须从中构建战争的目录中。希望这可以帮助。

于 2016-04-29T10:44:53.307 回答