如何签署我的ProGuard'ed Scala独立JAR?

时间:2010-07-20 18:02:57

标签: java scala jar proguard sbt

我在Scala中构建了一个(命令行)应用程序,我希望将其作为独立的JAR进行分发。我用sbt构建它:

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:Manifest主要属性的签名文件摘要无效

好的,我还没有签名。

所以,我自己生成一个签名密钥如下:

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平台比较陌生。

2 个答案:

答案 0 :(得分:1)

我认为您不需要ProGuard并签署生产独立的jar。您可以打包所需的所有类和一个META-INF目录,并在zip文件中设置适当的类路径和主类,将其重命名为jar,它应该运行。请参阅this tutorial

抱歉,我没有回答你的问题,我只是不明白你为什么要签你的罐子。

答案 1 :(得分:1)

我遇到了同样的问题,看来问题是sun的jar签名是由META-INF目录中的proguard添加的。我刚将它们添加到过滤后的文件中:

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

现在它完美无缺。