2014-10-29 5 views
6

Was ich suche, ist die Kombination einer bereits erstellten Manifest.mf-Datei aus meinem Projekt mit der dynamisch erstellten Manifest-Datei aus der JAR-Task in Gradle.Gradle Manifest.MF

Gibt es eine Möglichkeit, dies zu tun? Zur Zeit bin ich zu erzeugen Manifest-Dateien vollständig: -

jar.doFirst { 
    manifest { 
     def requiredProjects = '' 
     configurations.compile.getAllDependencies().withType(ProjectDependency).each {dep-> 
      def dependantProjects = dep.getDependencyProject() 
      def projects = project(dependantProjects.path).libsDir.list().findAll{it.endsWith('.jar')} 
      projects.removeAll(projects.findAll{it.endsWith('test.jar')}) 
      def requiredProject = projects.join(' ') 
      requiredProjects += requiredProject.replaceAll(/ /,'%20') + ' ' 
      logger.info 'Required Project: ' + requiredProject 
     } 
     logger.info 'Required requiredProjects: ' + requiredProjects 

     def compileFiles = configurations.compile.files{ it instanceof ExternalDependency }.collect { 
      File file = it 
      "lib/${file.name}" 
     }.join(' ') 

     def manifestPath = requiredProjects + compileFiles 
     logger.info 'Manifest: '+ manifestPath 
     attributes 'Class-Path': manifestPath 
     attributes 'Build-date': new Date(); 
     attributes 'Application-Version': project.version 
    } 
} 

Ich weiß, dass ich eine /META-INF/MANIFEST.MF Datei haben werden.

Ursprünglich habe ich das OSGI-Plugin für Gradle verwendet, aber dies scheint die Manifest-Datei zu ignorieren und eine große Unordnung zu erzeugen.

bearbeiten

Ich habe in diesem ziemlich viel sah, dank carlo ich den folgenden Code gefunden haben, wird mir erlauben, eine vorhandene MANIFEST.MF zu lesen: -

jar { 
     onlyIf { !compileJava.source.empty } 
     manifest { 
      // benutze das im Projekt vorliegende File, falls vorhanden: 
      def manif = "${projectDir}/META-INF/MANIFEST.MF" 
      if (new File(manif).exists()) {     
       from (manif) { 
        eachEntry { details ->       
         if (details.key == 'Bundle-Vendor') { 
                details.value = 'xyz GmbH' 
         } 
        } 
       }          
      } 
      else { 
       logger.info(project.name + " doesn't have a META-INF/MANIFEST.MF.") 
       manifest.attributes provider: xyz GmbH' 
       manifest.attributes project: project.name 
       manifest.attributes Build: new Date() 
      } 
     } 
     // copy if we have these:   
     from file ('plugin.xml')    
     from file ('plugin.properties')  
     into ('icons') { // if any ... 
      from fileTree('icons') 
     } 
    } 

http://forums.gradle.org/gradle/topics/how_to_deal_with_eclipse_projects_and_manifest_files

Ich habe auch ein Projekt namens "Wuff" gefunden, das mit Gradle beim Aufbau von OSGi-Projekten helfen soll.

https://github.com/akhikhl/wuff

Antwort

3

Am Ende habe ich es geschafft, zu bekommen, was ich mit dem folgenden Code gesucht: -

jar.doFirst { 
    manifest { 
     def manifestFile = "${projectDir}/META-INF/MANIFEST.MF" 
     if (new File(manifestFile).exists()) 
      from (manifestFile) 
     def requiredProjects = '' 
     configurations.compile.getAllDependencies().withType(ProjectDependency).each {dep-> 
      def dependantProjects = dep.getDependencyProject() 
      def projects = project(dependantProjects.path).libsDir.list().findAll{it.endsWith('.jar')} 
      projects.removeAll(projects.findAll{it.endsWith('test.jar')}) 
      def requiredProject = projects.join(' ') 
      requiredProjects += requiredProject.replaceAll(/ /,'%20') + ' ' 
      logger.info 'Required Project: ' + requiredProject 
     } 
     logger.info 'Required requiredProjects: ' + requiredProjects 

     def compileFiles = configurations.compile.files{ it instanceof ExternalDependency }.collect { 
      File file = it 
      "lib/${file.name}" 
     }.join(' ') 

     def manifestPath = requiredProjects + compileFiles 
     logger.info 'Manifest: '+ manifestPath 
     attributes 'Class-Path': manifestPath 
     attributes 'Build-date': new Date(); 
     attributes 'Application-Version': project.version 
    } 
} 

Die wichtigsten Linien sind: -

def manifestFile = "${projectDir}/META-INF/MANIFEST.MF" 
if (new File(manifestFile).exists()) 
    from (manifestFile) 

Dies ermöglicht es mir um eine vorhandene /META-INF/MANIFEST.MF-Datei zu erben und auch Klassenpfadabhängigkeiten einzubeziehen, die dynamisch von grittle verwaltet werden.