2

我已经在网上搜索并尝试了很多东西,但没有任何效果。首先,我不是 Java 专家,但我已经在这里完成了我的作业,一切似乎都已正确签名并且应该可以正常工作。该应用程序是由其他人开发的,但我们有代码,并且在最新的 Java 版本之前它运行良好。现在它抛出了一个错误,它无法被签名。我们有一个 GoDaddy 证书,用于使用 build.xml 中的 signjar 对代码进行签名(我们使用的是 Netbeans)。有两个项目。一个访问串行端口以与 Scale (RXTXMyComm) 对话,另一个进行数据计算等 (CWML)。RXTXSerial Dll 也包含在一个名为 rxtxSerial.native.jar 的 jar 中。

首先,我们使用以下 build.xml 编译和构建 RXTX 项目(部分显示它是如何签名的):`

<project name="RXTXCommMY" default="default" basedir=".">
    <description>Builds, tests, and runs the project RXTXCommMY.</description>
    <import file="nbproject/build-impl.xml"/>

    <target name="-post-jar">
        <jar destfile="dist/rxtxSerial.native.jar">
            <fileset dir="lib/win32" includes="rxtxSerial.32.dll" />
            <fileset dir="lib/win64" includes="rxtxSerial.64.dll" />
        </jar>
        <signjar jar="dist/rxtxSerial.native.jar" storetype="pkcs12" storepass="MYPASS" alias="cwml's godaddy.com, inc. id" keystore="../CERTNAME.p12" signedjar="dist/rxtxSerial.native.signed.jar" />
        <delete file="dist/rxtxSerial.native.jar" />

        <signjar jar="${dist.jar}" storetype="pkcs12" storepass="MYPASS" alias="cwml's godaddy.com, inc. id" keystore="../CERTNAME.p12" signedjar="dist/RXTXCommMY.signed.jar" />
        <delete file="${dist.jar}" />
    </target>
</project>

`

然后将这些 jars 包含在 CWML 项目中,并按如下方式构建:`

<target name="-post-jar">
        <tstamp>
            <format property="build.timestamp" pattern="yyyyMd_HmsS" />
        </tstamp>

        <filter token="build.timestamp" value="${build.timestamp}" />

        <basename property="jarFilename" file="${dist.jar}" suffix=".jar" />
        <signjar jar="${dist.jar}" storetype="pkcs12" storepass="MYPASS" alias="CWML's godaddy.com, inc. id" keystore="../CERTNAME.p12" signedjar="dist/${jarFilename}_v${build.timestamp}.jar" />
        <delete file="${dist.jar}" />

        <copy file="index.html" todir="dist" filtering="true" />
        <copy file="cwml.jnlp" todir="dist" filtering="true" />
    </target>

`

jnlp 如下所示:`

<?xml version="1.0" encoding="UTF-8"?>
<jnlp>
    <information>
        <title>Scale Applet</title>
        <vendor>Scale Applet</vendor>
    </information>

    <security>
        <all-permissions />
    </security>

    <resources>
        <j2se version="1.7+" />
        <jar href="CWML_v2013427_153155832.jar" main="true" />
        <jar href="lib/RXTXCommMY.signed.jar?v=2013427_153155832" />
        <nativelib href="lib/rxtxSerial.native.signed.jar?v=2013427_153155832" />
    </resources>

    <applet-desc name="ScaleApplet" main-class="cwml.ScaleApplet" width="200" height="40">
    </applet-desc>
</jnlp>

`

我确实通过 Janela 验证程序运行了它,这很好。

它在 Netbeans 中运行和工作,并且在更新 21 之前工作正常。我还发现,如果我从 jnlp 中删除标签,它可以在 IE 和 Java 7.0 21 中工作,但它不能在 Chrome 中工作。当我在 Chrome 中运行 Java 控制台时,我得到以下信息:

`

java.lang.ExceptionInInitializerError thrown while loading gnu.io.RXTXCommDriver
Exception in thread "Thread-15" java.lang.ExceptionInInitializerError
    at cmwl.ioport.PortHelper.getAvailablePorts(PortHelper.java:49)
    at cmwl.ioport.PortHelper.connectSerialPorts(PortHelper.java:64)
    at cmwl.ioport.PortHelper.run(PortHelper.java:42)
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "sun.arch.data.model" "read")
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at sun.plugin2.applet.AWTAppletSecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
    at java.lang.System.getProperty(Unknown Source)
    at gnu.io.CommPortIdentifier.<clinit>(CommPortIdentifier.java:123)
    ... 3 more

` 我进行了更详细的跟踪,它显示所有三个罐子的证书都经过验证。我很茫然,因为这给我们带来了很大的问题。正在调用的第 123 行是:

System.loadLibrary( "rxtxSerial." + System.getProperty("sun.arch.data.model") );

任何帮助都将不胜感激。正如我所说,我根本不是 Java 人,只是继承了这个应用程序。

4

1 回答 1

0

您的问题看起来像我最近遇到的问题。似乎原因在于本机库加载过程。尝试像这样重写您的初始化代码:

AccessController.doPrivileged(new PrivilegedAction() {
  public Object run() {
    System.loadLibrary(...);
    System.loadLibrary(...);
    return null;
  }
});
于 2013-04-29T06:52:23.077 回答