我已经在网上搜索并尝试了很多东西,但没有任何效果。首先,我不是 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 人,只是继承了这个应用程序。