2017-09-18 5 views
2

sbt 어셈블리 플러그인을 사용하여 스파크 작업을 uber-jar로 패키지했습니다.sbt 어셈블리에서 uber jar를 실행하면 오류가 발생합니다. 주 클래스를 찾을 수 없거나로드 할 수 없습니다.

Error: Could not find or load main class com.foo.Bar

java -jar assembly.jar 

결과 build.sbt는 의도 된 명령을 실행하고, 올바르게 작성되어 조립 후 얻어진 우버 항아리

mainClass in assembly := Some("com.foo.Bar") 

의 대상이 될 수있는 실행 가능한 기본 지정

java -cp assembly.jar com.foo.Bar 같은 대체 방법을 사용하면 같은 오류 메시지가 나타납니다.

그런 다음 uber-jar의 내용을 새 디렉토리에서 추출했습니다. 내 com/foo/ 디렉토리와 Bar.class 파일을 볼 수 있습니다. 추출 된 디렉토리의 루트에서 내가 시도 :

java -cp . com.foo.Bar 

나는 정확한 결과를 얻을.

는 또한 오류의 원인을 찾기 위해 노력하고, 내가 시도 :

java -verbose -jar assembly.jar 

내가 자바 코어 클래스가로드되는 것을 볼 수 있습니다,하지만 난 내 패키지 클래스 중 하나가로드되는 표시되지 않습니다.

무엇이 잘못되었을 수 있습니까?

답변

3

광범위하게 조사한 결과 (머리카락 꺼내 짐) 머리말이 붙은 병의 META-INF 디렉토리에있는 평평한 병 파일 중 하나의 불량 INDEX.LIST이이 동작을 일으킨 것으로 나타났습니다.

JAR file spec 다음에 INDEX.LIST (있는 경우)은로드 할 Jar 파일의 패키지를 나타냅니다. 이 문제를 방지하려면

, 우리는 결과 META-INF 디렉토리의 오염을 방지하기 위해 원칙적으로 mergeStrategy 업데이트 :

case PathList("META-INF", xs @ _*) => MergeStrategy.discard 

이 문제를 해결하고 내 정신을 반환했습니다.


업데이트 : 몇 가지 추가 검색 후

, 그것은 default merge strategyINDEX.LIST의 적절한 치료를 취 것으로 나타났다. 이 대답은 맞춤 병합 전략에 META-INFpathSpec

을 처리하는 사례가 포함 된 경우에 적용됩니다.
관련 문제