2012-07-13 9 views
5

Sto provando a definire un'attività jar per tutti i sottoprogetti (circa 30). Ho provato la seguente operazione:Definizione percorso classe personalizzato per un manifest jar in 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 
      ) 
      } 
    } 

Il mio problema è, che le dipendenze tra i progetti secondari non sono inclusi nel percorso di classe del manifesto. Ho provato a cambiare la configurazione di runtime in una configurazione di compilazione, ma questo si traduce nel seguente errore.

  • Cosa è andato storto: Un problema si è verificato la valutazione del progetto ': EskoordClient'.

    Non è possibile modificare una configurazione che non è in uno stato non risolto!

Questa è la mia build file completo per il progetto EskoordClient:

file
dependencies {  
    compile project(':ePEPClient') 
} 

maggior parte dei miei progetti sub costruiscono definiscono solo i progetti dipendenze. Le dipendenze della lib di terze parti sono definite nel file di costruzione del super progetto.

Esiste la possibilità di includere tutte le voci del percorso di classe necessarie (librerie di terze parti e altri progetti) in un percorso di classe manifest in un superprogetto per tutti i sottoprogetti.

+0

Si dichiara questo compito per ogni sottoprogetto? (Non vedo un blocco 'sottoprogetti {}'.) L'errore "non può cambiare configurazione" si verifica perché si sta facendo il lavoro troppo presto (fase di configurazione anziché fase di esecuzione). Le dipendenze del progetto sono correttamente incluse per me. Quale versione di Gradle stai usando? –

+0

Sto usando gradle Versione 1.0 Attualmente ho il target jar in un'operazione configure: configure (sottoprogetti.findAll {it.name.endsWith ('Servizio') || it.name.endsWith ('Comune') || it.name.endsWith ('Client')}) ' – user1490402

risposta

6

Ecco come ho potuto farlo funzionare. Ottenere le dipendenze di progetto utilizzando solo la chiamata:

getAllDependencies().withType(ProjectDependency) 

poi aggiungendo il contenuto del libsDir di ogni progetto per la mia entrata manifesta Class-Path.

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

potresti voler rimuovere i duplicati dal classpath finale e ordinarli usando' manifestCp = manifestCp.split ('') .collect(). unique(). sort() .join ('') '... amo il groovy – coderatchet