2017-06-16 26 views
0

我有以下gradle這個構建配置:如何創建脂肪罐子不覆蓋下的META-INF項/服務

plugins { 
id 'com.github.johnrengelman.shadow' version '1.2.3' 
} 

group 'abc' 
version '1.0-SNAPSHOT' 

apply plugin: 'java' 
apply plugin: 'application' 
mainClassName = "abc.Driver" 


repositories { 
    mavenCentral() 
} 

dependencies { 
    compile (group: 'org.apache.hadoop', name: 'hadoop-client', version: '2.6.0') 
} 

sourceSets { 
    main { 
     java { 
      srcDir './src' 
     } 
    } 
} 

jar { 
    manifest { 
     attributes(
       'Class-Path': configurations.compile.collect { it.getName() }.join(' '), 
       'Main-Class': mainClassName 
     ) 
    } 
} 

task fatJar(type: Jar) { 
    manifest { 
     attributes 'Implementation-Title': 'Gradle Jar File Example', 
       'Implementation-Version': version, 
       'Main-Class': mainClassName 
    } 
    baseName = project.name + '-all' 
    from { (configurations.compile - configurations.provided).collect 

     { 
      //println it.getName() 
      it.isDirectory() ? it : zipTree(it) 
     } 

    } 
    { 
     exclude "META-INF/*.SF" 
     exclude "META-INF/*.DSA" 
     exclude "META-INF/*.RSA" 
    } 
    with jar 
} 

,我有的只是下面這段代碼的主要方法

public static void main(String[] args) { 
    Iterable<ClientProtocolProvider> frameworkLoader = 
      ServiceLoader.load(ClientProtocolProvider.class); 
    for(ClientProtocolProvider cpp: frameworkLoader) { 
     System.out.println(cpp.toString()); 
    } 
} 

當我運行從IDE作爲預期我得到以下輸出的主要方法:

[email protected] 
[email protected] 

但WH恩我運行gradle這個脂肪jar任務和創建脂肪罐子,使用(Java的罐子)通過終端運行的主要方法後,我只是得到:

[email protected] 

我發現,當創建脂肪罐子,條目在META-INF /服務合併所有依賴項,因此我失去了YarnClientProtocolProvider聲明,我需要在我的代碼中進一步。

YarnClientProtocolProvider類Hadoop MapReduce的客戶jobclient.jar宣佈

LocalClientProtocolProvider類Hadoop MapReduce的客戶common.jar

聲明是否有身體知道如何創建一個不會合並META-INF/services下的條目的fat jar?

回答

0

這應該做的工作

shadowJar { 
    mergeServiceFiles() 
} 
+0

這將覆蓋的服務供應商的配置文件的內容,取而代之的是勝利者的依賴罐子,因此,我們失去了一些服務提供商聲明。 – Ehsan

+0

看看這個:https://stackoverflow.com/questions/32887966/shadow-plugin-gradle-what-does-mergeservicefiles-do –