Как подписать мои автономные JAR-файлы Scala от ProGuard? - PullRequest
6 голосов
/ 20 июля 2010

Я создал приложение (командной строки) в Scala, которое я хочу распространять в виде отдельного JAR-файла.Я создаю его с помощью sbt:

import sbt._

class Project(info: ProjectInfo) extends DefaultProject(info) with ProguardProject {
  override def parallelExecution = true      
  override def mainClass: Option[String] = // whatever

  override def libraryDependencies = Set(
    // whatever
  ) ++ super.libraryDependencies

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

Я могу запустить свой код с sbt run отлично, и я могу упаковать его и запустить ProGuard поверх него (меня не интересует запутывание - проектв любом случае будет с открытым исходным кодом), я просто использую его для создания автономного JAR).Итак, я в итоге получаю файл .min.jar, встроенный в target / scala_2.8.0 /

Вот где все становится сложнее.Если я запускаю этот JAR, я получаю:

Исключение в потоке "main" java.lang.SecurityException: неверный дайджест файла подписи для основных атрибутов Manifest

Хорошо, яЯ не подписал его.

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

keytool -keystore ~/.keystore -genkey -alias tom

И затем, следуя документации Java, я пытаюсь подписать JAR:

jarsigner -signedjar [whatever].jar -keystore ~/.keystore target/scala_2.8.0/[whatever]-1.0.min.jar tom

Это подсказывает мне:

Enter Passphrase for keystore: 

Warning: 
The signer certificate will expire within six months.

Хорошо, все в порядке.Теперь, конечно, он будет работать!

$ java -jar [whatever].jar
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

Я понятия не имею, с чего начать.Я относительно новичок в платформе Java.

Ответы [ 2 ]

1 голос
/ 08 октября 2010

Я столкнулся с той же проблемой, и, похоже, проблема заключалась в том, что сигнатуры jar от Sun были добавлены proguard в каталог META-INF. Я просто добавил их в отфильтрованные файлы:

override def makeInJarFilter (file :String) =
  super.makeInJarFilter(file) + ",!**/SUN_MICR.RSA,!**/SUN_MICR.SF"

и теперь он отлично работает.

1 голос
/ 20 июля 2010

Я не думаю, что вам нужен ProGuard и подпись, чтобы создать автономную банку.Вы можете просто упаковать все нужные вам классы и каталог META-INF с правильным classpath и основным классом в zip-файле, переименовать его в jar, и он должен запуститься.См. этот урок .

Извините, я не ответил на ваш вопрос, я просто не понимаю, почему вы хотите подписать свою банку.

...