2011-03-25 24 views
5

Cuando ejecuto groovyc en un entorno de Windows, me estoy encontrando con problemas debido a la longitud del classpath, en mi situación. Me gustaría solucionar este problema creando un contenedor y luego poner ese jar en el cp. ¿Cómo puedo crear un contenedor de rutas w/todas las entradas classpath especificadas automáticamente en gradle y luego agregar ese jar al cp?¿Cómo puedo crear un contenedor de rutas en Gradle?

Respuesta

3

Finalmente, conseguí que la idea del "recipiente de la ruta" funcionara. Considero que esto es una solución permanente. Esto podría considerarse una solución si se hace parte de Gradle.

Peter proporcionó el código del jar original, pero no funcionó. El problema: los elementos classpath a los que se hace referencia en el contenedor de rutas deben ser relativos a la ubicación del contenedor de rutas. Entonces, esto parece funcionar para mí.

task pathingJar(type: Jar , dependsOn: 'cleanPathingJar') { 
/** 
* If the gradle_user_home env var has been set to 
    * C:\ on a Win7 machine, we may not have permission to write the jar to 
* this directory, so we will write it to the caches subdir instead. 
    * This assumes a caches subdir containing the jars 
* will always exist. 
*/ 
gradleUserHome = new File(gradle.getGradleUserHomeDir(), "caches") 

relativeClasspathEntries = configurations.compile.files.collect { 
    new File(gradleUserHome.getAbsolutePath()).toURI(). 
        relativize(new File(it.getAbsolutePath()).toURI()).getPath() 
} 
appendix = "pathing" 
destinationDir = gradleUserHome 
doFirst { 
    manifest { 
     attributes "Class-Path": relativeClasspathEntries.join(" ") 
    } 
} 
} 

compileGroovy { 
    dependsOn(pathingJar) 
    classpath = files(pathingJar.archivePath) 
} 
+1

¿Pero esto no parece contener actualmente el archivo jar del proyecto en el classpath? –

+1

Esto [no funcionó en las versiones de Groovy entre 3.0.5 en 3.0.8] (https://github.com/grails/grails-core/issues/9300). El problema de Grails vinculado también incluye una solución completa, utilizando este enfoque. –

8

Aquí es una solución probada:

task pathingJar(type: Jar) { 
    appendix = "pathing" 
    doFirst { 
    manifest { 
     attributes "Class-Path": configurations.compile.files.join(" ") 
    } 
    } 
} 

compileGroovy { 
    dependsOn(pathingJar) 
    classpath = files(pathingJar.archivePath) 
}  

Dependiendo de sus requisitos exactos, es posible que tenga que ajustar esto un poco. Por ejemplo, si tiene pruebas escritas en Groovy, también necesitará un Jar de ruta para la ruta de la clase de compilación de prueba. En este caso, deberá repetir la configuración anterior de la siguiente manera:

task testPathingJar(type: Jar) { 
    appendix = "testPathing" 
    doFirst { 
    manifest { 
     attributes "Class-Path": configurations.testCompile.files.join(" ") 
    } 
    } 
} 

compileTestGroovy { 
    dependsOn(testPathingJar) 
    classpath = files(testPathingJar.archivePath) 
}  
+0

Whoa, una respuesta del propio Peter Niederwieser! ¡Gracias! Probaré esto pronto, con suerte. Por cierto, Spock es espectacular. –

+0

Pregunta de seguimiento: parece que no funciona como se esperaba. Se crea el contenedor de rutas, pero cuando agrego el contenedor de rutas al classpath al compilar, por alguna razón, la compilación falla y se queja de los archivos jar faltantes que ya están referenciados en el contenedor de rutas ... –

+0

Estoy pensando que esto no funciona, ya que esto especifica las rutas absolutas de las jarras en el manifiesto. No está claro que las rutas absolutas sean válidas en este caso. –

Cuestiones relacionadas