スタンドアロン JAR として配布したい (コマンドライン) アプリケーションを Scala で作成しました。私は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 を実行すると、次のようになります。
スレッド「メイン」の例外 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プラットフォームに比較的慣れていません。