home(h) links(l) memo translation(t) profile(r)
memo(m) Java

Java関係

index

JREのインストール

コマンド類

Java Archiveの管理(jar)

Java Archiveへの署名(jarsigner)

[12]

鍵、証明書の管理(keytool)

Java Archive(jar)ファイルの操作

jarコマンドの概要

jarコマンドでjarファイルの作成、内容閲覧、内容取り出しなどを行うことができる。概要は以下の通り[19]

【jarファイルの作成】
jar cv0Mmfe マニフェストファイル jarファイル エントリーポイント -C ディレクトリ 入力ファイル -JJavaオプション
【jarファイルの更新】
jar uv0Mmfe マニフェストファイル jarファイル エントリーポイント -C ディレクトリ 入力ファイル -JJavaオプション
【jarファイルからのファイル抽出】
jar xvf jarファイル 入力ファイル -JJavaオプション
【jarファイルの内容一覧出力】
jar tvf jarファイル 入力ファイル -JJavaオプション
【jarファイルにインデックスを付加】
jar i jarファイル -JJavaオプション
-f jarファイル
作成(c)、更新(u)、抽出(x)、内容一覧作成(t)の対象となるjarファイルを指定する。この指定を行う場合 -f オプションも合わせて指定する必要がある。どちらも指定しなかった場合、作成(c)と更新(u)のモードでは標準入力から、抽出(x)と内容一覧作成(t)のモードでは標準出力にjarファイルが出力される。
入力ファイル
作成モード(c)または更新モード(u)の場合、jarファイルに含める対象となるファイルまたはディレクトリを、抽出モード(x)または内容一覧作成モード(t)の場合、抽出・表示対象となる内容ファイルまたはディレクトリを指定する。全てのディレクトリはサブディレクトリも対象に含めて処理されます。0 オプションも合わせて指定するとファイルは圧縮されません。
-m マニフェストファイル
jarファイル内のMANIFEST.MFに書き加える、名前:の情報を記した既存のマニフェストファイルを指定する。マニフェストファイルの最終行の末尾に改行を入れるのを忘れないようにすること。さもないと最終行が処理されません。この指定を行う場合は -m オプションも合わせて指定する。m、f、e の各オプションの記述順序と、マニフェストファイルjarファイルエントリーポイントの引数記述順序は一致させておく必要がある。
-e エントリーポイント
実行可能なjarファイルに同梱されるスタンドアロンアプリケーションのエントリーポイントとして設定するクラスの名称。この指定を行う場合、-e オプションも合わせて指定する必要がある。m、f、e の各オプションの記述順序と、マニフェストファイルjarファイルエントリーポイントの引数記述順序は一致させておく必要がある。
-C ディレクトリ
後に続く入力ファイルを処理する間、カレントディレクトリを指定したディレクトリへと一時的に変更する。カレントディレクトリから相対パスとは異なる配置でjar内に格納する場合に指定が必要。複数の「-C ディレクトリ 入力ファイル」の引数セットを指定することができる。
-JJavaオプション
Javaランタイム環境に渡すオプションを指定する。-J とJavaオプションとの間にスペースは空けないこと。

jarファイルの作成・更新

jarファイルを作成する方法。c を u に替えれば既存jarファイルへの追記になる。

【書式1】指定したjarファイルに出力
jar cv0Mf jarファイル -C ディレクトリ 入力ファイル -Jオプション
【書式2】標準出力に出力
jar cv0M jarファイル -C ディレクトリ 入力ファイル -Jオプション
【書式3】指定したjarファイルに出力+指定したマニフェスト情報ファイルの内容を含める
jar cv0Mmf マニフェストファイル jarファイル -C ディレクトリ 入力ファイル -Jオプション
【書式4】標準出力に出力+指定したマニフェスト情報ファイルの内容を含める
jar cv0Mm マニフェストファイル jarファイル -C ディレクトリ 入力ファイル -Jオプション
0
jarファイルをZIP圧縮しない。
c
jarファイルを作成
f jarファイル名
出力先を標準出力ではなく、jarファイル名に指定したファイルに出力する。慣例としてjarファイル名で指定するファイル名は.jarの拡張子を指定する。
v
jarファイル作成中の情報をより詳細に表示する。jarに追加された各ファイル名が表示される。
M
オプションcまたはuが指定されている場合、マニフェストファイルを作らない。オプションuが指定されている場合、マニフェストファイルが存在すれば削除する。
m マニフェストファイル
指定したマニフェストファイルの内容を含める。マニフェストファイルには「キー値: 値」の組みで情報を記しておく。この内容は jar ファイル内の META-INF/MANIFEST.MF に含められる。同じキー値が存在した場合、後から登場した組みの値で更新される。

