読者です 読者をやめる 読者になる 読者になる

tomoima525's blog

Androidとか技術とかその他気になったことを書いているブログ。世界の秘密はカレーの中にある!サンフランシスコから発信中。

マニフェストMANIFEST.MFを利用したjarの圧縮方法

java 開発

apacheなどで作成されたjarファイルの中身を修正したい場合、jarファイルを一端解凍し、編集後再度jarコマンドでかためます。
その場合、jar cvfで実行するとjar内のパスがローカルディレクトリの設定になってしまう。
例えばこんな感じ。

$jar tvf lucene-analyzers-kuromoji-4.6.0.jar
     0 Tue Dec 31 00:55:20 JST 2013 META-INF/
    68 Tue Dec 31 00:55:20 JST 2013 META-INF/MANIFEST.MF
     0 Tue Dec 31 00:55:20 JST 2013 home/tomoaki/workspace/jarfiles/
     0 Tue Nov 19 11:06:04 JST 2013 home/tomoaki/workspace/jarfiles/org/
     0 Tue Nov 19 11:06:04 JST 2013 home/tomoaki/workspace/jarfiles/org/apache/
     0 Tue Nov 19 11:06:04 JST 2013 home/tomoaki/workspace/jarfiles/org/apache/lucene/
     0 Tue Nov 19 11:06:04 JST 2013 home/tomoaki/workspace/jarfiles/org/apache/lucene/analysis/
     0 Tue Dec 31 00:53:46 JST 2013 home/tomoaki/workspace/jarfiles/org/apache/lucene/analysis/ja/
(以下略)

これだとjarのパスが eclipse (というかアプリ)上で正しく通らず、使えなくなってしまう。
自分はここで少しつまずいたので、メモ。

解決策

この場合、マニフェストを利用してjarをかためればよいです。

マニフェストファイルは、何をどのように圧縮するか記載されているファイルです。

中身↓

$cat MANIFEST.MF
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_30-b12 (Sun Microsystems Inc.)
Extension-Name: org.apache.lucene
Specification-Title: Lucene Search Engine: analyzers-kuromoji
Specification-Version: 4.6.0
Specification-Vendor: The Apache Software Foundation
Implementation-Title: org.apache.lucene
Implementation-Version: 4.6.0 1543363 - simon - 2013-11-19 11:06:25
Implementation-Vendor: The Apache Software Foundation
X-Compile-Source-JDK: 1.6
X-Compile-Target-JDK: 1.6

具体的にはjarを解凍したディレクトリ(apacheの場合orgやMETA-INFがあるディレクトリ)で以下コマンド実行します。
※例 /org/apache/...のようなパスに設定したい場合
jar cvfm  lucene-analyzers-kuromoji-4.6.0.jar ./META-INF/MANIFEST.MF ./

オプションは
c jarファイルの作成(jar cf hoge.jar ./ でカレントディレクトリ以下をhoge.jarというjarファイルにする)
v 詳細な出力を標準出力に生成
f ファイル名の指定(つけなければ標準出力に出力される)
m META-INF/MANIFEST.MFのファイルで指定したマニフェスト・ファイルを読み込む

 

実行結果


$jar cvfm  lucene-analyzers-kuromoji-4.6.0.jar ./META-INF/MANIFEST.MF ./
マニフェストが追加されました
エントリMETA-INF/を無視します
エントリMETA-INF/MANIFEST.MFを無視します
META-INF/LICENSE.txtを追加中です(入=24577)(出=7110)(71%収縮されました)
META-INF/NOTICE.txtを追加中です(入=9488)(出=3435)(63%収縮されました)
META-INF/services/を追加中です(入=0)(出=0)(0%格納されました)
META-INF/services/org.apache.lucene.analysis.util.TokenFilterFactoryを追加中です(入=1050)(出=528)(49%収縮されました)

(以下略)

 

以上です。