1

私は、スタンドアロンの実行可能な jar の形式で、Scala ランタイムを使用せずにサーバーに配布したい単純な 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 を使用しており、それはロガーであり、AbstractMethodErrorの javadocs に従って、シェルから呼び出しているものとは異なる Java バージョンを使用する Scala/SBT に関連している可能性があると考えました。ただし、java -versionand $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

このエラーを解決するにはどうすればよいですか? または、Scala を使用しないデプロイメント用に SBT プロジェクトから実行可能な jar をビルドする別の方法を見つけますか?

4

2 に答える 2

1

SiteWiki.scala の 29 行目で行っている呼び出しを確認してください。それが問題の呼び出しです。おそらく、抽象メソッドを使用してそこで特性/クラスを呼び出しています。ほとんどの場合、抽象メソッドを実装する必要があるメソッドがプロガードによって取り除かれます (または、Scala オーバーライドが一致しません (私はそれが起こるのを見てきました))。

問題のある通話を見つけるのに回線が長い場合。複数行に分解してみてください。

于 2010-12-21T08:33:50.710 に答える
0

最新の ProGuard リリースには、Scala アプリケーションと Scala ランタイムを処理するためのサンプル構成が含まれています。

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

それでもうまくいかない場合は、-printconfiguration の出力とコンソール出力が根本原因の特定に役立つ場合があります。

于 2010-12-21T23:56:48.543 に答える