我在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平臺比較陌生。
我認爲這個問題是,罐子通常不能包含罐子,如果我沒有記錯的話,ProGuard會創建罐子。 – pr1001 2010-07-20 19:06:17
我明白了,所以他只需要將scala-library.jar解壓到他的jar中? – 2010-07-21 04:26:49