2010-07-20 11 views
6

Ich habe eine (Befehlszeilen-) Anwendung in Scala erstellt, die ich als eigenständige JAR verteilen möchte. Ich baue es mit sbt:Wie unterzeichne ich meine ProGuard'ed Scala Stand-Alone-JARs?

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

Ich kann meinen Code mit sbt run gut laufen, und ich kann es packen und laufen ProGuard über sie (ich in Verschleiern bin nicht interessiert - das Projekt wird geöffnet sein Quelle), verwende ich es nur, um eine eigenständige JAR zu erzeugen). Also, ich bekomme schließlich eine .min.jar-Datei in Ziel/scala_2.8.0/

Dies ist, wo es kompliziert wird. Wenn ich diese JAR laufen, erhalte ich:

Exception in thread "main" java.lang.SecurityException: Ungültige Signaturdatei für Manifest Hauptattribute verdauen

Okay, habe ich unterschrieben nicht.

Also, ich erzeuge ich einen Signaturschlüssel wie folgt:

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

Und dann, nach der Java-Dokumentation, ich versuche, die JAR zu unterzeichnen:

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

Es fordert mich:

Enter Passphrase for keystore: 

Warning: 
The signer certificate will expire within six months. 

Okay, das ist in Ordnung. Jetzt wird es sicher laufen!

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

Ich habe keine Ahnung, wo ich anfangen soll. Ich bin relativ neu in der Java-Plattform.

Antwort

1

Ich glaube nicht, dass Sie ProGuard und Signing benötigen, um ein eigenständiges Glas zu produzieren. Sie können einfach alle benötigten Klassen und ein META-INF-Verzeichnis mit dem richtigen Klassen- und Hauptklassensatz in eine Zip-Datei packen, es in jar umbenennen und es sollte laufen. Siehe this tutorial.

Entschuldigung, ich habe deine Frage nicht beantwortet, ich verstehe einfach nicht, warum du dein Glas unterschreiben willst.

+0

Ich denke, das Problem ist, dass Gläser normalerweise Gläser nicht enthalten können, wenn ich mich richtig erinnere, während ProGuard Gläser herstellt, die können. – pr1001

+0

Ich sehe, also muss er nur scala-library.jar in sein Glas auspacken? –

1

Ich stieß auf das gleiche Problem und es scheint, das Problem war, dass Suns Jar Signaturen von Proguard im META-INF-Verzeichnis hinzugefügt wurden. Ich habe sie nur zu den gefilterten Dateien hinzugefügt:

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

und es funktioniert jetzt perfekt.