2011-10-07 4 views
8

Có ai đã làm điều này trước đây không? Các tài liệu tham khảo duy nhất tôi đã tìm thấy trên google đã được: http://onjava.com/onjava/2001/04/12/signing_jar.html mà vẫn sử dụng ánh nắng mặt trời * lớp học mà sẽ gây ra vấn đề ...Làm thế nào để bạn lập trình ký các tệp jar trong Java?

Các mặt hàng này là tốt, nhưng không làm việc với java16:. https://svn.cs.cf.ac.uk/projects/whip/trunk/whip-core/src/main/java/org/whipplugin/data/bundle/JarSigner15.java

+2

bạn chỉ có thể gọi quy trình người ký jar từ bên trong java. tốt nhất khi sử dụng ProcessBuilder. – clamp

Trả lời

0

Tôi sử dụng SingJar Ant task (mà dường như gọi công cụ dòng lệnh bên dưới). Nó có thể gọi đó là lập trình.

+0

đang tìm kiếm thứ gì đó không gọi là 'jarsigner' - tất cả được thực hiện trong java ... – wuntee

+1

@wuntee: Tôi nghi ngờ rằng Ant taks sẽ làm điều đó nếu nó dễ dàng có thể. –

2

Trong tệp tools.jar là lớp sun.security.tools.JarSigner có phương thức chạy tĩnh (ava.lang.String [] strings) có cùng các tham số như tệp thực thi jarsigner.

Vì vậy, bạn có thể gọi một cái gì đó như:

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

Bạn cần phải chắc chắn tools.jar là trong classpath của bạn để biên dịch và thực hiện.

3

Để giải quyết thay đổi đột ngột các giới hạn bảo mật trong các ứng dụng WebStart trong Java 7u45, chúng tôi đã tạo một simple signed jar file generator. Nó sử dụng Guava 15 và Bouncy Castle bcpkix module. Nó sẽ chạy trên Java 6 & 7. Nó chỉ phù hợp cho các tệp nhỏ. Sử dụng nó cho bất kỳ mục đích nào bạn muốn.

3

Lưu ý rằng lớp sun.security.tools.JarSigner được viết để sử dụng làm tiện ích dòng lệnh và không được thiết kế để gọi từ mã Java. Kết quả là, việc xử lý lỗi khá đột ngột: mã sẽ chỉ in thông báo lỗi thành tiêu chuẩn và sau đó gọi System.exit()1.

Điều này có nghĩa là nếu bạn gọi lớp từ bên trong mã Java của bạn và một lỗi xảy ra khi bạn cố gắng ký vào một bình, JVM chạy mã của bạn sẽ chỉ dừng lại. Điều này có thể tốt tùy thuộc vào tình huống của bạn, nhưng nếu mã của bạn hoạt động lâu dài hoặc hoạt động như một dịch vụ, nó không tốt lắm.

Vì vậy, tốt hơn nên gọi công cụ jarsigner bằng cách sử dụng bình luận của ProcessBuilder theo bình luận của kẹp. Sau đó, bạn có thể gọi waitFor() trên đối tượng Quy trình kết quả và kiểm tra exitValue() để xem liệu lệnh có thành công hay không. getInputStream() sẽ cho phép bạn đọc bất kỳ thông báo lỗi nào được viết thành tiêu chuẩn nếu hoạt động không thành công.