2012-05-09 13 views
18

estoy usando el plugin de Aplicación de Gradle para generar la instalación de una aplicación Java independiente. Tengo un archivo de configuración que necesito poner en classpath, pero parece que no puedo generar el classpath correctamente en los archivos sh/bat. Este archivo de configuración debe ubicarse fuera del contenedor.Añadir entradas de ruta de clases usando el plugin de Aplicación de Gradle

El archivo conf está en el directorio /src/dist/conf/ así que cuando ejecuto installApp lo instala bajo un directorio conf como este $APP_HOME/conf.

He intentado añadir este directorio a la classpath como esto:

startScripts.classpath.add(files('$APP_HOME/conf')) 

pero cuando miro a la ruta de clase en los archivos sh/BAT se añade una entrada que se parece a esto:

$APP_HOME/lib/conf 

¿Cómo le digo Gradle dejar caer la sección lib de esta entrada?

Respuesta

3

Me parece que lo que estoy tratando de hacer no debe estar tan lejos fuera de lo común, sino como una solución alternativa que puede tener el directorio dist ser src/dist/lib/conf que permite el directorio conf para ser colocado en el lib directorio y el classpath que genera gradle para que los archivos sh/bat sean correctos.

voy a aceptar otra respuesta si alguien tiene una mejor.

+0

Gracias @ Josh, pero, ¿cómo utilizar los recursos de src/dist/lib/conf' cuando se ejecuta IDE formulario de solicitud? Porque si los agregas a 'sourceSets.main.resources' aparecerán en el jar. – pgregory

+0

@pgregory Puede agregar src/dist/lib/conf al classpath dentro de su IDE o también agregar los recursos en algún lugar como src/test/resources. Lo hago más tarde porque, normalmente, cuando estoy ejecutando cosas en el IDE, son pruebas y, por lo tanto, puedo compartirlas con el entorno de prueba de Gradle. – Josh

4

La forma más sencilla de obtener un archivo en la ruta de clase es para ponerlo en src/main/resources. src/dist es para agregar archivos a la distribución (es decir, archivo zip), no a la ruta Jar/class.

+15

Gracias @Peter Niederwieser, me gustaría hacer eso, pero quiero que este archivo de configuración para dejar fuera de la jarra. Si está en el src/main/resources, se coloca dentro del contenedor. – Josh

4

Esto no es particularmente buena respuesta a su pregunta, pero he encontrado algunos casos en que la tarea startScripts bastante aún no cuenta con la flexibilidad que necesitamos.

he trabajado en torno a un par de estos casos mediante la edición de los contenidos de los archivos directamente ... no es exactamente aprovechando gran modelo de Gradle y no es particularmente recomendable, pero al menos demuestra de lo flexible que es Gradle!

Por lo que podría piratear algo en la ruta de clase de esta manera:

tasks.startScripts { 
    doLast { 
    def scriptFile = file "${outputDir}/${applicationName}" 
    scriptFile.text = scriptFile.text.replace('CLASSPATH=$APP_HOME/lib', 'CLASSPATH=$APP_HOME/conf/:$APP_HOME/lib') 
    } 
} 

ser consciente de romper independencia de la plataforma de la secuencia de inicio cuando se hace esto.

3

lo hice una variante de la receta de Martin Dow continuación:

sustituyo 'APP_HOME =' con 'APP_HOME exportación =' en el script de inicio.

Entonces mi código puede hacer System.env.get ("APP_HOME") y vaya a por ejemplo, la carpeta conf/

Ésta es mi Gradle Hack:

tasks.startScripts { 
    doLast { 
    def scriptFile = file "${outputDir}/${applicationName}" 
    scriptFile.text = scriptFile.text.replaceAll('APP_HOME=', 'export APP_HOME=') 
    } 
} 

Ejemplo de código Java en la aplicación:

String APP_HOME = System.env().get("APP_HOME"); 
Properties p = new Properties(); 
p.load(new FileInputStream(APP_HOME + "/conf/myapp.properties")) 

Espero que esto ayude.

NOTA: "exportación" no funciona en Windows!

13

Otra solución para este problema (GRADLE-2333) es propuesta por Alexandr Fadeev here.

Aquí es (un poco modificado) La solución de Alexandr que solucionó el problema para mí en Gradle-1.6:

startScripts { 
    classpath += files('src/dist/XxxAPlaceHolderForAConfigxxX') 
    doLast { 
    def windowsScriptFile = file getWindowsScript() 
    def unixScriptFile = file getUnixScript() 
    windowsScriptFile.text = windowsScriptFile.text.replace('%APP_HOME%\\lib\\XxxAPlaceHolderForAConfigxxX', '%APP_HOME%\\config') 
    unixScriptFile.text = unixScriptFile.text.replace('$APP_HOME/lib/XxxAPlaceHolderForAConfigxxX', '$APP_HOME/config') 
    } 
} 

Es un poco más feo que la solución de Josh, pero le permite conservar la estructura de directorios exacta (/ src/dist/conf y $ APP_HOME/conf) mencionados en la pregunta original.

Cuestiones relacionadas