Entry META-INF/DEPENDENCIES is a duplicate but no duplicate handling strategy has been set

gnswp21·2024년 5월 14일

이 제목의 에러가 발생했다면 실행가능한 jar 파일 (혹은 fat-jar)를 빌드하는 과정에서 발생한 문제일 것입니다.
이는 Jar 파일로 만들려는 라이브러리 중에 하나가, META-INF/DEPENDENCIES 라는 이름의 파일을 두개 이상 가지고 있기 때문입니다.
따라서, 같은 이름의 파일이 나오면 어떻게 할 지 대처방안을 제시해주면 해결 됩니다.

예시,

plugins {
    id 'java'
}

group = 'com.example'
version = '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.slf4j:slf4j-simple:1.7.30'
    implementation 'org.apache.hadoop:hadoop-client:3.3.6'
    implementation 'org.apache.kafka:kafka-clients:2.5.1'

}

jar{
    enabled=true
    archiveClassifier = '' // use empty string

    from { // 의존성 포함
        configurations.runtimeClasspath.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE  //  중복처리 전력 제시해주는 부분 
}

하지만, 이렇게 하면 META-INF/DEPENDENCIES 중 일부를 유실함으로, 클래스로드가 정상적으로 안되는 경우도 있습니다.

저의 경우 하둡의 파일시스템 클래스중 distributed file system(DFS이 로드 되지 않고 로컬 파일시스템만이 로드 되었습니다. DFS 클래스를 지칭하는 META-INF/DEPENDENCIES이 유실되었기 때문입니다.

configuration.set("fs.hdfs.impl",
                    org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()
            );

이를 소스 코드에 직접 클래스를 설정해주어 유실된 메타파일이 필요없게 설정해줄 수 있었습니다. 소스코드가 더 늘어난다는 문제점이 있고 앞으로도 같은 문제가 반복될 수 있어 아쉽지만 일단은 해결되었으니 더 나은 해결책을 찾는다면 추후에 추가하겠습니다.

0개의 댓글