【问题标题】:Java WS won't start the application until other running javaws dead instances are killedJava WS 不会启动应用程序,直到其他正在运行的 javaws 死实例被杀死
【发布时间】:2012-12-16 22:25:52
【问题描述】:

我正在使用 Java 开发应用程序并使用 Java Web Start 部署它们。我正在使用 Mac OS 进行开发并在 Windows XP 和 7 下进行测试。
我遇到了一个奇怪的问题,似乎只有 7 点。

javaws.exe 进程不知何故失败了,我无法再次启动应用程序。每次我单击 JNLP 创建的桌面图标时,它都会生成另一个 javaws.exe 进程,但什么也没有发生,我的代码不会运行,甚至 public static void main 程序入口点的第一行也不会运行。

我尝试从命令行启动它,但没有收到任何日志或任何可以帮助我解决此问题的错误消息。
我尝试启动another JNLP,它就像一个魅力!

杀死所有正在运行的 javaws.exe 实例可以解决问题,但我不能指望我的客户这样做。

所以这意味着我的应用程序出现了问题,导致 java 失败。
我刚刚遇到这个:应用程序启动了,我点击了红叉关闭它,然后再次打开它(我更改了服务器端的 jars 和 jnlp 文件)。它没有打开,我也无法再次打开它,直到我杀死所有 javaws.exe 实例。

这里有一些细节:

  • 在 Mac OS X.7 下开发
  • 在 Windows 7 下测试
  • 使用 Java 7 运行
  • 应用程序是用 Eclipse 开发的,有一个 SWT UI 和其他几个第三方库
  • 我打开了来自Java control panel item 的所有日志记录

这是我运行上述 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>

【问题讨论】:

  • 理想情况下,这些“死”进程应该自己死掉。是否有可能解决这个问题?
  • @PeterLawrey:就是这个想法,是的。
  • JNLP 似乎是有效的,但无论如何都要用JaNeLA 检查它。
  • 您的应用程序是否使用单实例服务:docs.oracle.com/javase/1.5.0/docs/guide/javaws/jnlp/javax/jnlp/…
  • @AkselWillgert:我只是在注释掉与此相关的代码。我确实使用它,我认为这可能是原因。

标签: java jnlp java-web-start


【解决方案1】:

已启动 SingleInstanceService 的崩溃 JavaWebStart 应用程序可能会使 SingleInstanceService 继续运行,这将继续尝试再次启动同一应用程序。建议向侦听器添加日志消息。请注意,日志消息将显示在第一个应用程序的控制台中,而不是刚刚启动的那个。

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

        ... activation code here ...

    }
}

如果应用程序崩溃,请确保停止所有正在运行的线程并删除已注册的 SingleInstanceListener。

SingleInstanceService sis = (SingleInstanceService) ServiceManager.lookup("javax.jnlp.SingleInstanceService");
sis.removeSingleInstanceListener(mySingleInstanceListener);

【讨论】:

  • 就是这样。聪明的猜测:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 2011-12-15
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多