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?
這將覆蓋的服務供應商的配置文件的內容,取而代之的是勝利者的依賴罐子,因此,我們失去了一些服務提供商聲明。 – Ehsan
看看這個:https://stackoverflow.com/questions/32887966/shadow-plugin-gradle-what-does-mergeservicefiles-do –