我无法加载JAI 1.3.0的ImageIO类。 Java 6和Web应用程序服务器(WAS)8.5。我的代码适用于Java 6和WAS(7.0.19)。
我在pom中正确地提到了依赖。需要知道是否有任何人有相同的问题。
byte[] imgBytes = imagesVO.getImgBytes();
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imgBytes));
似乎我的服务器无法在执行期间加载ImageIO类,因此image
值将为空。我在imagesVO
传递Tiff格式文件。
答案 0 :(得分:3)
WAS 8.5中有关于ImageIO库的行为更改,作为该版本中添加的某些类加载器泄漏防护逻辑的一部分。启用防泄漏后,ImageIO库会立即实例化为服务器启动过程的一部分,目的是阻止它(永久性地,因为它对Java EE类加载的动态性质不友好)应用程序提供的实现类。但副作用是,由于在应用程序类出现之前实例化了库,因此无法找到任何应用程序提供的插件。
有一些可能的解决方法:
1)在执行操作之前,请显式调用ImageIO.scanForPlugins()。这将告诉ImageIO使用线程上下文类加载器对插件类进行重新扫描,并且您的选择将被拾取。请注意,这将导致从系统级ImageIO库到应用程序类的永久引用,因此如果重新启动应用程序而不重新启动JVM,则类加载器将泄露(这在以前的WebSphere版本中已经发生过,所以这可能是对你来说不是一个很大的问题。)
2)禁用服务器中的类加载器泄漏防护。您可以使用系统属性(com.ibm.ws.runtime.component.disableMemoryLeakService = true)执行此操作。关于类加载器的泄漏,同样需要注意。
3)将必要的ImageIO库添加到JVM类路径中。调用JVM级别类路径修改的情况非常少,但这只是其中之一 - ImageIO将在服务器启动期间扫描插件,找到您的插件(因为它在JVM类路径中) ,作为奖励,它不会泄漏您的应用程序类加载器。