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.
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
Ya veo, ¿así que solo necesita descomprimir scala-library.jar en su jar? –