You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:21:58