2010-07-20 16 views
6

我在Scala中構建了一個(命令行)應用程序,我想將其作爲獨立JAR進行分發。我與SBT構建它:如何簽署我的ProGuard'ed Scala獨立JAR?

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" 
) 
} 

我可以sbt run運行正常我的代碼,我可以打包並運行在它的ProGuard(我不感興趣的混淆 - 該項目將是開放的無論如何源),我只是用它來生產一個獨立的JAR)。因此,我最終得到了一個在target/scala_2.8.0/

中構建的.min.jar文件。這是它變得複雜的地方。如果我運行這個JAR,我得到:線程「main」 java.lang.SecurityException異常

異常:無效的簽名文件的摘要清單主要屬性

好了,我還沒有簽署。

於是,我產生自己簽名密鑰如下:

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

然後,Java文檔下面,我嘗試登錄該JAR:

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

它提示我:

Enter Passphrase for keystore: 

Warning: 
The signer certificate will expire within six months. 

好的,沒關係。現在,它肯定會運行!

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

我不知道從哪裏開始。我對Java平臺比較陌生。

回答

1

我不認爲你需要ProGuard和簽署生產一個獨立的jar。您可以將所需的所有類和META-INF目錄打包到適當的類路徑和主類中,並將其重命名爲jar,然後運行。見this tutorial

對不起,我沒有回答你的問題,我只是不明白你爲什麼要簽署你的jar。

+0

我認爲這個問題是,罐子通常不能包含罐子,如果我沒有記錯的話,ProGuard會創建罐子。 – pr1001 2010-07-20 19:06:17

+0

我明白了,所以他只需要將scala-library.jar解壓到他的jar中? – 2010-07-21 04:26:49

1

我遇到了同樣的問題,看來問題在於META-INF目錄中的proguard添加了sun的jar簽名。我只是將它們添加到過濾的文件中:

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

它現在完美工作。