2010-12-21 4 views
1

저는 독립 실행 형 실행 파일 형식으로 스칼라 런타임없이 서버에 배포하려는 간단한 Scala 응용 프로그램을 작성했습니다. SBT run을 통해 호출 할 때 모든 것이 올바르게 작동하지만 java -jar은 작동하지 않습니다. 나는 자바를 통해 항아리를 실행하면SBT와 ProGuard로 빌드 된 독립 실행 형 jar를 실행하는 경우 오류가 발생했습니다.

, 나는 다음과 같은 처리되지 않은 예외 수 :

Exception in thread "main" java.lang.AbstractMethodError: java.util.logging.Handler.publish(Ljava/util/logging/LogRecord;)V 
    at java.util.logging.Logger.log(Logger.java:458) 
    at net.lag.logging.Logger.log(Logger.scala:108) 
    at net.lag.logging.Logger.log(Logger.scala:91) 
    at net.lag.logging.Logger.info(Logger.scala:121) 
    at com.rentawebgeek.sitewiki.SiteWiki$.main(SiteWiki.scala:29) 
    at com.rentawebgeek.sitewiki.SiteWiki.main(SiteWiki.scala) 
Exception in thread "Thread-0" java.lang.AbstractMethodError: java.util.logging.Handler.close()V 
    at java.util.logging.LogManager.resetLogger(LogManager.java:682) 
    at java.util.logging.LogManager.reset(LogManager.java:665) 
    at java.util.logging.LogManager$Cleaner.run(LogManager.java:223) 

AbstractMethodError의 JavaDoc을 당, 나는 Configgy를 사용하고 있는데이 로거, 그리고를, 그것은 스칼라 관련이있을 거라고 생각/SBT는 내 쉘에서 호출하는 것과 다른 Java 버전을 사용합니다. 그러나 java -version$JAVA_HOME/bin/java -version (what /usr/local/bin/scala 사용)은 모두 1.6.0_22와 일치합니다.

내 ProGuard에서 옵션은 다음과 같습니다

//program entry point 
override def mainClass: Option[String] = Some("com.rentawebgeek.sitewiki.SiteWiki") 

//proguard 
override def proguardOptions = List(
    "-keepclasseswithmembers public class * { public static void main(java.lang.String[]); }", 
    "-dontoptimize", 
    "-dontobfuscate", 
    "-keep class *", 
    proguardKeepLimitedSerializability, 
    proguardKeepAllScala, 
    "-keep interface scala.ScalaObject" 
) 

override def proguardInJars = Path.fromFile(scalaLibraryJar) +++ super.proguardInJars 

어떻게이 오류를 해결할 수 있습니까? 또는 스칼라리스 배포를 위해 SBT 프로젝트에서 실행 가능한 jar를 빌드하는 다른 방법을 찾으십니까?

답변

1

SiteWiki.scala의 29 행에서 어떤 전화를 걸 었는지 확인하십시오. 그것은 불쾌한 전화입니다. 아마도 추상적 인 방법으로 특성/클래스를 호출하고있을 것입니다. 대부분의 경우 추상적 인 메소드를 구현해야하는 메소드는 proguard에 의해 찢어졌습니다. (또는 스칼라 오버라이드가 일치하지 않습니다.

문제가되는 통화를 찾기에 너무 길면; 여러 줄로 분해하려고 시도하십시오.

http://proguard.sourceforge.net/manual/examples.html#scala

이 문제가 해결되지 않으면, -printconfiguration의 출력과 발견에 도움이되는 콘솔 출력 :

+0

당신이 옳았습니다. ProGuard는 중요한 것을 제거하고있었습니다. 지금은'-keep' 옵션을 제거하고 대신'-dontshrink'를 사용하여 해결할 수있었습니다. 지금은 항아리의 크기는 신경 쓰지 않습니다. 감사! – Jeremy

0

최신 ProGuard에서 자료는 스칼라 응용 프로그램 플러스 스칼라 런타임을 처리하기위한 샘플 구성을 포함 근본 원인.