我有以下gradle build config:
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运行main方法时,我得到以下输出:
org.apache.hadoop.mapred.YarnClientProtocolProvider@4783da3f
org.apache.hadoop.mapred.LocalClientProtocolProvider@300ffa5d
但是当我运行gradle fat jar任务并创建胖jar时,在使用(java -jar)通过终端运行main方法后我得到:
org.apache.hadoop.mapred.LocalClientProtocolProvider@7f31245a
我发现当创建胖jar时, META-INF / services 下的条目被合并为所有依赖项,因此我失去了我需要的 YarnClientProtocolProvider 的声明进一步在我的代码中。
YarnClientProtocolProvider 在 hadoop-mapreduce-client-jobclient.jar
中声明LocalClientProtocolProvider 在 hadoop-mapreduce-client-common.jar
中声明是否有人知道如何创建一个不合并META-INF /服务条目的胖子??
答案 0 :(得分:1)
这应该做的工作
shadowJar {
mergeServiceFiles()
}