JNLP的使用及碰到的一些问题

Java 专栏收录该内容
22 篇文章 0 订阅

JNLP(Java Network Launching Protocol )是java提供的一种可以通过浏览器直接执行java应用程序的途径,它使你可以直接通过一个网页上的url连接打开一个java应用程序。
Java桌面应用程序以JNLP 的方式发布,如果版本升级后,不需要再向所有用户发布版本,只需要更新服务器的版本,这就相当于让java应用程序有了web应用的优点。

[以上内容摘自百度搜索,侵删]

简而言之,jnlp可通过 javaws 运行一个软件的快捷方式。当软件有更新时,只需将快捷方式指定的目标源更换掉即可。

现将jnlp学习和使用的一些情况总结如下。碰到的问题及解决方法随开发过程不断更新。

1 Tomcat安装

Ubuntu下Tomcat安装

2 开发HelloWorld程序

新建工程和HelloWorld程序,工程结构为:

Sample

  • com.shao.test
    • HelloWorld.java

将程序打包成可运行的jar,命名为Sample.jar。确保完全安装java环境,同时在java安装目录的bin子目录下,有keytool工具。接着,在Sample.jar目录下运行下面的命令,进行签名前的准备工作:
keytool -genkey -keystore myKeystore -alias jwstest(myKeystore为keystore名称、jwstest为别名,均可自定义)(题外:会提示"keytool -importkeystore -srckeystore root -destkeystore root -deststoretype pkcs12"。)

输入命令后,会提示输入用户名、密码等,按照提示随便输入即可,但一定要记住密码。运行结束它将会在当前路径下创建名为myKeystore(根据自定义)的文件。

如果想查看一下生成的myKeystore(根据上面定义)文件的内容,可以使用下面的命令:keytool -list -keystore myKeystore

运行下面的命令,对Sample.jar包进行签名:
jarsigner -keystore myKeystore Sample.jar jwstest(myKeystore、jwstest根据以上定义)。

注意:必须对jar包进行签名,否则运行时会提示运行的包没有签名并无法继续运行。

3 Sample.jnlp

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://localhost:8080/Sample/" href="http://localhost:8080/Sample/Sample.jnlp">
    <information>
        <title>Sample Demo Application</title>
        <vendor>Cay S. Horstmann</vendor>
        <description>A Sample</description>
    </information>
    <resources>
        <java version="1.8.0+"/>
        <jar href="Sample.jar"/>
    </resources>
    <application-desc main-class="com.shao.test.Sample"/>
</jnlp>

4 部署到tomcat

在tomcat安装目录下的webapps中新建Sample文件夹,将生成的jar包和新建的Sample.jnlp放在Sample目录下。

5 网页访问

在浏览器地址栏中输入 http://localhost:8080/Sample/Sample.jnlp ,会弹出有个窗口提示下载Sample.jnlp,将Sample.jnlp下载到本地。打开命令终端,使用/usr/local/jdk……/bin/javaws Sample.jnlp运行程序。

在实际运行中,弹出“Application Blocked By Java Security”错误,经确认为jdk1.8抛弃了更低的安全级别而只保留了“高”和“更高”级别(可运行java安装目录下的/jre/bin/ControlPanel查看)。解决的办法为在ControlPanel的“Security”页的Site List中添加 http://localhost:8080/Sample/Sample.jnlp , 添加后可运行,但是运行时会发出安全警报。

默认运行时无输出,需要查看输出信息时,在java安装目录中的jre/bin目录下运行ControlPanel,选择Advanced->java Console->always show。

6 一些经验

  1. 通过eclipse生成jar包时,无需对第三方引用包签名,当使用ant 生成jar包时,第三方包需逐一进行签名,且所有签名都应与生成的jar包的签名一致。
  2. 当jnlp需要运行在其它机器上时,jnlp配置文件中,须将localhost修改成本机具体的ip地址。
  3. jnlp需访问数据库时,需要做如下设置
  • mysql -u root -p //输入密码进入数据库
  • grant all privileges on . to ‘root’@’%’ identified by ‘root’; //%标识所有IP均可访问以root为用户名和密码的数据库
  • flush privileges;//更新
  • 在/etc/mysql/目录中修改my.cnf文件,将bind Address 127.0.0.1这句话注释掉。
  • 重启mysql服务。(通过/etc/init.d/mysql stop或者/etc/init.d/mysql start关闭或启动mysql时,若出现Rejected message,1 matched rules;………………等错误时,使用sudo service stop/start mysql 来关闭或启动mysql)
  1. jar包重新签名
    一些引用的第三方jar可能已经签名,但因为运行的需要,所有第三方jar的签名需与生成的待运行的jar签名相同,这意味着需要对此类jar重新签名。
  • 解压 unzip <jar名称>.jar -d <jar名称>
  • 删除掉META-INF里面的.SF和.RSA文件
  • 将.MF文件中所有的“Name”“SHA1-Digest”都删掉
  • 在解压目录下运行jar cvf <jar名称>.jar * 可将jar包的原有签名删除;
  • 根据签名jar包的方法对删除了原签名的jar包重新签名即可

7 实际开发遇到的问题及解决情况

    1. 与Glg相关的几个jar包Glg2.jar、GlgCE.jar、GlgInt.jar在运行中均显示无法加载包

已解决。通过解压缩,发现这几个Jar包的MANIFEST.MF文件中均有Pemissions和Codebase的配置,删除掉相关配置后再重新打包签名即可,步骤见上节相关说明。

    1. GPS/BD时间订阅和报错消息订阅都未起作用,报错为:Java.net.SocketException:Protocol family unavailable。

具体原因待查明。可能的原因为jnlp不支持订阅模式,先已将这两部分使用其余方法实现。

  1. 第三方包和本地资源文件夹config加载的问题

将3rdParty文件夹和config文件夹放在tomcat/webapps/cglt/目录下。此时,虽然已经在build.xml中将config文件做为源文件,见下图。但加载config文件夹中的配置文件仍有问题。

在这里插入图片描述
解决办法见下图。原来的程序中使用了in = new FileInputStream(properties);这个语句,但是发现尽管config文件已经是source folder了,还是报FileNotFoundException。后来,改成了
in = *.class.getClassLoader().getResourceAsStream(properties)之后,就可以访问了。
在这里插入图片描述
4. 软件有记录数据功能,将数据记录在运行机器的规定文件夹中,但jnlp只是运行一个快捷方式,运行在其它机器上时,没有权限跨主机读写文件夹和其中的文件。

这是一个难题,不知道怎么解决。

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页

打赏作者

蜡笔小达新

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值