2010-07-20 8 views
6

Ho realizzato un'applicazione (da riga di comando) in Scala che voglio distribuire come JAR indipendente. Sto costruendo con SBT:Come posso firmare i miei JAR stand-alone di 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" 
) 
} 

posso correre il mio codice con sbt run bene, e posso pacchetto ed eseguire ProGuard su di esso (io non sono interessato a offuscare - il progetto sta per essere aperto fonte comunque), sto solo usando per produrre un JAR standalone). Così, alla fine ho ottenere un file .min.jar costruito nel target/scala_2.8.0/

Questo è dove diventa complicato. Se corro questo JAR, ottengo:

Exception in thread java.lang.SecurityException "principale": file di firma non valido digerire per Manifest attributi principali

Va bene, io non l'ha firmata.

Così, ho generare io stesso una chiave di firma come segue:

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

E poi, a seguito della documentazione di Java, cerco di firmare il JAR:

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

Mi chiede:

Enter Passphrase for keystore: 

Warning: 
The signer certificate will expire within six months. 

Va bene, va bene. Ora, sicuramente, funzionerà!

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

Non ho idea da dove cominciare. Sono relativamente nuovo alla piattaforma Java.

risposta

1

Non credo che avete bisogno di ProGuard e la firma per la produzione di un vaso stand-alone. Puoi semplicemente mettere in valigia tutte le classi di cui hai bisogno e una directory META-INF con classepath e classe principale corretti in un file zip, rinominarla in jar e dovrebbe essere eseguita. Vedi this tutorial.

Spiacente, non ho risposto alla tua domanda, io proprio non capisco perché si vuole firmare il vaso.

+0

Credo che il problema è che i vasetti normalmente non possono contenere barattoli, se non ricordo male, mentre ProGuard crea vasi che possono. – pr1001

+0

Vedo, quindi ha solo bisogno di decomprimere scala-library.jar nel suo barattolo? –

1

Ho incontrato lo stesso problema e sembra che il problema era che le firme vaso del sole sono stati aggiunti da Proguard nella directory META-INF. Ho appena aggiunto ai file filtrati:

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

e funziona perfettamente ora.