AbstractMethodError при запуске автономного jar, созданного с помощью SBT и ProGuard - PullRequest
1 голос
/ 21 декабря 2010

Я написал простое приложение для Scala, которое я хотел бы распространять в виде отдельного исполняемого файла jar для серверов без среды выполнения Scala.Все работает нормально, когда вызывается через SBT run, но не java -jar.

Когда я запускаю jar через java, я получаю следующее необработанное исключение:

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, и, согласно javadocs для AbstractMethodError , думал, что это может быть связано с Scala / SBT, использующим другую версию 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

Как я могу устранить эту ошибку?Или найти другой способ создания исполняемого jar-файла из проекта SBT для развертывания без Scala?

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

Проверьте, что вы делаете в строке 29 в SiteWiki.scala;это оскорбительный звонок.Вы, вероятно, вызываете черту / класс с абстрактным методом.Скорее всего, метод, который должен реализовывать абстрактный метод, отрывается proguard (или там переопределение Scala не совпадает (я видел, что это произошло))

Если линия длинная, чтобы найти вызывающий вызов;попытаться разложить на несколько строк.

0 голосов
/ 22 декабря 2010

Последние выпуски ProGuard содержат пример конфигурации для обработки приложения Scala плюс время выполнения Scala:

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

Если это не сработает, вывод -printconfiguration ивывод консоли может помочь найти основную причину.

...