gpt4 book ai didi

javax.imageio - 用于RawImageInputStream的JAI ImageIO NoClassDefFoundError

转载 作者:行者123 更新时间:2023-12-01 12:15:46 31 4
gpt4 key购买 nike

我对此问题感到非常困惑。我在jai-imageio-core上使用的是1.3.0版本,请检查下面的依赖关系,我完全不知道如何从jar中找出如何在JVM中加载一个类文件(RawImageReaderSpi),而未加载RawImageInputStream。

我已经在tomcat 7容器中部署了Spring Boot Web服务。

该问题随机弹出,并且我注意到当我重新启动TC容器并部署服务的新版本时,此问题会间歇性显示。

任何潜在客户均受到高度赞赏。

我花了一天的时间试图找出问题所在,最终感到很愚蠢。

<dependency>
<groupId>com.github.jai-imageio</groupId>
<artifactId>jai-imageio-core</artifactId>
<version>1.3.0</version>
</dependency>

<dependency>
<groupId>com.github.jai-imageio</groupId>
<artifactId>jai-imageio-jpeg2000</artifactId>
<version>1.3.0</version>
</dependency>

java.lang.NoClassDefFoundError:com / github / jaiimageio / stream / RawImageInputStream
在com.github.jaiimageio.impl.plugins.raw.RawImageReaderSpi.canDecodeInput(RawImageReaderSpi.java:102)〜[jai-imageio-core-1.3.0.jar:1.3.0]
在javax.imageio.ImageIO $ CanDecodeInputFilter.filter(ImageIO.java:567)〜[na:1.8.0_121]
在javax.imageio.spi.FilterIterator.advance(ServiceRegistry.java:821)〜[na:1.8.0_121]
在javax.imageio.spi.FilterIterator处。(ServiceRegistry.java:815)〜[na:1.8.0_121]
在javax.imageio.spi.ServiceRegistry.getServiceProviders(ServiceRegistry.java:516)〜[na:1.8.0_121]
在javax.imageio.ImageIO.getImageReaders(ImageIO.java:646)〜[na:1.8.0_121]
在javax.imageio.ImageIO.read(ImageIO.java:1438)〜[na:1.8.0_121]
在javax.imageio.ImageIO.read(ImageIO.java:1352)〜[na:1.8.0_121]
在my-package.a.b(a.java:155)〜[classes /:na]
在my-package.a.b(a.java:181)〜[classes /:na]
在my-package.a.b(a.java:84)〜[classes /:na]
在my-package.a $$ FastClassBySpringCGLIB $$ 5f66283f.invoke()〜[spring-core-4.1.3.RELEASE.jar:na]
在org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)〜[spring-core-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)〜[spring-aop-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)〜[spring-aop-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation(TransactionInterceptor.java:99)〜[spring-tx-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:267)〜[spring-tx-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)〜[spring-tx-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)〜[spring-aop-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)〜[spring-aop-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在my-package.a $$ EnhancerBySpringCGLIB $$ dfc04a57.b()〜[spring-core-4.1.3.RELEASE.jar:na]
在my-package.a.b(c.java:165)〜[classes /:na]
在my-package.a $$ FastClassBySpringCGLIB $$ 67dbe4b2.invoke()〜[spring-core-4.1.3.RELEASE.jar:na]
在org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)〜[spring-core-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)〜[spring-aop-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)〜[spring-aop-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation(TransactionInterceptor.java:99)〜[spring-tx-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:267)〜[spring-tx-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)〜[spring-tx-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)〜[spring-aop-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)〜[spring-aop-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在my-package.a $$ EnhancerBySpringCGLIB $$ d153236a.processApprovedApplications()〜[spring-core-4.1.3.RELEASE.jar:na]
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处〜[na:1.8.0_121]
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)〜[na:1.8.0_121]
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)〜[na:1.8.0_121]
在java.lang.reflect.Method.invoke(Method.java:498)〜[na:1.8.0_121]
在org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)〜[spring-context-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)〜[spring-context-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)[spring-context-4.1.3.RELEASE.jar:4.1.3.RELEASE]
在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)[na:1.8.0_121]
在java.util.concurrent.FutureTask.run(FutureTask.java:266)[na:1.8.0_121]
在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 201(ScheduledThreadPoolExecutor.java:180)[na:1.8.0_121]
在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)[na:1.8.0_121]
在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[na:1.8.0_121]
在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)[na:1.8.0_121]

最佳答案

这里的问题是ImageIO插件和容器(例如Web / Servlet容器)的一个已知问题。 ImageIO不能很好地支持将插件部署为Web应用程序的一部分。

跟踪注册插件的ImageIO registry实际上是JVM全局的(实际上是每个应用程序上下文的注册表,但是,通常只有一个应用程序上下文*)。

  • 最安全的选择是将插件(及其所有依赖项)安装在容器的“共享”或“公共” lib文件夹中。这样可以确保插件仅安装一次,并且可用于所有容器上下文。这需要控制容器环境,并且由于需要手动安装和完全重新启动容器,因此升级也很麻烦。
  • 如果您希望将插件部署为Web应用程序的一部分,那么我所知道的唯一选择就是使用here所述的com.twelvemonkeys.servlet.image.IIOProviderContextListener

    或者,要在没有web.xml文件的Spring Boot项目中使用它,可以按照here的说明,将以下行添加到onStartup()子类的SpringBootServletInitializer方法中:
    servletContext.addListener(IIOProviderContextListener.class);

    请注意,在首次启用上下文侦听器之后,必须对容器进行完全重新启动,因为早期的部署可能已“污染”了ImageIO

  • *)不要与容器的Web应用程序上下文(可能有很多)混淆。


    [怎么回事]在JVM中加载了一个类文件( RawImageReaderSpi),但是
    RawImageInputStream未加载?

    链接中提到的就是这种情况,其中一个较早的Web应用程序部署已在注册表中注册了 RawImageReaderSpi类,而由于重新部署,该部署中的其余类已被删除。可以从新的部署中获得 RawImageInputStream类,但是由于新的Web应用程序上下文使用了不同的 ClassLoader实例,因此原始Spi类无法将其视为要查找的类。

    关于javax.imageio - 用于RawImageInputStream的JAI ImageIO NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48295907/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com