Java 网红 java.lang.NullPointerException (JnlpxArgs.execProgram)

Java Web Star java.lang.NullPointerException (JnlpxArgs.execProgram)

我有一个由 servlet 动态生成的 JNLP 文件。生成的 JNLP 是:

<jnlp spec="6.0+"  href="launch?param1=Hooolas">
      <information>
        <title>JSGD</title>
        <vendor>evconsul</vendor>
        <homepage href=""/>
        <description>JSGD</description>
        <description kind="short">JSGD</description>
        <offline-allowed/>
      </information>
      <update check="background"/>
      <security>
        <all-permissions/>
      </security>
      <resources>
        <j2se version="1.8+"/>
        <jar href="http://192.168.0.17:8080/Secu/huella/JSGD.jar" main="true"/>
      </resources>
      <application-desc main-class="jsgd.JSGD">
        <argument>Hooolas</argument>
      </application-desc>
    </jnlp>

客户端机器错误:

java.lang.NullPointerException
    at com.sun.javaws.JnlpxArgs.execProgram(Unknown Source)
    at com.sun.javaws.Launcher.relaunch(Unknown Source)
    at com.sun.javaws.Launcher.prepareResources(Unknown Source)
    at com.sun.javaws.Launcher.prepareAllResources(Unknown Source)
    at com.sun.javaws.Launcher.prepareToLaunch(Unknown Source)
    at com.sun.javaws.Launcher.prepareToLaunch(Unknown Source)
    at com.sun.javaws.Launcher.launch(Unknown Source)
    at com.sun.javaws.Main.launchApp(Unknown Source)
    at com.sun.javaws.Main.continueInSecureThread(Unknown Source)
    at com.sun.javaws.Main.access[=14=]0(Unknown Source)
    at com.sun.javaws.Main.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Missing Application-Name manifest attribute for: http://192.168.0.17:8080/Secu/huella/JSGD.jar
#### Java Web Start Error:
#### null

我已将所有库打包到一个名为 JSGD.jar 的罐子中,其结构是:

JSGD.jar
        -jsgd
        -META-INF
        -org
        -SecugenLib

我的jar的URL是:http://192.168.0.17:8080/Secu/huella/JSGD.jar

我已经通过 Netbeans 8.1 打包了我的应用程序 文件->/buil.xml 右键单击​​ 运行 目标->其他目标->package-for-store。 这会在 Store 文件夹中生成一个 jar。这个 jar 具有上述结构。

在我的机器上运行正常(当 codebase 属性是:codebase="http://localhost:8080/Secu/" 当然!)。会有什么问题? JRE 版本 1.7.0_79-b15(客户端机器) 我使用 Netbeans 8.1

详情:

我已经覆盖 build.xml 添加下一行;将所有 类 装在一个罐子里:

    <target name="package-for-store" depends="jar">  
         <!-- Cambien el valor de esta propiedad para dar el nombre al JAR,  
            sin la extensión .jar. No debe tener espacios.  
            <property name="store.jar.name" value="NombreDelJar"/>  
         -->  
         <property name="store.jar.name" value="JSGD"/>  
         <!-- No editar nada después de esta línea -->  
         <property name="store.dir" value="store"/>  
         <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>  
         <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>  
         <delete dir="${store.dir}"/>  
         <mkdir dir="${store.dir}"/>  
         <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">  
           <zipgroupfileset dir="dist" includes="*.jar"/>  
           <zipgroupfileset dir="dist/lib" includes="*.jar"/>  
 <manifest>  
         <attribute name="Main-Class" value="${main.class}"/>
         <attribute name="Application-Name" value="JSGD"/>
         <attribute name="Trusted-Only" value="true"/>
         <attribute name="Permissions" value="sandbox"/>
         <attribute name="Codebase" 
         value="http://192.168.0.17 http://localhost"/>
      </manifest>  
         </jar>  
         <zip destfile="${store.jar}">  
           <zipfileset src="${store.dir}/temp_final.jar"  
           excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>  
         </zip>  
         <delete file="${store.dir}/temp_final.jar"/>  
       </target>

更新

按照@mosquito-x 的建议,事情似乎变得更好了,但是 Java 7(我也在 jre-8u91 中尝试)阻止了它。 消息是:

 Application Blocked by Java Security.
    Name: JSGD
    From: http://192.168.0.17
    Reason: The Java Security Settings have this application from running. You may  change this behavior in Java Control Panel.

在 Java 控制面板站点列表中。我添加了这些网站:

