2012-07-13 23 views
5

Estoy tratando de definir una tarea jar para todos los subproyectos (alrededor de 30). Probé la siguiente tarea:Definición de classpath personalizado para un manifiesto jar en gradle

jar { 
      destinationDir = file('../../../../_temp/core/modules') 
      archiveName = baseName + '.' + extension 
      metaInf { 
        from 'ejbModule/META-INF/' exclude 'MANIFEST.MF' 
      } 

      def manifestClasspath = configurations.runtime.collect { it.getName() }.join(',') 
      manifest { 
      attributes("Manifest-Version"  : "1.0", 
       "Created-By"    : vendor, 
       "Specification-Title" : appName, 
       "Specification-Version" : version, 
       "Specification-Vendor" : vendor, 
       "Implementation-Title" : appName, 
       "Implementation-Version" : version, 
       "Implementation-Vendor" : vendor, 
       "Main-Class"    : "com.dcx.epep.Start", 
       "Class-Path"    : manifestClasspath 
      ) 
      } 
    } 

Mi problema es, que las dependencias entre los sub-proyectos no están incluidos en la ruta de clase del manifiesto. Traté de cambiar la configuración del tiempo de ejecución a una configuración de compilación, pero eso da como resultado el siguiente error.

  • ¿Qué salió mal: Ocurrió un problema evaluación del proyecto: EskoordClient '.

    ¡No puede cambiar una configuración que no está en estado no resuelto!

Esa es mi fichero de construcción completa para el proyecto EskoordClient:

dependencies {  
    compile project(':ePEPClient') 
} 

La mayoría de mis proyectos sub construir archivos sólo definen las dependencias de proyectos. Las dependencias lib de terceros se definen en el archivo de compilación del superproyecto.

Existe la posibilidad de incluir todas las entradas classpath necesarias (bibliotecas de terceros y otros proyectos) en una classpath de manifiesto en un superproyecto para todos los subproyectos.

+0

¿Declara esa tarea para cada subproyecto? (No veo un bloque 'subproyectos {}'). Se produce el error "no se puede cambiar la configuración" porque está haciendo el trabajo demasiado pronto (fase de configuración en lugar de fase de ejecución). Las dependencias del proyecto están incluidas correctamente para mí. ¿Qué versión de Gradle estás usando? –

+0

Estoy usando gradle Versión 1.0 Actualmente tengo el objetivo jar en una configuración 'operación: configure (subprojects.findAll {it.name.endsWith ('Service') || it.name.endsWith ('Common') || it.name.endsWith ('Client')}) ' – user1490402

Respuesta

6

Así es como lo hice funcionar. Obtener dependencias del proyecto sólo utilizando la llamada:

getAllDependencies().withType(ProjectDependency) 

a continuación, añadir el contenido de libsDir de cada proyecto a mi Class-Path entrada de manifiesto.

jar { 
    manifest { 
     attributes 'Main-Class': 'com.my.package.Main' 
     def manifestCp = configurations.runtime.files.collect { 
     File file = it 
     "lib/${file.name}" 
     }.join(' ') 


     configurations.runtime.getAllDependencies().withType(ProjectDependency).each {dep-> 

      def depProj = dep.getDependencyProject() 
      def libFilePaths = project(depProj.path).libsDir.list().collect{ inFile-> "lib/${inFile}" }.join(' ') 
      logger.info"Adding libs from project ${depProj.name}: [- ${libFilePaths} -]" 
      manifestCp += ' '+libFilePaths 
     } 

     logger.lifecycle("") 
     logger.lifecycle("---Manifest-Class-Path: ${manifestCp}") 
     attributes 'Class-Path': manifestCp 

    } 

} 
+0

es posible que desee eliminar los duplicados de la classpath final y ordenarlos mediante' manifestCp = manifestCp.split ('') .collect(). unique(). sort() .join ('') '... me encanta Groovy – coderatchet

Cuestiones relacionadas