sbtのproguardプラグインを使う

**注意**

この記事は既に情報が古くなっていますので参考にするべきじゃないです。
未だに0.10以前のsbtを使っているなんて人ははやいとこ最新版に変えた方が幸せになれます。

sbt0.11以降対応のproguardプラグインはこちら

GitHub - aolshevskiy/xsbt-proguard-plugin: A plugin for XSBT to facilitate the use of ProGuard to create single jars for XSBT-managed projects

                                                                                  • -

githubのサイトはこちら。
GitHub - nuttycom/sbt-proguard-plugin: A plugin for SBT to facilitate the use of ProGuard to create single jars for SBT-managed projects.


sbtからコマンドひとつでproguardが実行できるようになります。
simple-build-tool-0.7.3で動いてます。たぶん0.7.4でも動きます。


まずはproject/plugins/Plugins.scalaを以下の内容で作ります。

import sbt._

class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
  val proguard = "org.scala-tools.sbt" % "sbt-proguard-plugin" % "0.0.2"
}

保存したらreloadを忘れずに。


お次はproject/build/Project.scalaを以下の内容で作ります。

import sbt._

class Project(info: ProjectInfo) extends ProguardProject(info) {
  def keepMainClass = """
-keepclasseswithmembers public class * {
    public static void main(java.lang.String[]);
}
"""
  override def proguardDefaultArgs =
    "-dontwarn" :: "-dontoptimize" :: "-dontobfuscate" :: keepMainClass  ::  proguardOptions
}

メインメソッドがあるクラスを-keepするように設定を追加しています。
ProjectがextendsしているProguardProjectは
project/plugins/src_managed/sbt-proguard-plugin-0.0.2にソースが置いてあります。
githubのサイトからも読めます。


reloadしたら
proguard
で実行。
警告がどばっと出てきますが無視。
何も問題がなければ、targetフォルダ内に最適化されたjarファイルが出来上がってます。


出来上がるjarにscala-library.jarを含めたいなら、scala-library.jarをlibフォルダにぶち込んどけばおkです。

  • 追記

windowsXPでやってみたところ、JAVA_HOMEのパスに空白が含まれているとダメなようです。
(空白があると、実行時にparseに失敗したぞコラァ!とproguardのConfigurationParserが怒り出す)


この場合は、
%JAVA_HOME%/lib/rt.jarを適当な場所(もちろんパスに空白が含まれていないこと)にコピーして、
project/build/Project.scala

override def rtJarPath = Path.fromFile("c:/home/tmp/rt.jar")  //←rt.jarの絶対パス

を追加してあげれば動くようになります。