JavaWebStart のバックアップ(No.17)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- JavaWebStart へ行く。
- 1 (2011-12-05 (月) 17:09:30)
- 2 (2011-12-06 (火) 09:10:19)
- 3 (2011-12-06 (火) 16:07:29)
- 4 (2011-12-06 (火) 17:38:52)
- 5 (2012-02-16 (木) 14:40:05)
- 6 (2012-03-01 (木) 16:37:48)
- 7 (2012-03-06 (火) 14:28:28)
- 8 (2012-03-09 (金) 14:23:11)
- 9 (2012-07-02 (月) 19:49:52)
- 10 (2012-07-08 (日) 20:32:25)
- 11 (2012-08-21 (火) 15:02:40)
- 12 (2012-11-23 (金) 04:36:33)
- 13 (2013-03-13 (水) 14:25:35)
- 14 (2013-07-25 (木) 16:33:58)
- 15 (2013-09-06 (金) 11:33:03)
- 16 (2013-09-18 (水) 21:01:12)
- 17 (2013-11-06 (水) 18:21:23)
- 18 (2014-09-04 (木) 05:29:16)
- 19 (2014-09-05 (金) 21:14:56)
- 20 (2014-09-06 (土) 02:08:04)
- 21 (2014-11-01 (土) 00:46:09)
- 22 (2014-11-08 (土) 01:41:12)
- 23 (2014-11-10 (月) 15:30:08)
- 24 (2014-11-25 (火) 03:03:31)
- 25 (2016-06-15 (水) 16:53:32)
- 26 (2017-04-04 (火) 14:17:08)
- 27 (2017-04-07 (金) 13:51:51)
- 28 (2017-10-27 (金) 16:26:13)
- 29 (2017-11-02 (木) 15:25:54)
- 30 (2017-11-02 (木) 15:34:40)
- 31 (2018-02-27 (火) 14:35:27)
- 32 (2022-08-20 (土) 22:15:25)
TITLE:Java Web Start
Java Web Start
Java Web Start とは
Java Web Start
(Java
アプリケーションの配備を簡素化するテクノロジ)を利用すると、Web
ブラウザで1
回クリックするだけでフル装備のアプリケーションを起動できます。複雑なインストール作業なしで、フル機能のスプレッドシートプログラムやインターネットチャットクライアントなどをダウンロードおよび起動できます。
security
デフォルトでは、Java Web Start
から起動されるクライアントJava
アプリケーションは、安全な限定的環境で実行されるようになっています。
その環境の中では、以下のような禁止事項があります。
- ローカル・ファイルへのアクセスは禁止
- 他のコンピューターへのネットワーク接続などが禁止
JNLP API
JNLP API
のFileOpenService
を使用すると、証明書などを用意しなくても、ユーザがFileChooser
で指定したローカルファイルだけを読み書きすることができます。
Java Tutorial
にある JWSFileChooserDemo などを実行してみてください。
ローカル・マシンに対する完全アクセス
ローカル・マシンに対する完全アクセスを得る場合は次の2
点が必要です。
- セキュリティ証明書ですべての
JAR
ファイルに署名する JNLP
ファイルにall-permissions
を指定する
以下では、自分で自分自身を証明しているテスト用の証明書(オレオレ証明書)を作って説明します。信頼できるセキュリティ証明書は、ちゃんとした証明書発行機関(認証局、CA
)から取得してください。
デジタル署名
JAR
ファイルの作成まず、
JAR
ファイルを作ります(Ant
を使用する場合は、Ant(Jarファイルの作成)など)。jar cf Test.jar Test.class
- キーストア(セキュリティ証明書)の作成
次に、キーストア(証明書を保持するデータベース)を作ります。
keytool -genkey -keystore myKeyStore -alias myAlias
以下のようなことを聞かれます。
C:\TEST\SECURITY>"%JAVA_HOME%\bin\keytool" -genkey -keystore myKeyStore -alias myAlias キーストアのパスワードを入力してください: ********** 姓名を入力してください。 [Unknown]: Terai Atsuhiro 組織単位名を入力してください。 [Unknown]: 組織名を入力してください。 [Unknown]: Hoge 都市名または地域名を入力してください。 [Unknown]: Meguro 州名または地方名を入力してください。 [Unknown]: Tokyo この単位に該当する 2 文字の国番号を入力してください。 [Unknown]: JP CN=Terai Atsuhiro, OU=Sample Team, O=Hoge, L=Meguro, ST=Tokyo, C=JP でよろしいですか? [no]: yes <myAlias> の鍵パスワードを入力してください。 (キーストアのパスワードと同じ場合は RETURN を押してください): C:\TEST\SECURITY>
- JARファイルに署名
最後に、
JAR
ファイルに署名します。以下はJAR
ファイルに署名するときの、Ant
ターゲットのサンプルです。パスワードを聞かれるので、入力してください。
<target name="sign" depends="init">
<input message="input pass" addproperty="store.pass" />
<signjar keystore="${signjar.keystore}" <!-- myKeyStore -->
alias="${signjar.alias}" <!-- myAlias -->
storepass="${store.pass}">
<fileset dir="${build.dir}" includes="**/*.jar"/>
</signjar>
</target>
${build.dir}
、${signjar.keystore}
などの各property
は、任意の値を設定しておいてください。
jnlp
ファイル
以下は、セキュリティテスト用のjnlp
サンプルです。
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://terai.xrea.jp/data/jws/" href="example.jnlp">
<information>
<title>JWS all-permissions</title>
<vendor>Java Swing Tips - at.terai@gmail.com</vendor>
<homepage href="http://terai.xrea.jp/JavaWebStart.html" />
<description>Swing Example</description>
<description kind="short">example</description>
<offline-allowed />
</information>
<update check="timeout" policy="always" />
<security>
<all-permissions />
</security>
<resources>
<java version="1.6+" />
<jar href="example.jar" main="true" />
</resources>
<application-desc main-class="example.MainPanel" />
</jnlp>
もし<security><all-permissions/></security>
要素が無い場合、ローカルリソースにアクセスするようなアプリケーションは起動できません。jar
などに署名し、<security>
要素を指定すれば、起動はできるようになりますが、上記サンプルで作成したのが自己証明書なのでセキュリティ警告ダイアログが出ます。
サンプルアプリケーション
- サンプルを Web Start で起動
- example.jar
- src.zip (キーストア(この例では
myKeyStore
)は含まれていません)
上記のサンプルを起動すると、以下のようなセキュリティ警告パネルが表示されます。
証明書の詳細をクリックすると以下のような証明書情報が表示されます。
先に述べたように、自分で自分を証明しているだけなので、信頼できない団体から発行されていると警告されています(開始を押すとJFileChooser
などが使えるようになりますが、自己責任でお願いします)。上記のソースをダウンロードするなどして署名の実験をしてみてください。
証明書のインポート
作成したキーストアから証明書をファイルに書き出します。
C:\TEST>keytool -export -keystore myKeyStore -alias myAlias -file example.cer キーストアのパスワードを入力してください: ********** 証明書がファイル <example.cer> に保存されました。 C:\TEST\>
"%JAVA_HOME%\bin\javaws.exe"
を起動し、「編集→設定→セキュリティ→証明書」で、上記の証明書ファイルexample.cer
をインポートします。"alias"とパスワードを聞かれるので、これを入力し、最初から実行すれば、セキュリティ警告が以下のように変わっていることが確認できます。これで、先のサンプルのような署名をしたアプリケーションが確認なしで実行できるようになります。
http:// terai.xrea.jp/data/jws/security2.png
「JarファイルをPack200で圧縮」「不必要なアップデートのチェックをしない」で起動を速くする
- default(JumpToClickedPositionSlider): &jnlp2(Swing/JumpToClickedPositionSlider);
- jnlp.packEnabled, jnlp.versionEnabled: &jnlp2(Swing/Pack200);
- http://terai.xrea.jp/swing/pack200/src.zip
- http://terai.xrea.jp/swing/pack200/example__V1.0.4.jar.pack.gz
- 同じJarファイルをPack200で圧縮して(jnlp.packEnabled)、ダウンロードするファイルのサイズを圧縮
- ファイル名にバージョンを付加して(jnlp.versionEnabled)、不必要なアップデートのチェックをしない
- 参考:
以下、antでPack200Taskを使用する場合のメモ
- Deployment — Java.net
- via: java - How to make an Ant task to sign and pack200 all my JAR files? - Stack Overflow
- https://java-pack200-ant-task.dev.java.net/ が無くなってしまったので、Deployment — Java.netのSubversionからソースコードを取得してPack200Task.jarを作成し、パスを通す(%ANT_HOME%\lib以下にコピーするなど)必要がある
<target name="dist" depends="package, dist-libcopy, prepare-web">
<mkdir dir="${bkup.dir}" />
<fileset id="java.file.list" dir="${src.dir}">
<include name="**/*.java" />
</fileset>
<taskdef name="pack200" classname="com.sun.tools.apache.ant.pack200.Pack200Task" />
<pack200 src="${build.dir}/${name}.jar"
destfile="${build.dir}/${name}__V${version}.${build.number}.jar.pack.gz"
gzipoutput="true" />
<filter token="homepage" value="${jnlp.homepage}" />
<filter token="title" value="${jnlp.Name}" />
<!-- 以下省略 -->
- 上記のサンプルだとファイルサイズは、三分の一程度に圧縮される
- ファイル名にバージョンを追加し、jnlp.versionEnabled として、バージョンが上がった場合のみダウンロードするようにしても、ファイルサイズが元々小さいせいかあまり差が感じられない
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://terai.xrea.jp/swing/pack200/" href="example.jnlp">
<information>
<title>JST Pack200 Test</title>
<vendor>Java Swing Tips - at.terai@gmail.com</vendor>
<homepage href="http://terai.xrea.jp/JavaWebStart.html" />
<description>Swing Example</description>
<description kind="short">example</description>
<offline-allowed />
</information>
<update check="background" />
<resources>
<java version="1.6+" />
<jar href="example.jar" main="true" version="1.0.2" />
<property name="jnlp.packEnabled" value="true" />
<property name="jnlp.versionEnabled" value="true"/>
</resources>
<application-desc main-class="example.MainPanel" />
</jnlp>
Web Start のデバッグ
- The 90th percentile: How to debug JWS/JNLP
set JAVAWS_VM_ARGS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=n javaws http://terai.xrea.jp/swing/zoom/example.jnlp
- コラム: Java Web Startのリモートデバッグ - SMG
- Java web startアプリケーションをデバッグする(Java6) - Kazzzの日記
"%JAVA_HOME%\bin\java.exe" "-Xbootclasspath/a:%JAVA_HOME%\jre\lib\javaws.jar;%JAVA_HOME%\jre\lib\deploy.jar" -Djnlpx.home="%JAVA_HOME%\jre\bin" -Djnlp.jvm="%JAVA_HOME%\jre\bin\java.exe" -Djava.security.policy="file:%JAVA_HOME%\lib\security\javaws.policy" -DtrustProxy=true -Xverify:remote -Djnlpx.heapsize=NULL,NULL -Djnlpx.vmargs="-classic -Xdebug -Dnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8918" com.sun.javaws.Main "http://terai.xrea.jp/swing/zoom/example.jnlp"
- "%JAVA_HOME%\bin\javaws" -verbose example.jnlp と、verboseオプションをつけて起動すると、JAVAWS_VM_ARGSの設定や、上記の内容などがダイアログ表示される
- JaNeLA - The Java Network Launch Anaylzer
deployJava.js
- https://www.java.com/js/deployJava.js
- &jnlp3(Swing/Pack200);
<script src="http://java.com/js/deployJava.js"></script>
<script>deployJava.createWebStartLaunchButtonEx('$url', '1.6+');</script>
Java7をインストールしてから?、deployJava.jsを使うと、Java のダウンロードページに飛ばされるようになってしまった…。
- Java Web Start & JNLP - Problems using deployJava.js with Java 7
- Bug ID: 7111793 deployJava.js installs 1.6 when asked for 1.7 on clean machine
- 7u4 で修正されている(が、また元に戻すのは面倒なのでdeployJava.jsは使用しない…)
参考リンク
- Java(TM) Web Start
- Java(TM) Web Start(日本語)
- JDK の開発ツール#セキュリティーツール
- javax.jnlp (JNLP API Reference 1.5)
- Unofficial Java Web Start/JNLP FAQ
- Space: Java Web Start & JNLP | Oracle Forums
- Javaアプリケーションのテスト用に証明書チェーンを生成
- 無償で正統的なコードサイニング証明書を入手する方法 - 日々是開発:SQS Development(2005-10-03)
- Deploying Your Rich Internet Application Nice And Easy! (The Java Tutorials' Weblog)
- Deployment Toolkit 101 (The Java Tutorials' Weblog)
- Avoiding Unnecessary Update Checks (The Java™ Tutorials > Deployment > Deployment In-Depth)
コメント
- メモ: [bug JNLP:JavaWebStartでデスクトップ上に作成したショートカット<アイコンにファイルをドロップすると、そのアプリケーションの起動に失敗し、「このアプリケーションは起動できません」と出る - 日々是開発:SQS Development(2007-12-02)] -- aterai
- メモ:Bug ID: 6943522 Failed to launch any signed application on 6u19 when cache is disabled -- aterai
- リンク切れを修正。 -- aterai
- いつもお世話になっております。単体SWINGでは-Djava.net.preferIPv4Stack=trueを付けると、PGMはうまく動きましたが、jnlpにどのように書けばいいかが判らなく、ご教示ください。<resources><property name="java.net.preferIPv4Stack" value="true"/>はだめみたいです。</resources>。いつもご教示、感謝しております。 -- panda?
- こんばんは。The following properties, as well as properties beginning with either "javaws." or "jnlp.", are considered "secure" and will be passed to the VM in this way:、次のプロパティーは「安全」とみなされ、この方法で VM に渡されます。 …にある安全とみなされるプロパティに、java.net.preferIPv4Stack はないので、<security><all-permissions/></security>として、セキュリティ証明書でjarに署名する必要があるのかもしれません(試していないのでうまくいくか不明ですが)。 -- aterai
- あと、jnlpに記述する必要がないなら、コマンドラインから、javaws -verbose -J-Djava.net.preferIPv4Stack=true http://terai.xrea.jp/swing/wipe/example.jnlp などとしてテストしてみるのもいいかもしれません。 -- aterai
- ご教示、感謝します。方法1は実施しましたが、だめでした。方法2について、まだ理解していません。JWSにおいて、jnlpに書かない方法はありますか?また方法3として、JAVA PGMに直接System.setProperty("java.net.preferIPv4Stack", "true");しましたが、IPv6を取ってきます。方法2について、もう少しご教示ください。 -- panda?
- 方法1の補足ですが、例えば、C:\Users\%USERNAME%\AppData\LocalLow\Sun\Java\Deployment\deployment.properties ファイルなどに deployment.javaws.secure.properties=java.net.preferIPv4Stack を追加して、<property name="java.net.preferIPv4Stack" value="true"/>を安全であると許可してみるのはどうでしょうか?
- 方法2がうまく動作するのなら、クライアントの環境変数 _JAVA_OPTIONS か、JAVA_TOOL_OPTIONS に、-Djava.net.preferIPv4Stack=true を追加するといいかもしれません。 -- aterai