2010-07-22 18 views
9

Các tệp JAR của tôi phải được ký cho một ứng dụng webstart. Nó sẽ được tốt đẹp để cũng có họ đóng gói để giảm thiểu thời gian tải về. Tôi đang cố gắng để cấu hình một nhiệm vụ Ant để tự động làm điều đó trong quá trình triển khai ứng dụng. Kể từ khi quá trình gói tổ chức lại các jar cấu trúc bên trong làm vô hiệu các chữ ký, các Pack200 documentation đề xuất một quy trình 3 bước:Làm thế nào để tạo một tác vụ Ant để ký và đóng gói tất cả các tệp JAR của tôi?

  1. Đóng gói lại JAR với pack200
  2. Ký tên vào JAR với jarsigner
  3. Compress JAR jar với pack200 tạo ra một .jar.pack.gz file

Ant có nhiệm vụ signjar mặc định và Sun xuất bản Pack200 ant task.

Vấn đề là nhiệm vụ Sun pack200 chỉ hoạt động trên một tệp tại một thời điểm và thao tác repack phải chỉ định tệp đầu ra.

Tôi tin rằng nó phải là một hoạt động khá phổ biến, nhưng tệp kiến ​​thức của tôi đang trở nên quá phức tạp và có quá nhiều tệp tạm thời. Thời gian để cầu xin sự khôn ngoan của cộng đồng:

Có cách nào dễ dàng hoặc ít nhất là tiêu chuẩn để đóng gói và ký tất cả các tệp JAR của tôi không?

Trả lời

10

Đây là giải pháp của riêng tôi. Tôi đã bỏ qua prebuild anttargets và quyết định chạy trực tiếp gói thực thi pack200.

Cách tiếp cận này có một số ưu điểm:

  • nó hoạt động (jarsigner đã thất bại trong việc xác minh một số lọ)
  • không phụ thuộc bên cạnh những jdk
  • nó không dành nhiều thời gian đóng gói lại đã repacked lọ
  • nó có thể ký và đóng gói lại các tệp nội tuyến, cho phép tôi đặt phiên bản đã ký trong điều khiển phiên bản. Không cần phải ký hai lần.

Đây là mã của macro đóng gói lại và dấu hiệu 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> 

Và đây là làm thế nào để đóng gói:

<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 để cung cấp thông tin nhiều hơn một chút cho những người không biết kiến ​​rất tốt:

Nhiệm vụ ở trên trước thẻ của bạn. Bên trong thẻ của bạn trước tiên hãy thực hiện cuộc gọi tới macro như thế này để trước tiên hãy đặt lại và ký tên từng tệp:

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

Sau đó, làm theo điều đó bằng thẻ từ trên cao. Điều này sẽ thực hiện đóng gói cuối cùng cho mỗi tệp.

+0

pack200 sẽ thất bại nếu JAR được ký trước hoạt động đóng gói lại. Trong trường hợp này, bạn sẽ nhận được thông báo lỗi như "lỗi ngoại lệ trong chuỗi" chính "lỗi java.lang.SecurityException: SHA1 digest for ..." Lỗi cơ bản là việc ký vào dấu đóng gói trả về thành công, nhưng nếu bạn chạy jarsigner -xác minh, nó sẽ báo cáo một thất bại. – cmcginty

+0

Bạn cũng nên thêm đối số --segment-limit = -1 vào mục tiêu repack để tránh lỗi http://bugs.sun.com/view_bug.do?bug_id=5078608 (xem cách giải quyết thứ nhất). – foch

1

Bạn có thể sử dụng một fileset trong nhiệm vụ 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> 

tôi sử dụng đoạn mã trên để đăng ký ứng dụng WebStart của tôi mà bao gồm khoảng 70 lọ

Các vấn đề liên quan