2016-06-22 15 views
8

Ich möchte Abhängigkeitsinformationen in meine Manifestdatei einbetten, sodass ich diese Informationen zur Laufzeit bereitstellen kann. d. h., ich kann sehen, welche Version einer Bibliothek von einer bestimmten laufenden Instanz meines Dienstes verwendet wird.Verwenden Sie Gradle zum Einbetten von Abhängigkeitsinformationen in das Manifest

ich gradle bin mit meinem ‚fatjar‘ bauen:

shadowJar { 
    mergeServiceFiles() 
    archiveName "service.jar" 
    exclude "META-INF/*.SF" 
    exclude "META-INF/*.DSA" 
    exclude "META-INF/*.RSA" 
    manifest { 
    attributes('Main-Class': "service.Service", 
       'Built-By': System.getProperty('user.name'), 
       'Built-Date': new Date(), 
       'Built-JDK': System.getProperty('java.version'), 
       'Implementation-Version': version, 
       'Implementation-Title': project.name) 
    } 
} 

Und ich habe Abhängigkeiten von verschiedenen anderen Bibliotheken:

dependencies { 
    compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.39' 
    ... 
} 

Wie kann ich die Abhängigkeitsinformationen in meinem Manifest-Datei hinzufügen ? Zum Beispiel:

Manifest-Version: 1.0 
Implementation-Title: service 
Implementation-Version: Local Build 
Built-By: me 
Built-Date: Wed Jun 22 14:13:53 BST 2016 
Built-JDK: 1.8.0_91 
Main-Class: service.Service 
Dependency-mysql-connector-java: mysql:mysql-connector-java:5.1.39 

Antwort

4

Es kann auf folgende Weise erfolgen:

buildscript { 
    repositories { 
    maven { 
     url 'https://plugins.gradle.org/m2/' 
    } 
    } 

    dependencies { 
    classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3' 
    } 
} 

apply plugin: 'java' 
apply plugin: 'com.github.johnrengelman.shadow' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'com.google.guava:guava:19.0' 
    compile 'com.google.inject:guice:4.1.0' 
} 

shadowJar { 
    mergeServiceFiles() 
    archiveName "service.jar" 
    exclude "META-INF/*.SF" 
    exclude "META-INF/*.DSA" 
    exclude "META-INF/*.RSA" 
    manifest { 
    attributes(
       [ 
       'Main-Class': "service.Service", 
       'Built-By': System.getProperty('user.name'), 
       'Built-Date': new Date(), 
       'Built-JDK': System.getProperty('java.version'), 
       'Implementation-Version': 'version', 
       'Implementation-Title': project.name, 
       ] + 
       project.configurations.compile.allDependencies.collect { d -> 
       [ 
        ("dependency-${d.group.replaceAll('\\.','-')}".toString()):"$d.group:$d.name:$d.version" 
       ] 
       }.sum() 
    ) 
    } 
} 

Das Skript über das erzeugt folgende MANIFEST.MF:

Manifest-Version: 1.0 
Main-Class: service.Service 
Built-By: opal 
Built-Date: Mon Jul 04 17:27:05 CEST 2016 
Built-JDK: 1.8.0_91 
Implementation-Version: version 
Implementation-Title: 37969253 
dependency-com-google-guava: com.google.guava:guava:19.0 
dependency-com-google-inject: com.google.inject:guice:4.1.0 

Seit attributes nimmt Map als Argument, Sie müssen sie Abhängigkeiten sammeln, sie in Map transformieren und die Karten summieren.

+0

Das sieht gut aus - gibt es auch eine Möglichkeit, Abhängigkeiten von meinen Sub-Modulen zu integrieren? Das heißt, ich habe ein "Kern" -Modul und ein "Service" -Modul, und meine Bibliotheken sind alle im Kern - sie werden derzeit als Abhängigkeits-Kern angezeigt: service: Service: Local Build –