2012-03-06 9 views
24

Sto usando Gradle per automatizzare le attività di Hadoop. Quando chiami Hadoop, devo essere in grado di passare il percorso ad alcuni vasi da cui dipende il mio codice, in modo che Hadoop possa inviare tale dipendenza durante la fase di mappa/riduzione.Modo più pulito in Gradle per ottenere il percorso di un file jar nella cache delle dipendenze gradle

Ho capito qualcosa che funziona, ma mi sembra complicato e mi chiedo se c'è una funzionalità che mi manca da qualche parte.

Questa è una versione semplificata del mio script Gradle che ha una dipendenza sul vaso solr 3.5.0, e un compito findSolrJar che consente di scorrere tutti i file jar nella configurazione per trovare quella giusta:

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

l'esecuzione di questo mi dà output come questo:

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 

c'è un modo migliore per fare questo?

risposta

24

Il codice può essere semplificato un po ', ad esempio project.configurations.compile.find { it.name.startsWith("solr-solrj-") }.

20

È inoltre possibile creare una configurazione dedicata per un artefatto, per mantenerlo pulito; e utilizzare asPath se il fatto che potenzialmente possono restituire diverse località funziona bene per il vostro caso d'uso (succede se si risolve stesso vaso in diverse località):

configurations { 
    solr 
} 

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

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

Per evitare di copia-incolla, nel caso in cui voi così bisogno quel vaso in configurazione compile, è possibile aggiungere questa configurazione dedicato in compile uno, come:

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

Ecco come ho fatto:

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

":" non funziona su Windows. L'uso di 'File.pathSeparator' può risolverlo. – Chilloutman

+0

@Chilloutman Sono d'accordo. Non codificare il separatore del percorso. –

1

Avevo bisogno di lombok.jar come un flag java build per gwt build funzionava alla grande!

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

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

Mi ha sorpreso che la risoluzione ha funzionato abbastanza presto nella fase configuraiton, ma lo fa.

Problemi correlati