2012-01-26 16 views
19

Recientemente comencé a usar Gradle y reemplazo mis proyectos existentes basados ​​en Maven. He tenido muchos problemas en el pasado con el manejo de compilaciones de varios módulos con Maven. Gradle ha sido un soplo de aire fresco cuando se maneja con módulos de varios módulos, pero todavía no es perfecto.Configuración del proyecto de varios módulos Gradle

que tienen la disposición siguiente carpeta para mis proyectos:

-- Projects 
---- EnterpriseApp1 
------ EarProject 
-------- build.gradle 
------ EjbProject 
-------- build.gradle 
------ WarProject 
-------- build.gradle 
------ properties.gradle 
------ build.gradle 
---- CommonLib 
------ build.gradle 
---- ClientApplication 
------ build.gradle 

El problema que estoy teniendo es que el "EnterpriseApp1" y "ClientApplication" tanto dependen del proyecto commonlib. No sé cómo configurar mi archivo de compilación "EnterpriseApp1" para usar el proyecto CommonLib como dependencia para el "Proyecto Ejb". He estado muy cerca de hacer que esto funcione, pero aún no funciona del todo. Tuve éxito al copiar la carpeta CommonLib dentro de "EnterpriseApp1", pero esa no es una solución a largo plazo.

Aquí está mi archivo properties.gradle actual en "EnterpriseApp1":

include "EarProject", "EjbProject", "WarProject" 
includeFlat "CommonLib" 

De acuerdo con la documentación Gradle el comando "includeFlat" en el archivo "settings.gradle" incluirá proyectos en la misma palanca como el carpeta donde está el archivo "settings.gradle" (comportamiento deseado).

archivo/build.gradle EnterpriseApp1:

subprojects { 
    apply plugin: 'java' 

    sourceCompatibility = 1.6 
    group = 'org.example' 
    version = '1.0-SNAPSHOT' 

    repositories { 
     mavenCentral() 
     ... 
    } 

    dependencies { 

    }  
} 

EnterpriseApp1/EjbProject/build.gradle:

apply plugin: 'java' 

sourceCompatibility = 1.6 

repositories { 
    mavenCentral() 
    ... 
} 

dependencies { 
    compile project(':CommonLib') 

    compile group: 'org.restlet.jee', name: 'org.restlet', version: '2.0.11' 
    compile group: 'ma.glasnost.orika', name: 'orika-core', version: '1.0' 
    ... 
    compile group: 'javax.jmdns', name: 'jmdns', version: '3.4.1' 
} 

Cuando ejecuto "Gradle generación limpia" de la carpeta EnterpriseApp1 todas las dependencias se descargan como se esperaba y los proyectos comienzan a compilarse (incluido el proyecto CommonLib), pero el proyecto EjbProject falla durante la construcción debido al hecho de que le falta la referencia de jar CommonLib. Gradle no es lo suficientemente inteligente (o estoy completamente despistado;)) para configurar mi EjbProject para usar el Jar generado a partir de la etapa de compilación del proyecto CommonLib.

Pido disculpas por la configuración larga y complicada. He estado trabajando en tratar de resolver esto desde hace un tiempo, pero casi se han quedado sin ideas. Realmente agradecería cualquier ayuda para la comunidad.

Gracias!

+0

Algo falla con la sangría del diseño de directorio que se muestra. ¿Es esta una compilación, donde CommonLib y ClientApplication están en el mismo nivel de directorio que EnterpriseApp1, y los otros proyectos tienen un nivel inferior? (Eso sería un diseño muy poco común. Generalmente es o.) –

+0

Además, ¿cómo debería saber Gradle que CommonLib es una dependencia de EjbProject, dado que no especifica esa dependencia en 'EjbProject/build.gradle'? –

+0

¿Tiene intención de decir: este es mi archivo _settings.gradle_ actual en "EnterpriseApp1" –

Respuesta

7

El diseño del directorio que ha elegido ya insinúa una buena solución. Sugiero tener tres compilaciones separadas: EnterpriseApp1, CommonLib y ClientApplication. Publicaba CommonLib en un repositorio Maven o Ivy para que las otras dos compilaciones puedan consumirlo desde allí. Para el desarrollo local, puede publicar CommonLib en el repositorio local de Maven (el más fácil) o en un repositorio Ivy basado en archivos.

+0

Gracias Peter! Eso es lo que estaba pensando que podría hacer como último recurso, pero no quería tener que usar un repositorio local/remoto. ¿Sabes si esto es posible de lograr a través de Gradle? ¿o crees que esto no es una buena práctica en primer lugar? –

+2

Si 'EnterpriseApp1' y' ClientApplication' son aplicaciones diferentes con un ciclo de desarrollo y lanzamiento diferente, la construcción debería reflejar esto. Puede publicar 'CommonLib' como parte de la compilación' EnterpriseApp1', pero esto aún requerirá un repositorio, y complicará las cosas cuando 'ClientApplication' necesite un cambio en' CommonLib'. Alternativamente, si todo el código está en el mismo repositorio fuente, podría tener dos compilaciones, ambas incluyen 'CommonLib'. O bien, si los ciclos de desarrollo/lanzamiento son los mismos, podría tener una compilación grande, en cuyo caso no necesitará un repositorio. –

+0

tiene sentido. Gracias Peter! –

Cuestiones relacionadas