Hadoop 프로젝트의 Map-Reduce 과정에서 외부라이브러리를 사용해야했으나, 빌드 후 생성된 Jar파일을 실행시키면 NoClassDefFoundError
가 발생하는 상황
나의 경우 외부라이브러리는 형태소 분석기 Komoran이었다.
외부라이브러리가 위치해야하는 곳이 따로 있다고 한다. 해당 위치에 놓는 것만으로는 안되고, 외부라이브러리 경로(HADOOP_CLASSPATH)를 지정해주어야한다고.
vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
# 특정 폴더 안에 모든 jar파일을 참조할 수 있도록 외부 라이브러리 경로 지정
# hadoop-env.sh 파일에 다음을 적고 저장한다.
export HADOOP_CLASSPATH=$(find $HADOOP_HOME/share/hadoop -name '*.jar' | xargs echo | tr ' ' ':')
또한 Jar파일을 실행시키기 위해서 해당 파일의 클래스 명을 함께 적어주어야한다.
나의 경우 com.test.study.haddop.WordCount
가 이에 해당한다.
hadoop jar hadoop.jar com.test.study.hadoop.WordCount test test_out
jar {
manifest {
attributes 'Main-Class': '메인클래스'
}
from configurations.runtime.collect { zipTree(it) }
}
jar {
archiveName = 'Name.jar'
manifest {
attributes 'Main-Class': 'your.main.class',
'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' '),
'Implementation-Version': project.version
}
from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) {}
}
IDE Project Structure 수정 - 링크 누락
Project Structure - Artifacts - Output Layout - Available Elements 수정 - 링크 누락
build.gradle 수정3 링크
그외 기타