文档章节

虚拟主机同时运行多个使用 ImageMagick +Jmagick的网站

猪刚烈
 猪刚烈
发布于 2014/09/24 13:52
字数 662
阅读 33
收藏 0

       Tomcat虚拟主机同时运行多个使用 ImageMagick +Jmagick的网站,遇到了这个错误:Native Library C:\WINDOWS\system32\jmagick.dll already loaded in another classloader

-----------------------------------------------------

环境说明:

中间件:tomcat6.0.18

开发环境:winXP

服务器:CentOS5.3

         在一个tomcat下,有多个虚拟主机, 运行了多个网站,每个网站都使用 ImageMagick +Jmagick 来处理图片, 须要使用JNI调用本地*.dll文件来处理图片,  每个网站(web应用程序)都有自己的lib,在WebContent\WEB-INF\lib下面.  这样就有重复的jar包, 如jmagick.jar,servlet-api.jar, ***等好多jar包, 在每个网站(web应用程序)都有一份.

-----------------------------------------------------

结果在启动tomcat时会报:

1 忽略了servlet-api.jar .  (具体日志信息没有复制)

2 一个web应用程序处理完图片后,第二个web应用程序再处理图片时会出错:Native Library C:\WINDOWS\system32\jmagick.dll already loaded in another classloader

3 A C3P0Registry mbean is already registered

-----------------------------------------------------

 

我搜索到了  http://jbossweek.iteye.com/blog/138903的一篇文章:

1、症状 

如果JBoss上的两个web应用需要使用相同的JNI本地库,当第二个web应用加载JNI本地库时,就会出现Native Library xxx.so already loaded in another classloader错误

2、原因 

 Java虚拟机为了在JNI本地库中确保基于classloader的命名空间隔离,因而不允许一个JNI本地库被两个不同的classloader加载。而JBoss中web应用的classloader是独立的,也就是说每个web应用都有一个专属的classloader,这样就出现两个classloader加载同一JNI本地库的情况

3、解决方法 

在JBoss AS中,虽然不同的web应用使用不同的classloader,但是web应用classloader的父classloader是相同的,这样根据双亲委托模型只要让父classloader加载JNI本地库就可以避免被多个classloader加载。父classloader的classpath为JBoss AS配置(default、all或minimal)的lib目录,因而只要将JNI class单独发布成jar包,并放在配置(default、all或minimal)的lib目录中,问题就可以解决

 以上说明了问题的原因, 上面说 "因而只要将JNI class单独发布成jar包"  , 我使用了 jmagick.jar是在这里调用了JNI ,  所以把jmagick.jar 从WebContent\WEB-INF\lib下 移动到了E:\tomcat-6.0.18\lib下, 就不会被重复加载了.

 

----------------------------------------------------

Tomcat6的类加载顺序

1、最先是$JAVA_HOME/jre/lib/ext/下的jar文件。
2、环境变量CLASSPATH中的jar和class文件。

3、$CATALINA_HOME/lib 下的jar文件。

4、各自具体的webapp /WEB-INF/classes下的class文件。
5、各自具体的webapp /WEB-INF/lib下的jar文件。

 

 

本文转载自:http://elf8848.iteye.com/blog/474697

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
centos 6.2 安装 JMagick 64位 (转载)

把老版本的ImageMagick和JMagick卸载干净 查看版本号: [root@3qianke ~]# rpm -qa | grep ImageMagick ImageMagick-6.2.8.0-4.el5_1.1 ImageMagick-6.2.8.0-4.el5_1.1 [root@3qianke ~]# r......

枫爱若雪
2013/07/01
0
6
ImageMagick高清压缩图片-GraphicsMagick+im4java

之前有写过imageMagick压缩图片的文章,但是那篇文章中用到的是jmagick。 JMagick是一个开源API,利用JNI(Java Native Interface)技术实现了对ImageMagick API的Java访问接口,因此也将比纯J...

Gmupload
2013/09/09
0
0
ImageMagick for java Jmagick的使用

在做pdf文档转成jpg的时候,发现了Jmagick的创建高质量的图片的一个java类库,自己以前使用另外的一个类库,感觉这个更好点,就试着用了下,感觉不错 1.使用的windows下的jmagick-win-6.3.9-Q16...

涂孟超
2013/08/13
0
0
使用 Grapicmagick 和 Im4java 处理图片

ImageMagick是个图片处理工具可以安装在绝大多数的平台上使用,Linux、Mac、Windows都没有问题。GraphicsMagick是在ImageMagick基础上的另一个项目,大大提高了图片处理的性能,在linux平台上...

voole
05/07
0
0
Jmagick java 处理图片

在处理图片的时候用到jmagick,起初以为引入一个pom依赖,就可以用java代码直接操作了,谁知道一直报no JMagick in java.library.path错误。后来在网上查了一番资料发现,并不是那样的,jma...

evil_01
2013/11/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring中static变量不能@value注入的原因

今天本想使用@Value的方式使类中的变量获得yml文件中的配置值,然而一直失败,获得的一直为null。 类似于这样写的。 public class RedisShardedPool { private static ShardedJedisPool pool...

钟然千落
今天
2
0
CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
39
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部