当前位置: 首页 > 知识库问答 >
问题:

ClassCastException 将类实例强制转换为其自己的类,因为它位于具有 gradel 和 tomcat 的“未命名模块”中

池恩
2023-03-14

有很多类似的问题,但我找不到一个能让这个类自己解决的。我们使用的依赖项来自此项目的webp支持:

implementation "org.sejda.imageio:webp-imageio:0.1.6"

如果我们不尝试更改写入参数,它可以正常工作,但如果我们这样做:

Iterator imageWriters = ImageIO.getImageWritersByFormatName("webp");
ImageWriter writer = (ImageWriter) imageWriters.next();

WebPWriteParam writeParam = new WebPWriteParam(null);
writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
writeParam.setCompressionType(writeParam.getCompressionTypes([WebPWriteParam.LOSSY_COMPRESSION]);
writeParam.setCompressionQuality(0.75f);

baos = new ByteArrayOutputStream();
ImageOutputStream ios = ImageIO.createImageOutputStream(baos);
writer.setOutput(ios);
writer.write(null, new IIOImage(img, null, null), writeParam);

我们得到这个奇怪的例外

java.lang.ClassCastException:class com.luciad.imageio.webp。WebPWriteParam无法强制转换为类com.luciad.imageio.webp。WebPWriteParam(com.luciad.imageio.webp.WebPWriteParam位于加载器org.apache.catalina.loader.ParallelWebappClassLoader@34282781的未命名模块中;com.luciad.imageio.webp.WebPWriteParam位于加载程序org.apach.catalina.loaders.parallellWebAppClassloader@238ad8c的未命名模件中)位于com.lusiad.imagelio.WebPWriter.write(WebPWriter.java:67)~[webp-imageio-0.1.6.jar:?]在com.XXX.business.util.ImageServices$ImageSaver.run(ImageServices.java:874)[rcw core.jar:?]在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPool Executor.java:1130)[?:?]在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPool Executor.java:630)[?:?]在java.lang.Thread.run(Thread.java:832)[?:?]

我非常理解类加载器,但不理解这个模块概念在这里是如何不起作用的。你能给我指出正确的方向吗?

共有1个答案

翟青青
2023-03-14

在类路径中有两次此类。错误消息试图为您提供两个来源,但不是很成功。

一般来说:试图将类A的对象(来自类加载器/jar C1)类型转换为具有相同名称A的类的对象,但是从类加载器/jar C2加载。

找到C1和C2并消除其中一个。使类只可用一次,问题就会消失

 类似资料: