2012-03-06 3 views
24

Я использую Gradle для автоматизации задач Hadoop. При вызове Hadoop мне нужно пройти путь к некоторым баночкам, от которых зависит мой код, чтобы Hadoop мог отправить эту зависимость во время фазы map/reduce.Самый чистый путь в Gradle, чтобы получить путь к файлу jar в кэше зависимостей gradle

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

Это упрощенная версия моего Gradle сценария, который имеет зависимость от Solr 3.5.0 баночку и findSolrJar задача, которая перебирает все файлы фляги в конфигурации, чтобы найти правильный один:

apply plugin: 'groovy' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'org.apache.solr:solr-solrj:3.5.0' 
} 

task findSolrJar() { 
    println project.configurations.compile*.toURI().find { URI uri -> new File(uri).name == 'solr-solrj-3.5.0.jar'} 
} 

работает это дает мне такой вывод:

gradle findSolrJar                                                               
file:/Users/tnaleid/.gradle/caches/artifacts-8/filestore/org.apache.solr/solr-solrj/3.5.0/jar/74cd28347239b64fcfc8c67c540d7a7179c926de/solr-solrj-3.5.0.jar 
:findSolrJar UP-TO-DATE 

BUILD SUCCESSFUL 

Total time: 2.248 secs 

есть ли лучший способ сделать это?

ответ

24

Ваш код можно упростить, например project.configurations.compile.find { it.name.startsWith("solr-solrj-") }.

20

Вы также можете создать специальную конфигурацию для артефакта, чтобы он был чистым; и использовать asPath если тот факт, что он потенциально может вернуться несколько мест хорошо подходит для вашего случая использования (бывает, если он решает ту же банку в нескольких местах):

configurations { 
    solr 
} 

dependencies { 
    solr 'org.apache.solr:solr-solrj:3.5.0' 
} 

task findSolrJars() { 
    println configurations.solr.asPath 
} 

Чтобы избежать копирования-вставки, в случае, если и нужно что банки в compile конфигурации, вы можете добавить эту специальную конфигурацию в compile один, как:

dependencies { 
    solr 'org.apache.solr:solr-solrj:3.5.0' 
    compile configurations.solr.dependencies 
} 
1

Вот как я это сделал:

project.buildscript.configurations.classpath.each { 
    String jarName = it.getName(); 
    print jarName + ":" 
} 
+1

Между прочим, ':' не работает на Windows. Использование 'File.pathSeparator' может исправить это. – Chilloutman

+0

@Chilloutman Я согласен. Не переустанавливайте разделитель пути. –

1

Мне нужен lombok.jar как флаг сборки java для gwt builds, это сработало отлично!

configurations { 
lombok 
} 
dependencies { 
    lombok 'org.projectlombok:lombok+' 
} 
ext { 
    lombok = configurations.lombok.asPath 
} 

compileGwt { 
    jvmArgs "-javaagent:${lombok}=ECJ" 
} 

Я был удивлен, что разрешение сработало достаточно рано в фазе конфигурации, но это так.

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