Dependencies Gradle:如何在多项目脚本中对依赖项进行分组?

Dependencies Gradle:如何在多项目脚本中对依赖项进行分组?,dependencies,gradle,grouping,multi-project,Dependencies,Gradle,Grouping,Multi Project,我们的Gradle脚本由根“war”项目和多个(10+)子“jar”项目组成。 每个JAR项目都依赖于许多(30-60)JAR。 部分示例: dependencies { compile 'dwr:dwr:3.0.0.117' compile 'annotations:annotations:1.0' compile 'abdera:abdera-core:0.4.0-incubating' compile 'abdera:abdera-extensions-

我们的Gradle脚本由根“war”项目和多个(10+)子“jar”项目组成。 每个JAR项目都依赖于许多(30-60)JAR。 部分示例:

dependencies {
    compile 'dwr:dwr:3.0.0.117'
    compile 'annotations:annotations:1.0' 

    compile 'abdera:abdera-core:0.4.0-incubating'
    compile 'abdera:abdera-extensions-json:0.4.0-incubating'
    compile 'abdera:abdera-extensions-main:0.4.0-incubating'
    compile 'abdera:abdera-i18n:0.4.0-incubating'
    compile 'abdera:abdera-parser:0.4.0-incubating'


    compile 'aopalliance:aopalliance:1.0'

    compile 'apacheds:apacheds-core:1.0.2'
    compile 'apacheds:apacheds-core-shared:1.0.2'
    compile 'apacheds:apacheds-kerberos-shared:1.0.2'
    compile 'apacheds:apacheds-protocol-changepw:1.0.2'
    compile 'apacheds:apacheds-protocol-kerberos:1.0.2'
    compile 'apacheds:apacheds-protocol-ldap:1.0.2'
    compile 'apacheds:apacheds-protocol-ntp:1.0.2'
    compile 'apacheds:apacheds-protocol-shared:1.0.2'
    compile 'apacheds:apacheds-server-jndi:1.0.2'
    compile 'apacheds:apacheds-server-main:1.0.2'
    compile 'apacheds:apacheds-server-ssl:1.0.2'

    compile 'commons:commons-logging:1.0.4'
    compile 'commons:commons-beanutils'
    compile 'commons:commons-cli:1.0'
    compile 'commons:commons-codec:1.3'
    compile 'commons:commons-collections:3.2.1'
    compile 'commons:commons-digester'
    compile 'commons:commons-discovery:0.2'
    compile 'commons:commons-fileupload:1.2'
    compile 'commons:commons-io:1.2'
    compile 'commons:commons-lang:2.4'
    compile 'commons:commons-pool:1.5.4'

    compile 'dom4j:dom4j-full'
    compile 'ehcache:ehcache:1.6.2'
    compile 'eigenbase:eigenbase-properties'
    compile 'eigenbase:eigenbase-resgen'
    compile 'eigenbase:eigenbase-xom'
    compile 'FastInfoset:FastInfoset:1.2.7'
    compile 'fop:fop'
    compile 'freehep:freehep-export:2.1.1'
    compile 'freehep:freehep-graphics2d:2.1.1'
    compile 'freehep:freehep-graphicsio:2.1.1'
    compile 'freehep:freehep-graphicsio-emf:2.1.1-adapted'
    compile 'freehep:freehep-graphicsio-java:2.1.1'
    compile 'freehep:freehep-graphicsio-pdf:2.1.1'
    compile 'freehep:freehep-graphicsio-ps:2.1.1'
    compile 'freehep:freehep-graphicsio-svg:2.1.1'
    compile 'freehep:freehep-graphicsio-swf:2.1.1'
    compile 'freehep:freehep-graphicsio-tests:2.1.1'
    compile 'freehep:freehep-io:2.0.2'
    compile 'freehep:freehep-swing:2.0.3'
    compile 'freehep:freehep-util:2.0.2'
    compile 'freehep:freehep-xml:2.1.1'
}
我希望避免每个组件都有如此长的重复依赖项列表。
应该有一种方法来对依赖项进行分组,例如“freehep”、“commons”、“apacheds”、“abdera”、“dwr”,并且每个组件都会引用这些组

将以下内容添加到根项目:

ext {
  apache_commons = [ 'commons-io:commons-io:2.4', 'org.apache.commons:commons-lang3:3.1' ]
}
然后将其包含在子项目中,如下所示:

dependencies {
  compile apache_commons
}
通过这种方式,您可以定义任意多个依赖项列表,并以任意组合的方式,尽可能频繁地包含它们

您可以定义一个具有某种名称的“超级项目”,例如“myProject”,并将当前的所有项目作为子项目放到这个项目中

project(':myProject') {
    subprojects {
        dependencies {
            // your global dependencies
        }
    }

    project('myWarProject') {
    }

    project('myJarProject1') {
    }

    project('myJarProject2') {
    }
}
但我认为,组织这样的项目不是一个好主意。我真的不明白为什么有这么多的项目具有相同的依赖关系。通常,您应该有一个具有所有war特定依赖项的war项目,以及一些具有API和已定义接口实现的其他非war相关项目。在这种情况下,API项目的所有依赖项将自动添加为所有其他项目的可传递项,您只需将API项目定义为编译依赖项

def jar1 = project('myJarProject1') {
    dependencies {
        // dependencies of project-1
    }
}

def jar2 = project('myJarProject2') {
    dependencies {
        // dependencies of project-2
    }
}

project('myWarProject') {
    dependencies {
        compile jar1 // includes all project-1 dependencies as transitive
        compile jar2 // includes all project-2 dependencies as transitive

        // add war-specific dependencies here

    }
}