2010-07-20 10 views
6

J'ai construit une application (en ligne de commande) dans Scala que je veux distribuer en tant que JAR autonome. Je construis avec SBT:Comment signer mes fichiers JAR autonomes Scala de ProGuard?

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" 
) 
} 

je peux exécuter mon code avec sbt run bien, et je peux emballer et courir ProGuard dessus (je ne suis pas intéressé par obscurcissant - le projet va être ouvert source quand même), je l'utilise juste pour produire un JAR autonome). Donc, j'obtiens finalement un fichier .min.jar construit dans target/scala_2.8.0/

C'est là que ça devient compliqué. Si je lance ce JAR, je reçois:

Exception dans le thread "principal" java.lang.SecurityException: fichier de signature non valide pour les attributs principaux digest Manifest

D'accord, je ne l'ai pas signé.

Alors, je me produis une clé de signature comme suit:

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

Et puis, après la documentation Java, je tente de signer le JAR:

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

Il me demande:

Enter Passphrase for keystore: 

Warning: 
The signer certificate will expire within six months. 

D'accord, c'est bien. Maintenant, sûrement, ça va courir!

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

Je n'ai aucune idée par où commencer. Je suis relativement nouveau sur la plateforme Java.

Répondre

1

Je ne pense pas que vous ayez besoin de ProGuard et de la signature pour produire un pot autonome. Vous pouvez simplement emballer toutes les classes dont vous avez besoin et un répertoire META-INF avec le classpath approprié et la classe principale définie dans un fichier zip, le renommer en jar et il devrait fonctionner. Voir this tutorial.

Désolé, je n'ai pas répondu à votre question, je ne comprends tout simplement pas pourquoi vous voulez signer votre pot.

+0

Je pense que le problème est que les bocaux ne peuvent normalement pas contenir de bocaux, si je me souviens bien, alors que ProGuard crée des bocaux qui le peuvent. – pr1001

+0

Je vois, donc il a juste besoin de décompresser scala-library.jar dans son pot? –

1

J'ai rencontré le même problème et il semble que le problème était que les signatures jar du soleil ont été ajoutées par proguard dans le répertoire META-INF. Je les ai simplement ajoutés aux fichiers filtrés:

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

et cela fonctionne parfaitement maintenant.