jar内の一部ファイルを削除するには、一旦展開し削除したいファイルを対象から外して再度梱包する。

[user@mypc ~]$ mkdir temp
[user@mypc ~]$ cd temp
[user@mypc temp]$ jar xvf ../hoge.jar
[user@mypc temp]$ rm removetarget
[user@mypc temp]$ jar cvf ../hoge.jar

jarファイルの内容閲覧

jarファイル内のファイル一覧を参照する方法。

【書式1】指定したjarファイルに出力
jar tvf jarファイル 入力ファイル -Jオプション
【書式2】標準出力に出力
jar tv jarファイル 入力ファイル -Jオプション

jarファイルの内容取り出し

jarファイルを展開して内包されたファイルを取り出す。

【書式1】指定したjarファイルを展開
jar xvf jarファイル 入力ファイル -Jオプション
【書式2】標準入力の内容を展開
jar xv jarファイル 入力ファイル -Jオプション

jarファイルへの署名

Java Appletにおいて、ファイル保存などウェブクライアントのローカルマシンにアクセスする動作を許可する場合、使用するjarファイルには署名しておく必要がある。jnlpファイルを使って呼び出すコードを使う場合、jnlpファイルに以下の記述も合わせて必要。

<security>
  <all-permissions/>
</security>

jarファイルへ署名する方法として、 パブリック認証局から取得した証明書(通常有償)を使う方法と、ローカルで構築したプライベート認証局で証明書を作成しそれで署名する方法とがある[15]

前者は有料だが、ウェブクライアントでサーバ証明書を信頼済みサイトに追加してもらう必要はない(デフォルトでブラウザが持っている、信頼済み証明書に含まれている)。手順の概要は以下の通り。(2)CSRを作成して認証局に申請、(3a)発行審査、(4)証明書の入手・インストール、(5)jarファイルに署名

後者は料金は要らないが、前者と同様の手順に加え(1)認証局(CA)の構築が必要。また(3b)サーバ証明書にCAで署名し、(6)CAの証明書をウェブクライアントで信頼済みサイトに追加してもらう、必要があると思われる。

1. CA(認証局)を作る(自己署名時のみ)
2. 鍵ペア、CSR(証明書要求)を作る
keytoolコマンドを用いる。このコマンドはキーストア(鍵ペアの貯蔵庫)への鍵ペア追加、鍵情報表示、鍵のインポート・エクスポート、パスワードの管理などを行うことができる。コマンドの書式は以下の通り[3][4]
【書式】キーストアの新規作成、鍵情報の追加
keytool -genkeypair オプション
-dname 鍵作成者(署名者)の情報
鍵ペアを作成した人(署名した人)の情報(X.500 識別名)を記します。指定可能な項目は以下の通り。「キー=」の形で記述し、各キー・値ペアはコンマ区切りでつなぐ。コンマを値に含む場合はバックスラッシュ(円マーク)を直前に記してエスケープ処理を行う必要あり。
キー 内容
CN Common Name、人の通称。 Taro Hoge
OU Organization Unit、小さな組織の名称(部署名など)。 Public Relations
O Organization name、大きな組織の名称(会社名など)。 Foo Inc
L Locality name、地域 (都市) 名。 Dotonbori
S State name、州名または地方名。 Osaka
C Country、2文字の国番号。 JP
-validity 日数
署名の有効日数を自然数で指定する。指定がない場合の既定値は90(日)。
【例】上記署名者情報、有効日数1000日で署名作成
$ which keytool
/usr/bin/keytool
$ keytool -genkeypair -dname "CN=Taro Hoge,O=Foo Inc,OU=Public Relations,L=Dotonbori,S=Osaka,C=JP" -validity 1000
キーストアのパスワードを入力してください: 
新規パスワードを再入力してください: 
<mykey> の鍵パスワードを入力してください。
	(キーストアのパスワードと同じ場合は RETURN を押してください): 