http://192.168.0.17:8080
http://192.168.0.17:8080/Secu
http://192.168.0.17:8080/Secu/huella
http://192.168.0.17:8080/Secu/launch

提前致谢!

  • JNLP :
    硬编码 codebase="http://192.168.0.17:8080/Secu/"
    仅适用于 localhost

  • 导致java被阻止

原因

java blocked

Java 进一步增强了安全性,使用户系统不易受到外部攻击。
Java 7 Update 51开始,Java不允许用户运行未签名(unsigned)的应用程序,self-signed (未经受信任的机构签名)或缺少权限属性。 运行ning 应用程序涉及的风险 未签名的应用程序

默认情况下阻止没有证书的应用程序(即未签名的应用程序)或缺少应用程序名称和发布者信息。 运行 这种应用程序具有潜在的不安全性,存在更高级别的风险。 Self-signed 申请(证书不是来自受信任的机构)

具有 self-signed 证书的应用程序被阻止 ............

Application-Name 属性

Application-Name

Application-Name 属性用于安全提示,为您签名的 RIA 提供标题。建议使用此属性以帮助用户做出信任和 运行 RIA 的决定。该值可以是任何有效的字符串,例如:

Application-Name: 你好世界

如果 JAR 文件清单中不存在 Application-Name 属性 ............

修改清单文件

Modifying a Manifest File

您在创建 JAR 文件期间使用 m command-line 选项将自定义信息添加到清单。本节介绍 m 选项。

Jar 工具会自动将路径名为 META-INF/MANIFEST.MF 的默认清单放入您创建的任何 JAR 文件中。您可以通过修改默认清单来启用特殊的 JAR 文件功能,例如包密封。通常,修改默认清单涉及将 special-purpose headers 添加到允许 JAR 文件执行特定所需功能的清单。

要修改清单,您必须首先准备一个文本文件,其中包含您希望添加到清单中的信息。然后使用 Jar 工具的 m 选项将文件中的信息添加到清单中。 警告:您用来创建清单的文本文件必须以换行符或回车符结尾 return。 如果最后一行不以换行符或回车符结尾,将无法正确解析它 return。

基本命令格式如下:

jar cfm jar-file manifest-addition input-file(s)

让我们看看这个命令中使用的选项和参数:

The c option indicates that you want to create a JAR file.
The m option indicates that you want to merge information from an existing file ...
The f option indicates that you want the output to go to a file (the JAR file) ...
manifest-addition is the name (or path and name) of the existing text file ....
jar-file is the name that you want the resulting JAR file to have.
The input-file(s) argument is a space-separated list of one or more files ....

我的例子之一
MANIFEST.MF

Manifest-Version: 1.0 Ant-Version: Apache Ant 1.8.3 Main-Class: DataSummaryApplet Class-Path: lib/plugin.jar Application-Name: appJSN Trusted-Only: true Permissions: sandbox Created-By: 1.7.0_51-b13 (Oracle Corporation) Codebase: http://www.asitexx.com http://localhost

编辑:
1.) 大多数 IDE 创建 jar 文件的人都使用 build.xml。 如果您更改项目中的某些内容,这个文件总是新创建的坏事。

改了就可以测试了:

<manifest>  
         <attribute name="Main-Class" value="${main.class}"/>  
</manifest>   

with(根据您的需要更改)

<manifest>  
         <attribute name="Main-Class" value="${main.class}"/>
         <attribute name="Application-Name" value="whatever"/>
         <attribute name="Trusted-Only" value="true"/>
         <attribute name="Permissions" value="sandbox"/>
         <attribute name="Codebase" value="http://www.asitexx.com http://localhost"/>
</manifest>  

您可以将域添加到由空格分隔的代码库

2.) 从 JNLP 文件中删除不再需要的代码库

<jnlp spec="6.0+" codebase="http://192.168.0.17:8080/Secu/" href="launch?param1=Hooolas">

<jnlp spec="6.0+" href="launch?param1=Hooolas">

希望对您有所帮助,
托马斯

更新 来自评论

You think that I should sign with a certificate?? and How do that?

这不是那么容易,你必须小心按照正确的顺序做每件事。
小心:

仅使用纯 .jar 文件,其中包含所有库,甚至您自己创建的 MANIFEST.FM。

测试一下,打开jar文件必须只包含libs纯文本。 SHA-256-Digest或其他部分如7fnH8YhS5mkYtZoJqiWEI2bfSXSYd2alrKCEdvieyEk

然后就可以进行下一步了。

只有两个链接可能对您有帮助。

To Generate a Certificate by Using keytool

Signing JAR Files