2010-07-20 17 views
6

Zbudowałem aplikację (wiersza poleceń) w Scali, którą chcę rozpowszechniać jako samodzielny plik JAR. Buduję go z SBT:Jak podpisać autonomiczne pliki JAR 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" 
) 
} 

mogę uruchomić mój kod z sbt run grzywny i mogę spakować go i uruchomić ProGuard nad nim (nie jestem zainteresowany kasował - projekt będzie otwarty źródło i tak), używam go tylko do tworzenia samodzielnego JAR). W końcu otrzymuję plik .min.jar wbudowany w obiekt docelowy/scala_2.8.0/

To tutaj staje się skomplikowane. Jeśli uruchomić ten słój, uzyskać:

Wyjątek w wątku „głównym” java.lang.SecurityException: Nieprawidłowy plik podpisu strawienia dla Oczywista głównych atrybutów

Ok, nie podpisał.

Więc wygenerować sobie klucz podpisujący się następująco:

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

a następnie poniższy dokumentacji Java, staram się podpisać słoika:

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

To skłania mnie:

Enter Passphrase for keystore: 

Warning: 
The signer certificate will expire within six months. 

Dobra, w porządku. Teraz na pewno będzie działać!

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

Nie mam pojęcia, od czego zacząć. Jestem stosunkowo nowy na platformie Java.

Odpowiedz

1

Nie sądzę, że potrzebujesz ProGuard i podpisanie, aby wyprodukować samodzielny słoik. Możesz po prostu spakować wszystkie potrzebne klasy i katalog META-INF z właściwą ścieżką klas i zestawem klasy głównej w pliku zip, zmienić nazwę na jar i uruchomić. Zobacz this tutorial.

Niestety, nie odpowiedziałem na twoje pytanie, po prostu nie rozumiem, dlaczego chcesz podpisać swój słoik.

+0

Myślę, że problem polega na tym, że słoiki zwykle nie mogą zawierać słoików, jeśli dobrze pamiętam, podczas gdy ProGuard tworzy słoiki, które mogą. – pr1001

+0

Rozumiem, więc musi tylko rozpakować scala-library.jar do swojego słoika? –

1

Wpadłem na ten sam problem i okazało się, że problem polegał na tym, że sygnatury słoików zostały dodane przez proguard do katalogu META-INF. Właśnie dodałem je do filtrowanych plików:

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

i teraz działa idealnie.

Powiązane problemy