2011-12-15 4 views
9

RemoteActors를 사용하는 작은 응용 프로그램이있어서이 응용 프로그램에서 jar 파일을 만들고 싶습니다. 나는 그것을 실행하려고하면 그것은이 예외 가져옵니다 내 jar 파일에 스칼라 - library.jar을 포함했다Scala jar 파일을 실행할 때 NoClassDefFoundError

Exception in thread "main" java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 
Caused by: java.lang.NoClassDefFoundError: scala/actors/Combinators 
    at pingpong.PingApp$.main(PingApp.scala:5) 
    at pingpong.PingApp.main(PingApp.scala) 
    at pingpong.ScalaEntryPoint.main(ScalaEntryPoint.java:5) 
    ... 5 more 
Caused by: java.lang.ClassNotFoundException: scala.actors.Combinators 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
    ... 8 more 

을, 그리고 클래스 패스에 있습니다. 그렇지 않으면 java가 클래스 ScalaObject을 찾지 못하게됩니다.

+0

더 많은 런타임 정보가 유용 할 것입니다. 메이븐과 항아리를 만들려고하십니까? 또는 Eclipse로 실행하는 것입니까? – hellectronic

+1

최소한, 호출 한 명령 행을 표시하고 사용중인 스칼라 버전을 언급하십시오. – retronym

+0

명령 : java -jar myjar.jar 스칼라 2.7.7을 사용 중입니다. – laci37

답변

1

이클립스의 스칼라 플러그인과 설치된 스칼라 버전간에 버전이 일치하지 않는 문제가있었습니다. actors/Combinators.scala는 2.8 버전이었고 Eclipse 플러그인은 2.8 버전 이었지만 2.7.7 scala-library.jar가 포함되었습니다.

4

Java는 "jar 내 jar"를 처리하지 않습니다. 기본 클래스 로더는 그런 식으로 클래스를로드 할 수 없습니다.

stacktrace에서 이클립스의 export-> java-> runnable jar를 사용한 것처럼 보입니다. jar 로딩에서 jar를 처리하는 특수 클래스 로더를 포함해야하지만 작동하지 않는 것 같습니다.

나는 병을 만드는 것이 잘못되었다고 생각합니다. 또는 여러분의 병과 클래스 패스에 스칼라가 모두 포함되어 있다고 혼란스러워 할 것입니다. "라이브러리를 병에 패키지로 저장하기"보다는 "추출 된 라이브러리를 병으로 추출"을 사용하여 다시 시도 할 수 있습니다. classpath에서 scala없이 시도해 볼 수 있습니다.

단일로 선적 항아리하려면 다른 옵션이 있다는 것을 실패 :

  • 당신은에 의존하는 항아리의 모든 포장을 풀고 "추출"무엇을해야한다 (컴파일 된 클래스로 재 포장 할 수 않습니다 위). Maven의 shade 플러그인이 도움이 될 수 있습니다.

  • 당신은 당신이 정확히 무엇을 단계를 설명 할 필요가 더 도움이 필요하면이 유용 OneJar

희망 같은 중첩 된 항아리를로드 할 수있는 클래스 로더의 구현을 제공하는 다른 솔루션을 사용할 수 있습니다 이 항아리를 생산하기 위해 데려가십시오. 아마도 "jar tvf myjar.jar"의 결과물도 도움이 될 것입니다.

+0

jar 파일에 scala 라이브러리를 추출하려고했지만 결과도 같은 예외입니다. scala-library.jar의 scala.actors.Combinators 클래스가없는 것 같습니다. – laci37

+0

"jar tvf myjar.jar"을 실행하고 scala-lang이 거기에있는 것으로 표시되는지 확인하십시오. 이 경우 임시 폴더에 (jar xvf) myjar.jar을 추출한 다음 같은 방법으로 존재하는 scala-lang.jar를 검사하십시오. –

+0

jar tvf ping.jar | grep scala-lang은 결과를 보여주지 않습니다. 병을 뽑아서 scala-lang이라는 파일을 찾지 못했습니다. – laci37

관련 문제