M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

ProGuardマニュアル(9) クラスパス

原文は、ProGuard Manual”(Eric Lafortune)です(2011年3月29日取得)。

イントロダクションと索引はこちら

******************************

クラスパス

ProGuardは入力ファイルと出力ファイルの指定に、クラスパスの一般化を許しています。このクラスパスは、伝統的なパス区切り文字(例えばUnixであれば“:”であり、Windowsであれば“;”です)により区切られた項目からなります。複数指定されている場合の項目の並び順は、それらの優先順位を決定します。

各入力項目としては次のものがあり得ます:

  • クラスファイルもしくはリソースファイル、
  • 上記ファイルを内容とするjarファイル、
  • 上記ファイルを内容とするwarファイル、
  • 上記ファイルを内容とするearファイル、
  • 上記ファイルを内容とするzipファイル、
  • 上記ファイルを内容とするディレクトリ(とディレクトリ構造)。

クラスもしくはリソースファイルを直に指し示すパス記述は無視されます。クラスファイルは一般に、それを格納するjarファイル、warファイル、earファイルもしくはディレクトリのパス記述により指定されなくてはなりません。加えて、このクラスファイルのパスには、当該のアーカイブやディレクトリの内側の、クラスの位置を示すための追加のディレクトリ・プレフィクスを含めることもできません。

各出力項目としては次のものがあり得ます:

  • すべての処理済みクラスファイルとリソースファイルがまとめられたjarファイル。
  • 一部もしくは全部の上記ファイルがまとめられたwarファイル、
  • 一部もしくは全部の上記ファイルがまとめられたearファイル、
  • 一部もしくは全部の上記ファイルがまとめられたzipファイル、
  • 一部もしくは全部の上記ファイルがまとめられたディレクトリ。

出力項目を書き出しているとき、ProGuardは一般に結果物を賢明な方法でパッケージングします。入力項目の構造は必要に応じて再現されます。出力ディレクトリへのすべての成果物の書き出しは、とても単純な選択肢です: 出力ディレクトリには入力項目の完全な構造が再現されます。とはいえ、パッケージングの構造はほとんど任意に指定することができます: あなたはドキュメントといっしょにzip形式にパッケージングされたアプリケーションを、同じzipファイルとして書き出すことができます。Examplesの節では、出力アーカイブファイルを再構成する方法について若干の方法が紹介されています。

file_namesの節で後述されているように、ファイルやディレクトリを指定することもできます。
加えて、ProGuardは、クラスパス項目とその内容物を、もっぱらそれらのファイル名との関連性のもとにフィルタリングする機能を提供しています。最大で5種類のファイルフィルタ──クラスパス項目に後続する()の中に記述され、セミコロンで区切られたもの──をクラスパスに付与することができます:

  • クラスパス内に発見されたすべてのzipファイルに適用されるフィルタ、
  • 同じく発見されたすべてのearファイルに適用されるフィルタ、
  • 同じく発見されたすべてのwarファイルに適用されるフィルタ、
  • 同じく発見されたすべてのjarファイルに適用されるフィルタ、
  • 同じく発見されたすべてのクラスファイル名とリソースファイル名に適用されるフィルタ。

指定されたフィルターが5つ未満の場合、それらはより後方に指定するフィルターとして解釈されます。空のフィルターは無視されます。より形式的に示すと、任意のフィルター付きクラスパス項目(a filtered class path entry)は、次のようになります:

classpathentry([[[[zipfilter;]earfilter;]warfilter;]jarfilter;]filefilter)

矩形括弧“[ ]”は、それが囲う内容がオプションであることを示しています(訳者:括弧の付き方に注意してください。前述されているとおり、フィルターの数が5つ未満のとき、それらはより右側にあるものから順に、filefilter→jarfilter→・・・というふうに解釈されていきます)。

例えば、“rt.jar(java/**.class,javax/**.class)”というフィルターは、rt.jarの中のjavaディレクトリとjavaxディレクトリ直下のすべてのクラスファイルにマッチします。

あるいはまた、“input.jar(!**.gif,images/**)”というフィルターは、input.jarファイルの中のimagesディレクトリ直下の、gifファイルを除くすべてのファイルにマッチします。

(訳者:jarfilterやfilefilterなど)それぞれのフィルタは、対応するすべてのファイルに対して、それらの入れ子レベルにかかわらず適用されることに注意してください。それらのフィルターは直交的な関係にあります(訳者:ここではようするにAND条件である、ということです)。

例えば、“input.war(lib/**.jar,support/**.jar;**.class,**.gif)”というフィルター記述は、input.warファイルのなかの、libおよびsupportというディレクトリに格納されたjarファイル以外の、他のいかなるjarファイルも捉えません。このフィルターはすべてのクラスファイルとgifファイルにマッチします。

フィルターにより、ほとんど無限数のパッケージの補足と再構築が可能です。Examples の節では、入力と出力のフィルタリングについて、より多くの例を見ることができます。

******************************

ProGuardマニュアル(10)につづく。