2010-07-20 7 views
6

He creado una aplicación (línea de comandos) en Scala que deseo distribuir como un JAR independiente. Estoy construyendo con SBT:¿Cómo firmo mis archivos JAR autónomos ProGuard'ed Scala?

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

puedo correr mi código con sbt run bien, y se puede empaquetar y ejecutar ProGuard sobre ella (no estoy interesado en ofuscar - el proyecto va a estar abierto fuente de todos modos), solo lo estoy usando para producir un JAR independiente. Por lo tanto, finalmente obtengo un archivo .min.jar integrado en target/scala_2.8.0/

Aquí es donde se complica. Si me quedo este frasco, me sale:

Excepción en hilo java.lang.SecurityException "principal": archivo de firma no válida para digerir los atributos principales del manifiesto

Está bien, no he firmado.

Así, genero a mí mismo una clave de firma de la siguiente manera:

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

Y luego, después de la documentación de Java, trato de firmar el JAR:

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

Me pide:

Enter Passphrase for keystore: 

Warning: 
The signer certificate will expire within six months. 

Bien, está bien. ¡Ahora, seguramente, correrá!

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

No tengo ni idea de por dónde empezar. Soy relativamente nuevo en la plataforma Java.

Respuesta

1

No creo que necesite ProGuard y firmar para producir un jar independiente. Puedes empacar todas las clases que necesites y un directorio META-INF con el classpath y la clase principal correctos establecidos en un archivo zip, cambiarle el nombre a jar y se debería ejecutar. Ver this tutorial.

Disculpa, no respondí tu pregunta, simplemente no entiendo por qué quieres firmar tu jar.

+0

Creo que el problema es que los frascos normalmente no pueden contener frascos, si mal no recuerdo, mientras que ProGuard crea frascos que sí pueden. – pr1001

+0

Ya veo, ¿así que solo necesita descomprimir scala-library.jar en su jar? –

1

Me encontré con el mismo problema y parece que el problema era que las firmas de jar de sun fueron agregadas por proguard en el directorio META-INF. Acabo de agregarlos a los archivos filtrados:

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

y funciona perfectamente ahora.

Cuestiones relacionadas