2012-04-19 11 views
5

Ho un file che carica build.gradlePMD (scaricandolo dal Maven a monte), e poi carica un file Ant build.xml che richiede PMD:Percorso di classe per i plugin di formiche quando si utilizza ANTBuilder da Gradle

buildscript { 
    repositories { 
    mavenCentral() 
    } 
    dependencies { 
    classpath 'pmd:pmd:4.2.5' 
    } 
} 
ant.importBuild 'shared-build.xml' 

Tuttavia, l'importazione Ant fallisce:

taskdef class net.sourceforge.pmd.ant.PMDTask cannot be found 
using the classloader AntClassLoader[] 
    at org.apache.tools.ant.ProjectHelper.addLocationToBuildException(ProjectHelper.java:551) 
[...] 
    at org.gradle.api.internal.project.DefaultAntBuilder.importBuild(DefaultAntBuilder.groovy:76) 

Come può Gradle's ant integration essere incaricato di rendere questo disponibile?

+0

fa l'Ant hanno lo stesso problema, o funziona quando viene eseguito direttamente? –

+0

@PeterNiederwieser la build di ant funziona quando viene eseguita direttamente - tuttavia, questo è con un'installazione locale di formica che ha avuto PMD direttamente aggiunto al suo percorso di classe predefinito. –

+0

... francamente, ho già trovato una soluzione ragionevole per il problema (che implicava l'aggiornamento di shared-build.xml per specificare un classpath esplicito quando si ha a che fare con PMD) ... ma preferirei poter usare il Istanza scaricata da Gradle anche così. –

risposta

6

Non c'è un modo semplice per farlo, dato che Gradle non offre alcun supporto API per questo. Quindi hai bisogno di hackerarlo in qualche modo.

Ad esempio, si può fare qualcosa di simile, giusto prima di chiamare ant.importBuild

org.apache.tools.ant.Project.class.classLoader.addURL(file('libs/somelib.jar').toURI().toURL()) 

In alternativa è possibile chiamare il metodo addurl() con i percorsi che si ottiene attraverso la risoluzione delle dipendenze del Gradle (di nuovo, questa dovrebbe essere eseguito prima della chiamata a ant.importBuild).

configurations { someconf } 
dependencies { someconf "org.eclipse.jdt:ecj:3.6.1" } 

def antClassLoader = org.apache.tools.ant.Project.class.classLoader 
configurations.someconf.each { File f -> 
    antClassLoader.addURL(f.toURI().toURL()) 
} 

Naturalmente, un'altra soluzione potrebbe essere quella di avere il classpath definito all'interno del file build.xml in modo da non avere a che fare qualsiasi cosa, da Gradle.

Vedi qualche input qui http://gradle.1045684.n5.nabble.com/How-to-add-to-classpath-for-ant-importBuild-td3268631.html

Problemi correlati