如何将Gradle中的srcpath设置为子目录集合中的特定子目录

如何将Gradle中的srcpath设置为子目录集合中的特定子目录,gradle,Gradle,我正试图将Github现有的开源库(最初创建(目前维护为)一组非常、非常大、非常复杂的Eclipse项目)转化为可以使用Gradle直接在Android Studio中构建的东西 本回购协议中的项目包括: 其依赖项在本回购协议中: awips2核心回购协议具有以下目录结构: ./awips2-core/common/ ./awips2-core/edex/ ./awips2-core/features/ .awips2-core/viz/ 这四个目录分别包含多个项目的顶级目录,名称为“com.

我正试图将Github现有的开源库(最初创建(目前维护为)一组非常、非常大、非常复杂的Eclipse项目)转化为可以使用Gradle直接在Android Studio中构建的东西

本回购协议中的项目包括:

其依赖项在本回购协议中:

awips2核心回购协议具有以下目录结构:

./awips2-core/common/
./awips2-core/edex/
./awips2-core/features/
.awips2-core/viz/
这四个目录分别包含多个项目的顶级目录,名称为“com.raytheon.uf.common.util”

这些目录具有以下内容(以“util”项目为例):

我在c:\src\awips2 Core Android中创建了Android Studio项目,其中包含一个名为“app”的最小活动和模块,然后将两个Git repo签出到项目根目录的子目录中:

cd \src\awips2core-android
git clone https://github.com/unidata/awips2-core
git clone https://github.com/unidata/awips2-core-foss
然后我修改了settings.gradle:

include ':awips2core'
include ':app'

project(':awips2core').projectDir = new File('./awips2-core')
。。。并添加了/src/awips2 core android/awips2 core/build.gradle:

apply plugin: 'java'

sourceSets {
    main {
        java {
            srcDirs = ['common/com.raytheon.uf.common.util/src', 'common/com.raytheon.uf.common.wxmath/src']
        }
    }
}

dependencies {
    compile fileTree(dir: '../awips2-core-foss')
}
这很有效

问题是: 我在common/下还有41个srcdir,如果把edex/、features/和viz/下的srcdir包括在内,几乎有100个srcdir

我想做的是以编程方式添加它们,而不是逐个添加。用Java术语来说,类似于:

List<File> srcPaths = new ArrayList<File>();
String[] paths =  {"common", "features", "edex", "viz"};
for(String subdir : paths) {
    // the path "c:/src/awips2core-android/awips2-core" would be implied by the project's definition in gradle.settings
    File projDir = new File("c:/src/awips2core-android/awips2-core", subdir);
    File[] subprojectDirs = projDir.listFiles();
    for (File dir : subprojectDirs)
        srcPaths.add(new File(dir, "src"));
}

// now, set set Gradle's srcDirs to srcPaths' elements...
List srcPaths=new ArrayList();
字符串[]路径={“公共”、“特征”、“edex”、“viz”};
用于(字符串子目录:路径){
//项目在gradle.settings中的定义将暗示路径“c:/src/awips2 core android/awips2 core”
File projDir=新文件(“c:/src/awips2内核android/awips2内核”,subdir);
File[]subprojectDirs=projDir.listFiles();
用于(文件目录:子项目目录)
添加(新文件(dir,“src”);
}
//现在,将Gradle的srcdir设置为srcPaths的元素。。。

所以如何在Groovy for Gradle中实现这一点,或者使用Gradle实现这一点的正确方法是什么?

这听起来像是一个多项目构建:

我要么将所有内容放在同一个根目录下,要么将foss放在一个单独的项目中创建jar文件并发布到某个地方(mavenLocal进行测试),然后从awips2核心项目创建一个多项目

更新

gradle最大的优点是构建文件也是代码

我没有尝试您的java代码,但这应该或多或少可以收集目录,因为它在groovy中也是有效的。一旦将目录收集到一个集合中(根据gradle文档,srcDirs是一个集合),就可以在sourceSets块中使用它

我会使用streams沿此写一些东西:

def srcPaths = ["common", "features", "edex", "viz"].stream()
        .map { new File(projectDir, it) }
        .flatMap { it.listFiles().toList().stream() }
        .map { new File(it, "src") }
        .toSet()

sourceSets {
    main {
        java {
            srcDirs = srcPaths
        }
    }
}


检查重写的问题。。。我重新修改了项目结构,认为我在正确的总体方向上遇到了障碍(因为我通过显式地为srcpath指定两个Eclipse子项目,迈出了一小步),但现在我一直在试图弄清楚如何使用Groovy语法为所有子目录编程地生成srcpath。
def srcPaths = ["common", "features", "edex", "viz"].stream()
        .map { new File(projectDir, it) }
        .flatMap { it.listFiles().toList().stream() }
        .map { new File(it, "src") }
        .toSet()

sourceSets {
    main {
        java {
            srcDirs = srcPaths
        }
    }
}