【发布时间】:2011-05-28 14:00:59
【问题描述】:
我编写了一个简单的 Scala 应用程序,我想以独立的可执行 jar 的形式分发到没有 Scala 运行时的服务器。通过SBT run 调用时一切正常,但不是java -jar。
当我通过 java 运行 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)
我正在使用 Configgy,它是 Logger,并且根据 AbstractMethodError 的 javadocs,我认为它可能与 Scala/SBT 相关,使用的 Java 版本与我从 shell 中调用的 Java 版本不同。但是,java -version 和 $JAVA_HOME/bin/java -version(/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 以进行无 Scala 部署?
【问题讨论】:
标签: scala executable-jar sbt proguard