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

Posted

技术标签:

【中文标题】如何签署我的 ProGuard 的 Scala 独立 JAR?【英文标题】:How do I sign my ProGuard'ed Scala stand-alone JARs? 【发布时间】:2011-03-18 14:23:38 【问题描述】:

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

【问题讨论】:

【参考方案1】:

我认为您不需要 ProGuard 和签名来生成独立的 jar。您可以将所有需要的类和一个 META-INF 目录与正确的类路径和主类设置在一个 zip 文件中,将其重命名为 jar 并且它应该运行。见this tutorial。

对不起,我没有回答你的问题,我只是不明白你为什么要在你的 jar 上签名。

【讨论】:

我认为问题是罐子通常不能包含罐子,如果我没记错的话,而 ProGuard 创建的罐子可以。 我明白了,所以他只需要将 scala-library.jar 解压到他的 jar 中?【参考方案2】:

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

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

现在可以完美运行了。

【讨论】:

以上是关于如何签署我的 ProGuard 的 Scala 独立 JAR?的主要内容,如果未能解决你的问题,请参考以下文章

签署 Android 应用程序时出现错误 Proguard

使用 Scala 编写的库在 Android 应用上运行 Proguard

将scala代码打包到一个jar文件中,proguard不起作用

Proguard 不会删除某些类

Android、Scala 和 Proguard

使用 scala 和 android-plugin 的 Proguard:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:160