[12]
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オプション
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
c
f jarファイル名
.jar
の拡張子を指定する。
v
M
m マニフェストファイル
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ファイル内のファイル一覧を参照する方法。
【書式1】指定したjarファイルに出力 jar tvf jarファイル 入力ファイル -Jオプション 【書式2】標準出力に出力 jar tv jarファイル 入力ファイル -Jオプション
jarファイルを展開して内包されたファイルを取り出す。
【書式1】指定したjarファイルを展開 jar xvf jarファイル 入力ファイル -Jオプション 【書式2】標準入力の内容を展開 jar xv jarファイル 入力ファイル -Jオプション
Java Appletにおいて、ファイル保存などウェブクライアントのローカルマシンにアクセスする動作を許可する場合、使用するjarファイルには署名しておく必要がある。jnlpファイルを使って呼び出すコードを使う場合、jnlpファイルに以下の記述も合わせて必要。
<security> <all-permissions/> </security>
jarファイルへ署名する方法として、 パブリック認証局から取得した証明書(通常有償)を使う方法と、ローカルで構築したプライベート認証局で証明書を作成しそれで署名する方法とがある[15]。
前者は有料だが、ウェブクライアントでサーバ証明書を信頼済みサイトに追加してもらう必要はない(デフォルトでブラウザが持っている、信頼済み証明書に含まれている)。手順の概要は以下の通り。(2)CSRを作成して認証局に申請、(3a)発行審査、(4)証明書の入手・インストール、(5)jarファイルに署名
後者は料金は要らないが、前者と同様の手順に加え(1)認証局(CA)の構築が必要。また(3b)サーバ証明書にCAで署名し、(6)CAの証明書をウェブクライアントで信頼済みサイトに追加してもらう、必要があると思われる。
keytool
コマンドを用いる。このコマンドはキーストア(鍵ペアの貯蔵庫)への鍵ペア追加、鍵情報表示、鍵のインポート・エクスポート、パスワードの管理などを行うことができる。コマンドの書式は以下の通り[3][4]。
【書式】キーストアの新規作成、鍵情報の追加
keytool -genkeypair オプション
-dname 鍵作成者(署名者)の情報
キー | 内容 | 例 |
---|---|---|
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 日数
【例】上記署名者情報、有効日数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 キーストアのパスワードを入力してください:
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 は署名されていません。(署名が見つからないか、構文解析できません)
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以降、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)
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
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インストール・アップグレードの方法を以下に記す。
[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
以下 /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
[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)
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 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]。具体的場所は、以下の通り。