2011-10-07 12 views
8

Czy ktoś to wcześniej zrobił? Jedyne odniesienie znalazłem na google został: http://onjava.com/onjava/2001/04/12/signing_jar.html który nadal korzysta słońce * zajęcia, które będą powodować problemy ...Jak programowo podpisywać pliki JAR w Javie?

Znaleziony to za dobrze, ale nie działa z java16. https://svn.cs.cf.ac.uk/projects/whip/trunk/whip-core/src/main/java/org/whipplugin/data/bundle/JarSigner15.java

+2

można po prostu zadzwonić proces osoby podpisującej słoik od wewnątrz Java. najlepiej używać ProcessBuilder. – clamp

Odpowiedz

0

jestem przy użyciu SingJar Ant task (która najwyraźniej nazywa narzędzie wiersza poleceń pod spodem). Powinno być możliwe wywołanie tego programowo.

+0

szukałem czegoś, co nie nazywa się "jarsigner" - wszystko zrobione w Javie ... – wuntee

+1

@wuntee: Podejrzewam, że Ant Tatuś zrobiłby to, gdyby było to łatwe. –

2

W pliku tools.jar znajduje się klasa sun.security.tools.JarSigner, która ma ciąg statyczny (ciągi ava.lang.String []), która ma takie same parametry jak plik wykonywalny jarsignera.

Więc można nazwać coś takiego:

sun.security.tools.JarSigner.run(new String[] { 
    "-keystore", keystoreFile.getAbsolutePath(), 
    "-storepass", keystorePassword, 
    outFile.getAbsolutePath(), 
    keystoreAlias 
}); 

Musisz upewnić tools.jar jest w ścieżce klas na kompilacji i wykonanie.

3

Aby rozwiązać nagłą zmianę ograniczeń zabezpieczeń w aplikacjach webstart w 7u45 Java stworzyliśmy simple signed jar file generator. Wykorzystuje moduł bcpkix Guava 15 i Bouncy Castle. Powinien działać na Java 6 & 7. Jest odpowiedni tylko dla małych plików. Użyj go w dowolnym celu.

3

Należy pamiętać, że klasa sun.security.tools.JarSigner została napisana do użycia jako narzędzie wiersza polecenia i nie została zaprojektowana do wywoływania z kodu Java. W rezultacie obsługa błędów jest dość gwałtowna: kod po prostu wypisze komunikat o błędzie na standardowe wyjście, a następnie zadzwoni pod numer System.exit()1.

Oznacza to, że jeśli zadzwonić klasę z poziomu kodu Java i wystąpi błąd podczas próby do podpisania słoik, JVM uruchomiony kod będzie po prostu zatrzymać. Może to być dobre w zależności od sytuacji, ale jeśli Twój kod działa długo lub działa jako usługa, nie jest tak dobry.

To dlatego lepiej zadzwonić narzędzie jarsigner używając ProcessBuilder zgodnie komentarzu zacisk jest. Następnie można wywołać waitFor() na wynikowym obiekcie Process i sprawdzić, czy polecenie zostało wykonane pomyślnie. getInputStream() pozwoli ci przeczytać wszystkie komunikaty o błędach, które zostały wypisane do standardowego wyjścia, jeśli operacja się nie powiedzie.

Powiązane problemy