3

Java を使用してアプリケーションを開発し、Java Web Start を使用してデプロイしています。私は Mac OS で開発し、Windows XP と 7 でテストして
います。どうやら 7 でのみ奇妙な問題が発生しています。

プロセスが何らかの理由で失敗し、javaws.exeアプリケーションを再起動できません。JNLP が作成したデスクトップ アイコンをクリックするたびに、別のjavaws.exeプロセスが生成されますが、何も起こりません。コードは実行されず、public static void mainプログラム エントリ ポイントの最初の行も実行されません。

コマンドラインから起動しようとしましたが、これを修正するのに役立つログやエラー メッセージが表示されません。別の JNLP
を起動しようとしましたが、うまくいきました。

実行中のすべてのjavaws.exeインスタンスを強制終了すると問題は解決しますが、顧客がそれを行うことは期待できません。

したがって、どういうわけか、Java が失敗するアプリケーションの問題が発生していることを意味します。
これに遭遇しました:アプリが起動され、赤い十字をクリックして閉じ、再度開きました(サーバー側のjarファイルとjnlpファイルを変更しました)。javaws.exe開かず、すべてのインスタンスを強制終了するまで再び開くことができませんでした。

詳細は次のとおりです。

  • Mac OS X.7 で開発
  • Windows 7 でテスト済み
  • Java 7で実行
  • アプリケーションは Eclipse で開発され、SWT UI と他のいくつかのサードパーティ ライブラリを備えています。
  • Java コントロール パネルの項目からすべてのロギングをオンにしました

上記の JNLP を実行したときに表示された Java コンソールの内容は次のとおりです。

Java Web Start 10.9.2.05
Using JRE version 1.7.0_09-b05 Java HotSpot(TM) Client VM
User home directory = C:\Users\Bicou
----------------------------------------------------
c:   clear console window
f:   finalize objects on finalization queue
g:   garbage collect
h:   display this help message
m:   print memory usage
o:   trigger logging
p:   reload proxy configuration
q:   hide console
r:   reload policy configuration
s:   dump system and deployment properties
t:   dump thread list
v:   dump thread stack
0-5: set trace level to <n>
----------------------------------------------------
    Match: beginTraversal
Match: digest selected JREDesc: JREDesc[version 1.6+, heap=-1--1, args=null, href=http://java.sun.com/products/autodl/j2se, sel=false, null, null], JREInfo: JREInfo for index 0:
    platform is: 1.7
    product is: 1.7.0_09
    location is: http://java.sun.com/products/autodl/j2se
    path is: C:\Program Files (x86)\Java\jre7\bin\javaw.exe
    args is: null
    native platform is: Windows, x86 [ x86, 32bit ]
    JavaFX runtime is: JavaFX 2.2.3 found at C:\Program Files (x86)\Java\jre7\
    enabled is: true
    registered is: true
    system is: true

    Match: ignoring maxHeap: -1
    Match: ignoring InitHeap: -1
    Match: digesting vmargs: null
    Match: digested vmargs: [JVMParameters: isSecure: true, args: ]
    Match: JVM args after accumulation: [JVMParameters: isSecure: true, args: ]
    Match: digest LaunchDesc: http://docs.oracle.com/javase/tutorialJWS/deployment/webstart/ex6/webstart_ComponentArch_DynamicTreeDemo/dynamictree-webstart.jnlp
    Match: digest properties: []
    Match: JVM args: [JVMParameters: isSecure: true, args: ]
    Match: endTraversal ..
    Match: JVM args final: 
    Match: Running JREInfo Version    match: 1.7.0.09 == 1.7.0.09
     Match: Running JVM args match: have:<>  satisfy want:<>

私の JNLP:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+"
    codebase="http://my.url/"
    href="UpCab.jnlp">
    <information>
        <title>UpCab</title>
        <vendor>Benoit Duffez</vendor>
        <homepage href="http://my.url/" />
        <description>Logiciel de gestion de cabinet</description>
        <icon href="icon.png" kind="shortcut" />
        <icon href="splash.png" kind="splash" />
        <offline-allowed />
        <shortcut online="true" install="true">
            <desktop />
        </shortcut>
    </information>

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

    <resources>
        <jar href="opencsv-2.3.jar" />
        <jar href="iText-2.1.7.jar" />
        <jar href="iTextRTF.jar" />
        <jar href="sqlite-jdbc-3.7.2.jar" />
        <jar href="commons-logging-1.1.1.jar" />
        <jar href="httpclient-4.2.jar" />
        <jar href="upcab.jar" />
        <jar href="httpcore-4.2.jar" />
        <jar href="jna.jar" />
        <jar href="platform.jar" />
    </resources>

    <resources os="Windows" arch="x86">
        <j2se version="1.6+" />
        <jar href="swt-win32-x86.jar" />
    </resources>

    <resources os="Windows" arch="x86_64">
        <j2se version="1.6+" />
        <jar href="swt-win32-x86_64.jar" />
    </resources>

    <resources os="Windows" arch="amd64">
        <j2se version="1.6+" />
        <jar href="swt-win32-x86_64.jar" />
    </resources>

    <resources os="Mac" arch="x86_64">
        <j2se version="1.6+" java-vm-args="-XstartOnFirstThread" />
        <nativelib href="swt-mac-x86_64.jar" />
    </resources>

    <application-desc main-class="my.full.pkg.Main" />
</jnlp>
4

1 に答える 1

2

SingleInstanceServiceを開始した JavaWebStart アプリケーションがクラッシュすると、SingleInstanceService が実行されたままになる可能性があり、同じアプリケーションを再起動しようとする後続の試行が検出され続けます。リスナーにログ メッセージを追加することをお勧めします。ログメッセージは、起動されたばかりのアプリケーションではなく、最初のアプリケーションのコンソールに表示されることに注意してください。

private class SingleInstance implements SingleInstanceListener {
    @Override
    public void newActivation(final String[] params) {
        logger.info("newActivation params=" + params);

        ... activation code here ...

    }
}

アプリケーションがクラッシュした場合は、実行中のすべてのスレッドを停止し、登録されている SingleInstanceListeners を削除してください。

SingleInstanceService sis = (SingleInstanceService) ServiceManager.lookup("javax.jnlp.SingleInstanceService");
sis.removeSingleInstanceListener(mySingleInstanceListener);
于 2013-01-03T09:08:37.417 に答える