$ ls -l ~/.keystore
-rw-rw-r-- 1 user user 1330  6月 22 15:16 /home/user/.keystore
署名の確認方法は以下の通り。
【書式】通常
keytool -list -file キーストアファイル名
【書式】詳細
keytool -list -file キーストアファイル名 -v
【書式】rcf形式
keytool -list -file キーストアファイル名 -rcf
【例】
$ keytool -list -file /home/user/.keystore
キーストアのパスワードを入力してください: 


キーストアのタイプ: JKS
キーストアのプロバイダ: SUN

キーストアには 1 エントリが含まれます。

mykey, 2012/06/22, PrivateKeyEntry, 
証明書のフィンガープリント (MD5): DC:F9:53:40:D6:90:50:9F:94:E9:BB:BA:02:63:9B:6A
$ keytool -list -file /home/user/.keystore -v
キーストアのパスワードを入力してください: 

キーストアのタイプ: JKS
キーストアのプロバイダ: SUN

キーストアには 1 エントリが含まれます。

別名: mykey
作成日: 2012/06/22
エントリタイプ: PrivateKeyEntry
証明連鎖の長さ: 1
証明書[1]:
所有者: CN=Taro Hoge,O=Foo Inc,OU=Public Relations,L=Dotonbori,S=Osaka,C=JP
発行者: CN=Taro Hoge,O=Foo Inc,OU=Public Relations,L=Dotonbori,S=Osaka,C=JP
シリアル番号: 123abc45
有効期間の開始日: Fri Jun 22 15:16:12 JST 2012 終了日: Thu Mar 19 15:16:12 JST 2015
証明書のフィンガープリント:
	 MD5:  DC:F9:53:40:D6:90:50:9F:94:E9:BB:BA:02:63:9B:6A
	 SHA1: 2C:39:09:24:2D:74:3A:FE:AA:48:BC:0B:B5:6A:D8:32:96:B3:08:26
	 署名アルゴリズム名: SHA1withDSA
	 バージョン: 3


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

$ keytool -list -file /home/user/.keystore -rcf
キーストアのパスワードを入力してください: 


キーストアのタイプ: JKS
キーストアのプロバイダ: SUN

キーストアには 1 エントリが含まれます。

別名: mykey
作成日: 2012/06/22
エントリタイプ: PrivateKeyEntry
証明連鎖の長さ: 1
証明書[1]:
-----BEGIN CERTIFICATE-----
MIIDWTCCAxegAwIBAgIET+QNrDALBgcqhkjOOAQDBQAwgY8xCzAJBgNVBAYTAkpQMQ4wDAYDVQQI
(中略)
-----END CERTIFICATE-----


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


$ keytool -certreq -v -alias mycert -file mycert.pem -keystore ~/.keystore
キーストアのパスワードを入力してください: 
<mycert> の鍵パスワードを入力してください: 
証明書要求がファイル <mycert.pem> に保存されました。
これを CA に提出してください。

鍵ペアを作成する際、別名として既に存在するものを指定するとエラーになる。

$ keytool -genkey -alias mycert -keyalg RSA -keysize 2048 -dname "CN=MyCompany,O=MyCompany,L=Suita,S=Osaka,C=JP" -validity 365
キーストアのパスワードを入力してください: 
keytool エラー: java.lang.Exception: 鍵ペアは生成されませんでした。別名 <mycert> はすでに存在します

$ keytool -list -keystore ~/.keystore -alias mycert
キーストアのパスワードを入力してください: 
mycert, 2013/12/20, PrivateKeyEntry, 
証明書のフィンガープリント (MD5): 33:7D:68:A1:E6:51:74:EC:2E:5D:99:2D:B0:34:04:08

