m2

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」を使うようです。

さいごに

今回の全てのソースは以下になります。

http://github.com/miya2000/javawebstarttest/tree/master