2012-07-13 14 views
5

Próbuję zdefiniować zadanie jar dla wszystkich podrzędnych projektów (około 30). Próbowałem następujące zadanie:Definiowanie niestandardowej ścieżki klas dla manifestu jar w 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 
      ) 
      } 
    } 

mój problem jest, że zależności między sub projektów nie są zawarte w ścieżce klasy manifestu. Próbowałem zmienić konfigurację środowiska wykonawczego na konfigurację kompilacji, ale spowodowało to następujący błąd.

  • Co poszło nie tak: Wystąpił problem oceny projektu ': EskoordClient'.

    Nie można zmienić konfiguracji, która nie jest w nierozwiązanym stanie!

To mój pełny plik build dla projektu EskoordClient:

dependencies {  
    compile project(':ePEPClient') 
} 

Większość moich projektów cząstkowych budować pliki definiować tylko projektów zależności. Zależności od bibliotek zewnętrznych są zdefiniowane w pliku kompilacji super projektu.

Czy istnieje możliwość uwzględnienia wszystkich wymaganych wpisów ścieżki klas (bibliotek zewnętrznych i innych projektów) w manifeście ścieżki klasy w superprojektie dla wszystkich podprojektów.

+0

Czy deklarujesz to zadanie dla każdego podprojektu? (Nie widzę bloku 'subprojects {}'). Błąd "nie można zmienić konfiguracji" występuje, ponieważ robisz pracę zbyt wcześnie (faza konfiguracji zamiast fazy wykonania). Zależności projektu są dla mnie poprawnie uwzględnione. Którą wersję Gradle używasz? –

+0

Używam gradle wersji 1.0 Obecnie mam cel jar w konfiguracji 'operacja: configure (podprojects.findAll {it.name.endsWith ('Service') || it.name.endsWith ('Common') || it.name.endsWith ('Klient')}) ' – user1490402

Odpowiedz

6

Oto, jak to działa. Uzyskaj zależności projektu za pomocą połączenia:

getAllDependencies().withType(ProjectDependency) 

następnie dodając zawartość libsDir każdego projektu do mojego Class-Path oczywistego wpisu.

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

możesz usunąć duplikaty z końcowej ścieżki klasy i posortować je za pomocą' manifestCp = manifestCp.split ('') .collect(). unique().() .join ('') '... kocham groovy – coderatchet