使用com.google.zxing生成二维码遇java.lang.NoSuchMethodError问题求助
二维码生成程序在Java 1.8.0_191环境下抛出NoSuchMethodError问题排查
我使用com.google.zxing(core及javase版本3.3.0)编写了生成二维码的Java程序,该程序在OpenJDK 1.8.0_342-internal、Java 1.8.0_121环境下可正常运行,但在Java 1.8.0_191环境中抛出错误:java.lang.NoSuchMethodError: com.google.zxing.client.j2se.MatrixToImageWriter.writeToPath()。以下是相关配置、代码及报错堆栈:
依赖配置
<dependencies> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.0</version> </dependency> </dependencies>
程序代码
package com.dataz.core; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Path; import com.google.zxing.BarcodeFormat; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; public class QrCodeUtil { public static boolean generateImageGenaric(String text, String filePath, Integer width, Integer height) throws WriterException, IOException { QRCodeWriter qrCodeWriter = new QRCodeWriter(); BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height); Path path = FileSystems.getDefault().getPath(filePath); MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path); // MatrixToImageWriter.toBufferedImage(bitMatrix); return true; } public static void main(String[] args) { try { String path = "/home/data/qr/qrfile.png"; String value = "qrbatta"; if (args != null && args.length > 0 && args[0] != null) { path = args[0]; } if (args != null && args.length > 1 && args[1] != null) { value = args[1]; } boolean isgenerated = generateImageGenaric(value, path, 400, 400); if (isgenerated) { System.out.println("QR Code Generate In Here --->" + path); } else { System.out.println("Error Occured While Generating"); } } catch (WriterException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
报错信息
org.glassfish.jersey.server.ContainerException: java.lang.NoSuchMethodError: com.google.zxing.client.j2se.MatrixToImageWriter.writeToPath(Lcom/google/zxing/common/BitMatrix;Ljava/lang/String;Ljava/nio/file/Path;)V org.glassfish.jersey.servlet.internal.ResponseWriter.rethrow(ResponseWriter.java:256) org.glassfish.jersey.servlet.internal.ResponseWriter.failure(ResponseWriter.java:238) org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:486) org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:317) org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) org.glassfish.jersey.internal.Errors.process(Errors.java:315) org.glassfish.jersey.internal.Errors.process(Errors.java:297) org.glassfish.jersey.internal.Errors.process(Errors.java:267) org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:292) org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1139) org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:454) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:334) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
根因堆栈
java.lang.NoSuchMethodError: com.google.zxing.client.j2se.MatrixToImageWriter.writeToPath(Lcom/google/zxing/common/BitMatrix;Ljava/lang/String;Ljava/nio/file/Path;)V com.dataz.core.QrCodeUtil.generateImageGenaric(QrCodeUtil.java:20) com.dataz.core.customerinfo_enterprice_contacts.CustomerinfoEnterpriceContactsDataManager.generateQRCode(CustomerinfoEnterpriceContactsDataManager.java:354) com.dataz.core.customerinfo_enterprice_contacts.CustomerinfoEnterpriceContactsDataManager.sendEmailToCustomer(CustomerinfoEnterpriceContactsDataManager.java:303) com.dataz.core.customerinfo_enterprice_contacts.CustomerinfoEnterpriceContactsDataManager.addCustomerinfoEnterpriceContacts(CustomerinfoEnterpriceContactsDataManager.java:278) com.dataz.core.api.vi.service.impl.CustomerinfoEnterpriceContactsServiceImpl.addCustomerinfoEnterpriceContacts(CustomerinfoEnterpriceContactsServiceImpl.java:181) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:159) org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:309) org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) org.glassfish.jersey.internal.Errors.process(Errors.java:315) org.glassfish.jersey.internal.Errors.process(Errors.java:297) org.glassfish.jersey.internal.Errors.process(Errors.java:267) org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:292) org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1139) org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:454) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:334) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
解决方案
1. 排查依赖冲突
NoSuchMethodError本质是运行时类路径中存在旧版本的zxing javase包,覆盖了3.3.0版本。执行mvn dependency:tree查看依赖树,找出引入低版本zxing的依赖项,针对性排除。
2. 替换API实现
如果暂时无法解决依赖冲突,可改用兼容的文件写入方式,替代writeToPath方法:
package com.dataz.core; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; public class QrCodeUtil { public static boolean generateImageGenaric(String text, String filePath, Integer width, Integer height) throws WriterException, IOException { QRCodeWriter qrCodeWriter = new QRCodeWriter(); BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height); BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix); File outputFile = new File(filePath); ImageIO.write(bufferedImage, "PNG", outputFile); return true; } // main方法保持不变 }
3. 强制锁定依赖版本
在Maven配置中添加依赖排除,确保所有模块使用指定的zxing版本:
<dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.0</version> <exclusions> <exclusion> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency>
内容的提问来源于stack exchange,提问作者Saranga kapilarathna
相关产品推荐
相关产品推荐

