我有一个Java应用程序项目,在进入web启动之前,它一直运行良好。我的项目依赖于外部库来处理串行端口和USB端口。
运行此应用程序。在DOS命令中:
java -DPropLoc=Drivers.Properties -jar myprog.jar <args>
在Netbeans 6.7.1 JRE 1.6u21中,当选择WebStart作为项目配置时,我可以运行主项目,但它未能加载驱动程序。在项目属性中,我将VM选项设置为-DPropLoc="Drivers.Properties
,驱动程序依赖于此文件。但如果我一步一步地调试,它会加载驱动程序,然后运行正常
web启动有什么问题?
这是我在加载驱动程序后得到的错误:
Caught java.lang.NullPointerException: name can't be null while loading driver com.sun.comm.Win32Driver
javax.comm.NoSuchPortException at javax.comm.CommPortIdentifier.getPortIdentifier(CommPortIdentifier.java:105)
因为我不明白为什么它在NB中一步一步地调试时加载了驱动程序。但是通过按F6来运行主项目,它不会加载驱动程序。调试和运行之间的环境或JVM有什么不同。
以下是launch.jnlp
文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jnlp codebase="file:/C:/bit9prog/dev/NetBeansProjects/MyProg/dist/" href="launch.jnlp" spec="1.0+">
<information>
<title>MyProg</title>
<vendor></vendor>
<homepage href=""/>
<description>MyProg</description>
<description kind="short">MyProg</description>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6+"/>
<property name="PropLoc" value="Drivers.Properties"/>
<jar eager="true" href="MyProg.jar" main="true"/>
<jar href="lib/comm.jar"/>
<jar href="lib/config.jar"/>
<jar href="lib/jakarta-regexp-1.4.jar"/>
<jar href="lib/log4j-1.2.14.jar"/>
<jar href="lib/swing-layout-1.0.jar"/>
<jar href="lib/trove.jar"/>
<jar href="lib/XmlUtil.jar"/>
</resources>
<application-desc main-class="MyProg">
<argument>r</argument>
<argument>.</argument>
</application-desc>
</jnlp>
这是一个安全问题。因为您的驱动程序正在进行本机访问,所以必须对其进行签名,如果驱动程序已经签名,则将其添加到jnlp文件的方式略有不同。
例如,对于使用证书签名的内部库,则条目看起来如下
<jar href="myLibrary.jar"/>
然而,对于由其他人签名的资源,您的条目看起来像
<extension href="Driver.jnlp" name="Driver" version=""/>
它需要自己的JNLP文件
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+"
codebase="{yourcodebase}" href="Driver.jnlp">
<information>
<title>Driver</title>
<vendor>Driver Corporation</vendor>
</information>
<resources>
<jar href="lib/TheExternalDriver.jar"/>
</resources>
<security>
<all-permissions/>
</security>
<component-desc/>
</jnlp>
我认为NetBeans并没有在同一个当前目录中运行WebStart项目。
我建议您尝试为驱动程序属性提供绝对路径。附加测试是尝试检查程序运行的位置,即打印new File(".")
我希望这会有所帮助。
感谢大家的帮助,感谢Andrew提供的有用反馈。毕竟,我能够创建运行Webstart的项目。我不得不缩小规模,只加载USB驱动程序,而不是同时加载RS232和USB驱动程序并有库冲突,但奇怪的是,它作为标准的java应用程序运行得很好。由于我无法控制驱动程序是如何实现的,所以我所拥有的只是来自驱动程序提供程序的jar文件。也许这是一个安全问题,但我对此表示怀疑,因为我可以自我签名并在本地磁盘上运行。