Multiproyectos con gradle

De ChuWiki

Gradle permite crear un proyecto que a su vez tenga varios subproyectos (o módulos) debajo, de forma que todos ellos forman parte de nuestra aplicación. Veamos aquí un ejemplo sencillo de cómo configurar un proyecto gradle con módulos.

Lista de subproyectos[editar]

En un proyecto gradle normal, creamoa tantos subdirectorios como subproyectos tengamos. Por ejemplo

proyecto-principal
|--- build.gradle
|--- settings.gradle
|--- subproyecto-1
|    |--- ...
|----subproyecto-2
     |--- ...

Cada subproyecto (en el ejemplo subproyecto-1 y subproyecto-2) será a su vez un proyecto gradle, por lo que puede tener su propia estructura de directorios y su fichero build.gradle.

Necesitamos además, en el proyecto principal, un fichero settings.xml en el aparezca el listado de suproyectos. En nuestro ejemplo, el contenido de settings.xml puede ser

include 'subproyecto-1', 'subproyecto-2'


Configuración común de los proyectos[editar]

Al tener cada proyecto su propio build.gradle</build> es muy probable que tengamos que repetir en ellos ciertas cosas. Por ejemplo, si todos son proyectos java, en todos tendriamos que poner apply plugin: 'java'. Gradle nos evita esta tarea dándonos una forma de poner en el fichero build.gradle del proyecto principal aquello que queramos que sea común para todos los proyectos. Basta ponerlo dentro de un allprojects, como en el siguiente ejemplo

allprojects {
   apply plugin: 'java'
   apply plugin: 'eclipse'

   repositories {
      mavenLocal()
      mavenCentral()
   }

   dependencies {
      compile group: 'log4j', name: 'log4j', version: '1.2.17'
      testCompile group: 'junit', name: 'junit', version: '4.12'
   }
}

Todo lo que va dentro de las llaves de allprojects aplicará al proyecto principal y a todos sus subproyectos. en este ejemplo, todos serían proyectos java, con posibilidad de generar el proyecto eclipse desde gradle, con los repositorios de jar de maven tanto local como el central, y todos los proyectos y subproyectos tendrán la dependencia de log4j y de junit.

No es necesario, por tanto, colocar nada de esto en ninguno de los ficheros build.gradle de los subproyectos.

Si queremos alguna configuración que afecte a todos los subproyectos, pero no al proyecto padre, en vez de allprojects, usaríamos subprojects

Adicionalmente, aparte de poner las cosas específicas de cada subproyecto en el build.gradle del subproyecto, podríamos ponerlas en el build.gradle del proyecto padre de la siguiente forma

project(':subrpoyecto-1') {
    apply plugin: 'java'
 
    repositories {
        mavenCentral()
    }
}

es decir, usando project, el nombre del proyecto precedido de dos puntos y entre llaves lo que queremos que aplique sólo a ese subproyecto.

Dependencias entre proyectos[editar]

Imagina que al compilar el subproyecto-1 necesita de algunas clases que están en subproyecto-2. Gradle, permite poner dependencias de librerías externas, como el caso de log4j y junit que hemos mostrado, y que se buscarían en los repositorios local y central de maven, pero también permite poner dependencias entre subproyectos gradle que formen parte del mismo proyecto. Para ello, en el fichero build.gradle de subproyecto-1, tenemos que poner la dependencia de esta forma

dependencies {
   compile project(':subproyecto-2')
}

Es decir, indicamos que dependemos para compilar del proyecto subproyecto-2. Fíjate en el "dos puntos" de delante.

Cuando ejecutemos gradle build desde el proyecto padre, esta dependencia se tendrá en cuenta y se compilará primero el subproyecto-2 y luego el subproyecto-1, ya que depende del subproyecto-2.