2010-07-22 13 views
9

Moje pliki JAR muszą być podpisane dla aplikacji webstart. Byłoby miło również je zapakować, aby zminimalizować czas pobierania. Próbuję skonfigurować zadanie Ant, aby automatycznie robił to podczas wdrażania aplikacji. Ponieważ proces paczka reorganizuje strukturę wewnętrzną jar unieważniania podpisu, Pack200 documentation zaleca proces 3 kroki:Jak wykonać zadanie Ant, aby podpisać i spakować wszystkie moje pliki JAR?

  1. zapakować słoik z pack200
  2. Wpisz się słoik z jarsigner
  3. Compress Jar Jar z pack200 generując .jar.pack.gz plik

Ant ma domyślne zadanie signjar, a Sun opublikował Pack200 ant task.

Problem polega na tym, że zadanie Sun pack200 działa tylko na jednym pliku naraz, a operacja ponownego pakowania musi określać plik wyjściowy.

Uważam, że powinna to być dość powszechna operacja, ale mój plik ant staje się zbyt skomplikowany i jest zbyt wiele plików tymczasowych. Czas błagać o mądrość społeczności:

Czy istnieje prosty, a przynajmniej standardowy sposób pakowania i podpisywania wszystkich moich plików JAR?

Odpowiedz

10

Oto moje własne rozwiązanie. Odrzuciłem prebuild anttargets i zdecydowałem się uruchomić bezpośrednio plik wykonywalny pack200.

Takie podejście ma kilka zalet:

  • to działa (jarsigner był nie sprawdzając kilka słoików)
  • żadnych zależności oprócz JDK
  • nie spędzają dużo czasu przepakowania już przepakowane słoiki
  • może podpisać i zapakować pliki w linii, co pozwala mi umieścić podpisaną wersję pod kontrolą wersji. Nie musisz dwukrotnie podpisywać.

Oto kod makra, które przepakować i znaki inline:

<macrodef name="repack-and-sign"> 
    <attribute name ="rootdir"/> 
    <sequential> 
      <echo message="Repacking libs in @{rootdir}"/> 
     <apply executable="pack200" parallel="false"> 
      <arg value="--repack"/> 
      <arg value="--segment-limit=-1"/> 
      <fileset dir="@{rootdir}" includes="**/*.jar" /> 
     </apply> 

     <echo message="Signing libs in @{rootdir}"/> 
     <signjar 
      alias="${keystore.alias}" keystore="${keystore.file}" storepass="${keystore.password}" 
      lazy="true"> 
      <path> 
       <fileset dir="@{rootdir}" includes="**/*.jar" /> 
      </path> 
     </signjar> 
    </sequential> 
</macrodef> 

A oto jak zapakować:

<apply executable="pack200" parallel="false" dest="${dir.tomcat.jar}"> 
     <arg value="--modification-time=latest"/> 
     <arg value="--deflate-hint=true"/> 
     <arg value="--segment-limit=-1"/> 
     <targetfile/> 
     <srcfile/> 
     <fileset dir="${dir.tomcat.jar}" includes="**/*.jar" /> 
    <mapper type="glob" from="*" to="*.pack.gz" /> 
    </apply> 

Edited by zapewnić trochę więcej informacji dla osób, które nie znam tak dobrze:

Powyższe zadanie przechodzi przed tagami. Wewnątrz tag najpierw umieścić wywołanie makra jak to tak, że najpierw repacks i znaki każdy plik:

<repack-and-sign rootdir="${dir.tomcat.jar}" /> 

Następnie że z tagiem z góry. Spowoduje to końcowe pakowanie dla każdego pliku.

+0

pack200 nie powiedzie się, jeśli JAR została podpisana przed operacją przepakować. W takim przypadku pojawi się komunikat o błędzie, taki jak "Wyjątek w wątku", główny "java.lang.SecurityException: Błąd trawienia SHA1 dla ..." Podstawowy błąd polega na tym, że podpisanie pakowanego słoika zwraca sukces, ale jeśli uruchomisz aplikację jarsigner - weryfikuj, zgłosi błąd. – cmcginty

+0

Warto również dodać argument -segment-limit = -1 do docelowego ponownego pakowania, aby uniknąć błędu http://bugs.sun.com/view_bug.do?bug_id=5078608 (patrz pierwsze obejście). – foch

1

Można użyć zestawu plików w ramach zadania signjar

<signjar alias="ws" keypass="wskey" 
       storepass="wspass" keystore="${artifact.root.dir}/deployJAWS.key"> 
      <fileset dir="${lib.temp.root.dir}"> 
       <include name="**/*.jar" /> 
      </fileset> 
</signjar> 

Używam powyższy fragment podpisać mój wniosek webstart który składa się około 70 słoików

Powiązane problemy