저는 독립 실행 형 실행 파일 형식으로 스칼라 런타임없이 서버에 배포하려는 간단한 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를 빌드하는 다른 방법을 찾으십니까?
당신이 옳았습니다. ProGuard는 중요한 것을 제거하고있었습니다. 지금은'-keep' 옵션을 제거하고 대신'-dontshrink'를 사용하여 해결할 수있었습니다. 지금은 항아리의 크기는 신경 쓰지 않습니다. 감사! – Jeremy