Java Web Start をローカルで動かす(あとデバッグ)
規定のブラウザで URL を開く(*)サンプルを Java Web Start(以下、JWS)を使って書こうとしたんですが、JWS の起動に web サーバーを使う方法しか見つけられなかったのでエントリにします。
(*) これを .net の「部分的に信頼するアプリケーション」でやる方法を探しています。
ご存知の方はぜひ教えてください。
jnlp ファイル
「ローカルで動かす」といってもたいした事はなくて、jnlp の codebase 属性は「file:〜」と書けるので、その jnlp を javaws で起動するだけです。
application.jnlp:
<jnlp spec="1.0+" codebase="file:/D:/eclipse/3.4/eclipse/workspace/JavaWebStartTest/dest/" href="application.jnlp"> <information> <title>Java Web Start Application</title> <vendor>Test</vendor> </information> <resources> <j2se version="1.4+" /> <jar href="application.jar" /> </resources> <application-desc main-class="test.OpenDocumentTest" /> </jnlp>
build.xml
ローカルパスの変更なんかでいちいち jnlp ファイルを変更するのは面倒なので、ant で自動化します。
build.xml (抜粋)
<property name="dest" value="./dest" /> <property name="jar-file" value="application.jar" /> <property name="jnlp-file" value="application.jnlp" /> <property name="jnlp-main-class" value="test.OpenDocumentTest" /> <!-- jnlp ファイルの作成 --> <target name="mkjnlp" depends="jar"> <dirname file="${dest}" property="dest.dir" /> <makeurl file="${dest}" property="dest.url"/> <echo message="Creating jnlp to: ${dest.dir}/" level="info" /> <echo file="${dest}/${jnlp-file}"><![CDATA[ <jnlp spec="1.0+" codebase="${dest.url}" href="${jnlp-file}"> <information> <title>Java Web Start Application</title> <vendor>Test</vendor> </information> <resources> <j2se version="1.4+" /> <jar href="${jar-file}" /> </resources> <application-desc main-class="${jnlp-main-class}" /> </jnlp> ]]></echo> </target> <!-- Java Web Start アプリケーションの実行。 --> <target name="runJWS" depends="mkjnlp"> <echo message="Run: ${dest}/${jnlp-file}" level="info" /> <exec executable="javaws"> <arg value="-Xnosplash" /> <arg value="${dest}/${jnlp-file}" /> </exec> </target>
eclipse を使ったリモートデバッグ
ついでに eclipse を使ったリモートデバッグに対応します。以下を参考にさせていただきました。
build.xml (抜粋)
<!-- デバッグの実行。 別途、Eclipse にてリモートデバッグの設定をします。 メニューの「実行」→「デバッグの構成」から「リモート Java アプリケーション」→「新規」。 プロジェクト : デバッグする対象のプロジェクト ホスト : localhost ポート : 8118 に設定。 このタスクを実行すると「Run Debug: ./dest/application.jnlp」で止まったように見えますが、 リモートデバッグを開始すると動き出します。 @see http://www.smg.co.jp/JavaTroubleshooting/column_003Main.html @see http://d.hatena.ne.jp/Kazzz/20080408/p2 --> <target name="runDebug" depends="mkjnlp"> <echo message="Run Debug: ${dest}/${jnlp-file}" level="info" /> <java fork="true" classname="com.sun.javaws.Main"> <bootclasspath> <filelist dir="${JDK_HOME}\jre\lib"> <file name="rt.jar" /> <file name="javaws.jar" /> <file name="deploy.jar" /> </filelist> </bootclasspath> <jvmarg value="-Djnlpx.home=${JDK_HOME}\jre\bin" /> <jvmarg value="-Djnlp.jvm=${JDK_HOME}\jre\bin\javaw.exe" /> <jvmarg value="-Djava.security.policy=file:${JDK_HOME}\lib\security\javaws.policy" /> <jvmarg value="-DtrustProxy=true" /> <jvmarg value="-Xverify:remote" /> <jvmarg value="-Djnlpx.heapsize=NULL,NULL" /> <jvmarg line='-Djnlpx.vmargs="-classic -Xdebug -Dnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8118"' /> <arg value="${dest}/${jnlp-file}" /> </java> <echo message="Run Debug End." level="info" /> </target>
「<jvmarg line=」の部分は非常にハマりました。スペースが入る場合は「value」でなく「line」を使うようです。