应用新加了往苹果APVS推消息的功能,引入了一个证书文件cert.p12,在使用时遇到如下错误:
<pre> javapns.communication.exceptions.KeystoreException: Keystore exception: Detect premature EOF at javapns.communication.KeystoreManager.wrapKeystoreException(KeystoreManager.java:224) at javapns.communication.KeystoreManager.loadKeystore(KeystoreManager.java:79) at javapns.communication.KeystoreManager.loadKeystore(KeystoreManager.java:46) at javapns.communication.KeystoreManager.loadKeystore(KeystoreManager.java:29) at javapns.communication.ConnectionToAppleServer.<init>(ConnectionToAppleServer.java:61) at javapns.notification.ConnectionToNotificationServer.<init>(ConnectionToNotificationServer.java:17) at javapns.notification.PushNotificationManager.initializeConnection(PushNotificationManager.java:107) </pre>
异常发生在导入证书时,猜猜像是读解析内容非预期的遇到EOF了,可能文件有问题。
我们的应用用maven打包,证书放在配置目录或资源目录都如此,调试了一下,改成读源文件目录下的证书文件,没问题了。这就能确定是maven打包后把文件内容改了。
去看maven脚本:
<pre> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1-beta-1</version> <configuration> <warName>communitypushclient</warName> <webResources> <resource> <directory>src/main/webapp/WEB-INF</directory> <filtering>true</filtering> <targetPath>WEB-INF</targetPath> </resource> <resource> <directory>../server/src/main/conf</directory> <filtering>true</filtering> <targetPath>WEB-INF</targetPath> </resource> <resource> <directory>../server/src/main/resources</directory> <filtering>true</filtering> <targetPath>WEB-INF/classes</targetPath> </resource> </webResources> </configuration> </plugin> </pre>
原因很明显了,证书文件放在resources目录下,配置了filter,会对文件中变量进行替换。虽说证书文件中没有什么可替换的,但是这里maven有处理文件,用UTF-8对文件进行转码保存,文件增大了,二进制的内容完全就不对了。把<filtering>true</filtering>改成false即好了。