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。您会注意到我尝试以三种不同的方式使用自定义加载器类,它们都不能单独工作或组合在一起

<?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 的 Preloaders 官方Java 部署指南使用 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。正如我之前提到的,我实际上并没有遇到这个错误,并且默认的 JavaFX Preloader 在 OS X(Java 8 build 88)上为我显示,所以我不确定在什么情况下你可能会遇到这样的错误,但也许尽管如此,还是要注意一些事情。

于 2013-05-09T02:53:05.350 回答