Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 如何创建不会覆盖META-INF/services下条目的fat jar_Hadoop_Gradle_Uberjar_Serviceloader - Fatal编程技术网

Hadoop 如何创建不会覆盖META-INF/services下条目的fat jar

Hadoop 如何创建不会覆盖META-INF/services下条目的fat jar,hadoop,gradle,uberjar,serviceloader,Hadoop,Gradle,Uberjar,Serviceloader,我有以下gradle构建配置: 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 {

我有以下gradle构建配置:

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());
    }
}
但是当我运行gradle fat jar任务并创建fat jar时,在通过终端运行main方法(java-jar)之后,我得到:

org.apache.hadoop.mapred.LocalClientProtocolProvider@7f31245a
我发现在创建fat jar时,META-INF/services下的条目被合并为所有依赖项,因此我丢失了YarnClientProtocolProvider的声明,我需要在代码中进一步声明

YarnClientProtocolProvider在hadoop-mapreduce-client-jobclient.jar中声明

LocalClientProtocolProvider在hadoop-mapreduce-client-common.jar中声明


有谁知道如何创建一个不会合并META-INF/services下条目的胖罐子吗

这应该就可以了

shadowJar {
    mergeServiceFiles() 
}

这将覆盖服务提供者配置文件的内容,以支持winner依赖项jar,因此我们会丢失一些服务提供者声明。这篇文章给了我解决问题的提示。使用ServicesResourceTransformer修复maven shade插件中的问题
shadowJar {
    mergeServiceFiles() 
}