2010-07-20 10 views
6

Tôi đã xây dựng một ứng dụng (dòng lệnh) trong Scala mà tôi muốn phân phối dưới dạng một JAR độc lập. Tôi đang xây dựng nó với SBT:Tôi làm cách nào để ký các JAR độc lập của 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" 
) 
} 

tôi có thể chạy mã của tôi với sbt run tốt, và tôi có thể gói nó và chạy ProGuard trên nó (Tôi không quan tâm đến việc Obfuscating - dự án sẽ được mở nguồn anyway), tôi chỉ sử dụng nó để tạo ra một JAR độc lập). Vì vậy, cuối cùng tôi nhận được tệp .min.jar được tạo trong target/scala_2.8.0/

Đây là nơi nó trở nên phức tạp. Nếu tôi chạy JAR này, tôi nhận được:

ngoại lệ trong chủ đề java.lang.SecurityException "chính": tập tin chữ ký không hợp lệ tiêu hóa cho các thuộc tính chính Manifest

Được rồi, tôi chưa ký vào đó.

Vì vậy, tôi tạo ra bản thân mình một phím ký như sau:

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

Và sau đó, sau khi tài liệu Java, tôi cố gắng ký JAR:

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

Nó nhắc nhở tôi:

Enter Passphrase for keystore: 

Warning: 
The signer certificate will expire within six months. 

OK, được rồi. Bây giờ, chắc chắn, nó sẽ chạy!

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

Tôi không biết bắt đầu từ đâu. Tôi tương đối mới với nền tảng Java.

Trả lời

1

Tôi không nghĩ bạn cần ProGuard và ký để tạo một cái bình độc lập. Bạn chỉ có thể đóng gói tất cả các lớp bạn cần và một thư mục META-INF với classpath thích hợp và lớp chính được đặt trong một tệp zip, đổi tên nó thành jar và nó sẽ chạy. Xem this tutorial.

Rất tiếc, tôi không trả lời câu hỏi của bạn, tôi chỉ không hiểu tại sao bạn muốn ký vào bình của mình.

+0

Tôi nghĩ rằng vấn đề là bình thường không thể chứa lọ, nếu tôi nhớ chính xác, trong khi ProGuard tạo ra lọ có thể. – pr1001

+0

Tôi thấy, vì vậy anh ta chỉ cần giải nén scala-library.jar vào bình của mình? –

1

Tôi gặp phải vấn đề tương tự và có vẻ vấn đề là chữ ký của mặt trời được thêm vào bởi người bảo vệ trong thư mục META-INF. Tôi vừa thêm chúng vào các tệp đã lọc:

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

và hiện hoạt động hoàn hảo ngay bây giờ.