既存の鍵ペアを削除する方法は以下の通り。

$ keytool -delete -keystore ~/.keystore -alias mycert
キーストアのパスワードを入力してください: 
3b. CAでCSRに署名(自己署名時のみ)
5. jarファイルに署名
jarsignerコマンドを用いる。
【書式】署名
jarsigner 署名するjarファイル 別名
【書式】署名検証
jarsigner -verify 署名するjarファイル
【例】
$ which jarsigner
/usr/bin/jarsigner
$ jarsigner hoge_signed.jar mykey
キーストアのパスワードを入力してください: 
$ jarsigner -verify hoge_signed.jar
jar が検証されました。
$ jarsigner -verify hoge_unsigned.jar
jar は署名されていません。(署名が見つからないか、構文解析できません)
6. ウェブクライアントにてCAの証明書を信頼済みサイトに追加(自己署名時のみ)

日本語が□になる

JavaアプリやJava Appletのダイアログなどで日本語の一部が□になってしまうのを解消する方法[1]

/usr/lib/jvm/jre1.6.0_27 にJavaがインストールされている場合
$ sudo mkdir /usr/lib/jvm/jre1.6.0_27/lib/fonts/fallback
$ ls -l /usr/share/fonts/truetype/ttf-japanese*
lrwxrwxrwx 1 root root 41 2011-08-25 09:55 /usr/share/fonts/truetype/ttf-japanese-gothic.ttf -> /etc/alternatives/ttf-japanese-gothic.ttf
lrwxrwxrwx 1 root root 41 2011-08-25 10:02 /usr/share/fonts/truetype/ttf-japanese-mincho.otf -> /etc/alternatives/ttf-japanese-mincho.ttf
$ sudo ln -s /usr/share/fonts/truetype/ttf-japanese* /usr/lib/jvm/jre1.6.0_27

確認した環境はUbuntu 10.04 LTS 64bit版。

Mac 10.7以降でコマンドラインから得られるバージョン情報が更新されない

Mac 10.7以降、JavaはApple社から提供されなくなり、各自でOracleサイトからダウンロード・インストールようになっているが、インストールしてもコマンドラインで得られる情報が更新されない場合がある。これはjavaコマンドが参照しているものと、インストールしてブラウザが参照しているjavaとが異なるため。

$ java -version
java version "1.7.0_17"
Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)
$ which java
/usr/bin/java
$ ls -l /usr/bin/java
lrwxr-xr-x  1 root  wheel  74 10 25 11:05 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
$ ls -l /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
-rwxr-xr-x  1 root  wheel  50432 10 25 11:05 /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
$ /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java -version
java version "1.7.0_17"
Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)

ブラウザが参照するjavaは別の場所にある
$ ls -l /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java
-rwxr-xr-x  1 root  wheel  99216 10  8 22:32 /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java
$ /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

既定のjavaのリンク先を変更すればOK
$ sudo ln -sf /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java /usr/bin/java
Password: 
$ ls -l /usr/bin/java
lnwxr-xr-x  1 root  wheel  73 12 12 16:09 /usr/bin/java -> /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java
$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

Mac 10.10 (El Capitan)で上記操作を行うと「Permission denied」エラー
以下の操作によりウェブブラウザも参照している新しい方のJREにアクセスできた
$ which java
/usr/bin/java
$ ls -l /usr/bin/java
lrwxr-xr-x  1 root  wheel  74 10 23  2015 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
$ java -version
java version "1.7.0_17"
Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)
$ cat - >>~/.bash_profile
alias java="/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java"
(Ctrl + D)
一旦ログアウトして再ログイン
$ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

manifestのPermissions、Codebase

JDK 7u25より、jarファイルを作成する際、jarファイルの中に生成されるマニフェスト情報に「Permissions」「Codebase」という属性が新たに追加された。これらをマニフェストに含めておかないとJava applet実行時、Java Consoleに「Missing Permissions/Codebase manifest attribute ...」という警告が出る(出るだけで実行できない訳ではない)[6]

