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