[HADOOP] META-INF / services에서 항목을 덮어 쓰지 않는 뚱뚱한 항아리를 만드는 방법
HADOOPMETA-INF / services에서 항목을 덮어 쓰지 않는 뚱뚱한 항아리를 만드는 방법
다음 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());
}
}
예상대로 IDE에서 기본 메소드를 실행하면 다음과 같은 출력이 표시됩니다.
org.apache.hadoop.mapred.YarnClientProtocolProvider@4783da3f
org.apache.hadoop.mapred.LocalClientProtocolProvider@300ffa5d
그러나 gradle fat jar 작업을 실행하고 fat jar을 만들 때 터미널을 통해 (java -jar)을 사용하여 주요 메소드를 실행하면 다음과 같이됩니다.
org.apache.hadoop.mapred.LocalClientProtocolProvider@7f31245a
뚱뚱한 항아리가 만들어지면 META-INF / services의 항목이 모든 종속성에 대해 병합되므로 YarnClientProtocolProvider에 대한 선언을 잃어 버리므로 코드에서 더 필요합니다.
YarnClientProtocolProvider는 hadoop-mapreduce-client-jobclient.jar에 선언되어 있습니다.
LocalClientProtocolProvider는 hadoop-mapreduce-client-common.jar에 선언되어 있습니다.
META-INF / services에서 항목을 병합하지 않는 뚱뚱한 항아리를 만드는 방법을 아는 사람이 있습니까?!
해결법
-
==============================
1.이 작업을 수행해야합니다
이 작업을 수행해야합니다
shadowJar { mergeServiceFiles() }
from https://stackoverflow.com/questions/44595145/how-to-create-fat-jar-which-does-not-overwrite-entries-under-meta-inf-services by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Apache에서 데이터 프레임을 캐시하는 방법 (0) | 2019.08.12 |
---|---|
[HADOOP] 행 키가 반전 된 URL 인 경우 HBase REST API (Stargate)를 찾는 방법 (0) | 2019.08.12 |
[HADOOP] FileInputFormat을 사용하여 맵 메소드에서 행 번호 가져 오기 (0) | 2019.08.12 |
[HADOOP] 하둡에서 CompressionCodec를 사용하는 방법 (0) | 2019.08.12 |
[HADOOP] Hadoop HDFS의 블록 개념 (0) | 2019.08.12 |