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

Tom*_*ris 6 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"
  )
}
Run Code Online (Sandbox Code Playgroud)

我可以sbt run很好地运行我的代码,我可以将它打包并运行ProGuard(我对混淆不感兴趣 - 项目无论如何都是开源的),我只是用它来生成一个独立的JAR) .所以,我最终得到一个内置于target/scala_2.8.0 /的.min.jar文件

这是它变得复杂的地方.如果我运行这个JAR,我得到:

线程"main"中的异常java.lang.SecurityException:Manifest主要属性的签名文件摘要无效

好的,我没有签名.

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

keytool -keystore ~/.keystore -genkey -alias tom
Run Code Online (Sandbox Code Playgroud)

然后,按照Java文档,我尝试签署JAR:

jarsigner -signedjar [whatever].jar -keystore ~/.keystore target/scala_2.8.0/[whatever]-1.0.min.jar tom
Run Code Online (Sandbox Code Playgroud)

它提示我:

Enter Passphrase for keystore: 

Warning: 
The signer certificate will expire within six months.
Run Code Online (Sandbox Code Playgroud)

好的,没关系.现在,当然,它会运行!

$ java -jar [whatever].jar
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
Run Code Online (Sandbox Code Playgroud)

我不知道从哪里开始.我是Java平台的新手.

Den*_*kiy 1

我认为您不需要 ProGuard 和签名来生成独立的 jar。您只需将所需的所有类和 META-INF 目录以及正确的类路径和主类集打包在 zip 文件中,将其重命名为 jar 即可运行。请参阅本教程

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