注意maven打包的filter

应用新加了往苹果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即好了。