2013-12-25 3 views
1

Наш сценарий Gradle состоит из корневого проекта «война» и нескольких (10+) дочерних проектов «jar». Каждый проект JAR зависит от многих (30-60) JAR. Частичный пример:Gradle: Как группировать зависимости в многопроектном скрипте?

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», и каждый компонент будет ссылаться на эти группы.

ответ

3

Добавьте следующий к корневому объекту:

ext { 
    apache_commons = [ 'commons-io:commons-io:2.4', 'org.apache.commons:commons-lang3:3.1' ] 
} 

затем включить его в подпроектов, как это:

dependencies { 
    compile apache_commons 
} 

Таким образом, вы можете определить, как много списков зависимостей, как вы хотите, и включить их в качестве часто, как вы хотите, в любых комбинациях.

0

Вы можете определить «суперпроект» с некоторым именем, например. 'myProject' и поместить все ваши текущие проекты в это как подпроекты.

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

    project('myWarProject') { 
    } 

    project('myJarProject1') { 
    } 

    project('myJarProject2') { 
    } 
} 

Но я думаю, что это не очень хорошая идея для организации подобных проектов. Я не понимаю, почему у вас так много проектов с одинаковыми зависимостями. Обычно у вас должен быть один военный проект со всеми зависимыми от войны зависимостями и некоторыми другими невоенными соответствующими проектами с API и реализациями определенных интерфейсов. В этом случае все зависимости 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 

    } 
} 
Смежные вопросы