1

私のアプリは JavaWS によってデプロイされますが、ユーザーが JNLP をクリックした後、何も起こらないように見える長い一時停止があり、その後アプリが画面にポップアップします。JavaWS はすべての JAR をバックグラウンドでダウンロードしていますが、進行状況が表示されず、非常に貧弱です。だから私はカスタムのものを構築することに着手しました:

public class LoadingProgress implements DownloadServiceListener
{
    Stage       stage;
    TextArea    log = new TextArea();

    public LoadingProgress()
    {
        stage = new Stage(StageStyle.UNDECORATED);
        stage.setScene(new Scene(PaneBuilder.create().children(log).prefHeight(300).prefWidth(300).build()));
        stage.show();
    }

    @Override
    public void downloadFailed(URL url, String version)
    {
        log.appendText(String.format("failed url=%s version=%s\n", url, version));
    }

    @Override
    public void progress(URL url, String version, long readSoFar, long total, int overallPercent)
    {
        log.appendText(String.format("progress url=%s version=%s readSoFar=%d total=%d overallPercent=%d\n", url, version, readSoFar, total, overallPercent));
    }

    @Override
    public void upgradingArchive(URL url, String version, int patchPercent, int overallPercent)
    {
        log.appendText(String.format("validating url=%s version=%s patchPercent=%d overallPercent=%d\n", url, version, patchPercent, overallPercent));
    }

    @Override
    public void validating(URL url, String version, long entry, long total, int overallPercent)
    {
        log.appendText(String.format("validating url=%s version=%s entry=%d total=%d overallPercent=%d\n", url, version, entry, total, overallPercent));
    }

}

そして、これが私のJNLPです。カスタム ローダー クラスを 3 つの異なる方法で使用してみましたが、いずれも単独では機能せず、組み合わせても機能しません

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="6.0+" codebase="${url}" xmlns:jfx="http://javafx.com" href="Companyapp.jnlp">

    <information>
        ... info ...
    </information>

    <update check="always" policy="prompt-update" />

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

    <resources>
        <jfx:javafx-runtime version="2.2+" href="http://javadl.sun.com/webapps/download/GetFile/javafx-latest/windows-i586/javafx2.jnlp" />
    </resources>

    <resources>
        <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se" />

        ... jar assets ...
    </resources>

    <jfx:javafx-desc main-class="com.mediacitizens.companyapp.presentation.desktop.Main" name="Companyapp" progress-class="com.mediacitizens.companyapp.presentation.desktop.LoadingProgress" /> <!--  width="0" height="0" //-->
    <application-desc main-class="com.mediacitizens.companyapp.presentation.desktop.Main" progress-class="com.mediacitizens.companyapp.presentation.desktop.LoadingProgress" />
    <component-desc progress-class="com.mediacitizens.companyapp.presentation.desktop.LoadingProgress" />
</jnlp>

したがって、これのどれも違いはありません。完全なログ記録とトレースを行っても、コンソールには何も表示されません。

何が起こっている?

4

1 に答える 1

1

セットアップで何が問題になっているのか正確にはわかりませんが、DownloadServiceこれを処理するために独自に実装する必要はありません。代わりに、Oracle の公式Java デプロイメント ガイド for Preloadersに従って、JavaFX プリローダーを使用することをお勧めします。このガイドでは、プリローダーを独自の jar ファイルに分離する、JavaFX アプリケーション スレッドをブロックしない、バックグラウンド更新チェックを有効にする、一部の jar を遅延読み込みとしてマークする、自動プロキシ構成を無効にするなど、アプリケーションを効率的に起動するためのパフォーマンスのヒントを提供します。

公式の Oracle JavaFX デプロイメント ガイドのツールを使用すると、ファイルを手動で編集する必要がなくなります。これjnlpは、ツールがアプリケーションを効率的にロードするためのファイルを生成するためです。

Java デスクトップ アプリケーションのトラブルシューティング ガイドに従うと、起動時にパフォーマンスの問題がどこにあるのかを特定するのに役立つ場合があります。

JavaWS はすべての JAR をバックグラウンドでダウンロードしていますが、進行状況が表示されず、非常に貧弱です。

それは変です。JAR のダウンロードに時間がかかっていることをどのように判断しますか? JavaFX システムには、アプリ jar のダウンロード中に進行状況を表示するデフォルトのプリローダーが付属しています (白い画面の中央にある青い進行状況バーです)。

「JavaFX システムにはデフォルトのプリローダーが同梱されています」

OS X 用の JavaFX 2.2.21 サンプルをダウンロードしました。次に、抽出したサンプル ディレクトリに移動して実行javaws Ensemble.jnlpすると、アプリの起動時に標準のプリローダーが青いプログレス バーとともに表示されました。おそらく、Ensemble サンプル アプリと同様のパッケージ化手順を使用すると、うまくいくでしょう。

アップデート

次の再オープンされたバグRT-25290 no default fx preloader for jnlp appに気付きました。前述したように、私は実際にこのバグに遭遇することはなく、OS X (Java 8 ビルド 88) ではデフォルトの JavaFX プリローダーが表示されるため、どのような状況でこのようなバグに遭遇する可能性があるか正確にはわかりませんが、おそらくそれでも知っておくべきこと。

于 2013-05-09T02:53:05.350 に答える