升级到JDK 1.7 update 45,从21开始,运行在JBoss AS 7.2.0.Final(或EAP 6.1.0.Alpha1(AS 7.2.0.Alpha1-redhat-4))我得到{{1在初始化NullPointerException
时。在上传过程中用于图像大小调整。
ImageIO
被称为IIORegistry
初始化的一部分,但它在此代码中是NPE:
ImageIO
但是在JBoss外部运行时没有问题(例如,作为JUnit测试)。
我不确定这种行为何时发生变化,但它介于JDK更新21和45之间(来自在线提示,可能是更新25)。
有许多相似(但不完全相同)的悲惨故事,但没有一个建议的解决方案在这里工作。它们还涉及除JBoss之外的其他服务器(例如WebSphere)。所以这似乎是一个更通用的容器配置问题。
我正在使用这两种(以及使用它们的变体):
public static IIORegistry getDefaultInstance() {
AppContext context = AppContext.getAppContext(); // <- context==null here??
JBoss默认导入-Djava.awt.headless=true
-Dawt.toolkit=sun.awt.HToolkit
个包。有关这方面的证据,请参阅this,其中提到了javax.api,它引用了这个模块:
javax.imageio.*
我还尝试明确地将它们添加到modules/system/layers/base/javax/api/main/module.xml
:
jboss-deployment-structure.xml
注意(对于其他搜索此内容的人),当您第一次触发此错误时,您会看到:
<system>
<paths>
<path name="javax/imageio"/>
<path name="javax/imageio/event"/>
<path name="javax/imageio/metadata"/>
<path name="javax/imageio/plugins/bmp"/>
<path name="javax/imageio/plugins/jpeg"/>
<path name="javax/imageio/spi"/>
<path name="javax/imageio/stream"/>
</paths>
</system>
但是在后续尝试中,如果没有重启服务器,你会看到:
java.lang.NullPointerException
javax.imageio.spi.IIORegistry.getDefaultInstance(IIORegistry.java:155)
这是误导性的 - 该类可用于类加载器,但由于第一次失败而被卸载。所以请记住在再次测试之前重新启动服务器。
似乎有些东西阻止了java.lang.NoClassDefFoundError: Could not initialize class javax.imageio.ImageIO
返回任何有用的东西,但是目前我对这个配置的魔法位置感到茫然!
答案 0 :(得分:0)
我遇到了同样的问题,我使用此处提到的解决方案作为临时解决方法:https://forums.oracle.com/message/11082162#11082162。这对我有用。
希望oracle能早点解决问题。
答案 1 :(得分:0)
好吧,u60仍有这个问题。我想我们还在等待Oracle的修复。
然而,对于我的特殊问题,这里建议的简洁解决方案工作得很好:
Could not initialize class javax.imageio.ImageIO
我刚接手这部分:
if(AppContext.getAppContext() == null) {
SunToolkit.createNewAppContext();
}
由于我在其中使用的代码很少被调用,并且进行空检查已经足够便宜,我不认为它保证了使用整个ApplicationListener
解决方案的复杂性。