【書式】
# cat マニフェスト追加項目を記したテキストファイル
Permissions: xxxxx
Codebase: xxxx xxxx ...
# jar cfm 作成するjarファイル マニフェスト追加項目を記したテキストファイル 入力ファイル群 
【例】
# cat add.txt
Permissions: xxxxx
Codebase: xxxx xxxx ...
# jar cfm my.jar add.txt my.class another.class image 

Javaコントロールパネルの表示方法

Windowsではシステムの「コントロールパネル」、Macでは「システム環境設定」にそれぞれ「Java」というアイテムがある。これをダブルクリックして起動する。Macの場合はJavaコントロールパネルのランチャーになっている(別窓でJavaコントロールパネルが開く)。

Ubuntu 12.04 LTS 32bit Desktop + Java 1.7.0_45(/usr/lib/jvm/jre1.7.0_45にインストール)の場合、Terminalで以下のコマンドを実行すればJavaコントロールパネルを表示できる[20]

user@my-ubuntu:~$ /usr/lib/jvm/jre1.7.0_45/bin/ControlPanel

LinuxでのJavaインストール

LinuxでのJavaインストール・アップグレードの方法を以下に記す。

1. ダウンロード
Linux用Javaダウンロードサイトから32bit版または64bit版、どちらかシステムに合ったものをダウンロードする。
[user@mypc ~]$ cd downloads
[user@mypc downloads]$ ls -l
-rw-r--r-- 1 user user 46933036  5月  8 05:40 jre-7u55-linux-x64.tar.gz
2. 解凍・展開
ダウンロードしたtarballをインストール先に解凍・展開する。
以下 /usr/lib/jvm 配下に置く場合
[user@mypc downloads]$ cd /usr/lib/jvm
[user@mypc jvm]$ which java
/usr/bin/java
[user@mypc jvm]$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 33  2月  5 01:04 /usr/bin/java -> /usr/lib/jvm/jre1.7.0_51/bin/java
[user@mypc jvm]$ sudo tar -zxvf ~/downloads/jre-7u55-linux-x64.tar.gz
3. リンクの張り替え
[user@mypc jvm]$ java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
[user@mypc jvm]$ sudo unlink /usr/bin/java
[user@mypc jvm]$ sudo ln -s /usr/lib/jvm/jre1.7.0_55/bin/java /usr/bin/java
[user@mypc jvm]$ java -version
java version "1.7.0_55"
Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)

jnlp

Java AppletでJava拡張機能を実行する方法の一つにJavaネットワーク起動プロトコル(Java Network Launch Protocol、JNLP)がある[21]

jnlpファイルを実行するアプリケーションが関連づけられていない環境では、javawsコマンドを使って起動すればよい。

$ javaws hoge.jnlp

# javawsコマンドが見つからないと言われたら、パスを通すなどの措置が必要
【例】
$ which javaws
$  
$ sudo ln -s /usr/lib/jvm/jre1.8.0_45/bin/javaws /usr/bin/javaws
$ which javaws
$ /usr/bin/javaws

jnlpファイルの書き方についてはこちら

トラブルシューティング

Mac 10.6で最近のJmolが起動しない

Mac OS 10.6 + Java 1.6.0_65環境にて、Jmolスタンドアロンを起動しようとしたが、あるバージョンからは起動しなくなっていた。原因はJava 1.6より後のJavaにてコンパイルされていて、互換性がないことが原因のよう[22]

$ ls
jmol-14.2.2_2014.06.29
jmol-14.2.4_2014.08.03
jmol-14.2.9_2014.11.23
$ ./jmol-14.2.2_2014.06.29/jmol.sh
→問題なくJmolが起動
$ ./jmol-14.2.4_2014.08.03/jmol.sh
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/jmol/translation/Jmol/ja/Messages_ja : Unsupported major.minor version 51.0
$ ./jmol-14.2.9_2014.11.23/jmol.sh

ログの場所

JavaコントロールパネルでJavaコンソールを表示してデバッグ情報を参照しようとしても、Javaが異常終了してしまうとその内容を見ることができない。どっかに残ってないのか調べてみたら、ローカルファイルに保存されていることが分かった[24]。具体的場所は、以下の通り。