需要用snappy继续数据压缩时,出现了标题中的错误。
纠结了很久之后,终于发现问题所在。
可惜对jetty不熟,又纠结了很久jetty的配置问题。
希望能对有同样问题的亲们有所帮助。
问题解决方案参考:
https://groups.google.com/forum/#!topic/xerial/ActV3936iKY
问题描述:
snappy 报错:SnappyNative.maxCompressedLength(I)I
采用在pom.xml中将snappy的<scope>compire</scope>改为<scope>provided</scope>后报NoDefClassFound错误
环境:
JDK: 1.6
maven: 2.3.2
snappy: 1.0.5
jetty: 6.1.26
os: windows8 x64
原因:
jetty的配置(org.mortbay.jetty.webapp.WebAppContext)中 parentLoaderPriority(默认为false)应设置为true
因为snappy中jetty的默认支持上有问题,查阅资料后发现,在早起版本的snappy(1.0.4.x以下),在tomcat等server中也会存在问题,主要是其jar要存在于tomcat的lib下而不是自己的lib下。具体原因没有仔细看,不过貌似是以为snappy为了通行用,使得所有application都可以使用snappy,所以配置策略使用了这种方式。由于本人对jetty不熟悉,只是结合出错的原因猜测可以jetty也是由于这个策略的原因,造成了这个错误(如果有大牛能详细科普一下就万分感谢了)。
解决方案:
1、利用xml文件
2、自己写server类
由于写程序不符合自己的要求,采用了xml文件的方式(写server类的可以自行百度,例子很多),具体操作如下:
1、pom.xml配置不变(仍为<scope>compire</scope>),增加配置jetty文件: WEB-INF/jetty-web.xml (注意不是jetty.xml,jetty-web.xml是面向单个application的,而jetty.xml是面向jetty的server的,jetty.xml中可以配置端口等信息)
2、jetty-web.xml文件内容如下(这里最精简的例子,其他也可以配置很多内容,具体可以参考网上的例子):
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<Set name="parentLoaderPriority">true</Set>
</Configure>
3、重新运行程序即可。