StackTraces
LangChain4j已驗證

LangChain4j 升級 1.x 報 ChatLanguageModel 找不到

@debug_master13 天前更新閱讀 6 min00

升級 LangChain4j 到 1.x 後編譯報 cannot find symbol: class ChatLanguageModel,這不是依賴沒引進來。1.x 統一了接口:ChatLanguageModel 改名成 ChatModel,generate(...) 改名成 chat(...)。改完名字還可能撞上第二個坑——core 升到 1.x,集成模塊還停在 0.x,編譯能過,運行期拋 NoClassDefFoundError。

Issue & Env(案發現場與環境)

  • 業務場景:項目從 LangChain4j 0.x 升到 1.x。升級後要麼 mvn compile 直接失敗,要麼編譯通過、啟動時報錯。
  • 環境:LangChain4j 1.x,langchain4j-core 與各 provider 模塊、第三方集成(quarkus-langchain4j)版本不一致,JDK 17。

StackTrace(堆疊日誌)

編譯期是 javac 的標準文案:

java: cannot find symbol
  symbol:   class ChatLanguageModel
  location: package dev.langchain4j.model.chat

運行期是 issue #2873 的原文,core 從 1.0.0-beta2 升到 beta3 時觸發:

java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
        [error]: Build step io.quarkiverse.langchain4j.deployment.AiServicesProcessor#watchResourceFiles threw an exception: java.lang.NoClassDefFoundError: dev/langchain4j/model/chat/TokenCountEstimator
        at io.quarkiverse.langchain4j.deployment.LangChain4jDotNames.<clinit>(LangChain4jDotNames.java:49)
        at io.quarkiverse.langchain4j.deployment.AiServicesProcessor.watchResourceFiles(AiServicesProcessor.java:942)

兩條報錯長得不一樣,指向同一類問題:一個是符號沒了,一個是類沒加載到。

Reproduce(復現程式碼)

第一種,直接沿用 0.x 寫法:

ChatLanguageModel model = OpenAiChatModel.builder()
        .apiKey(System.getenv("OPENAI_API_KEY"))
        .build();

Response<AiMessage> response = model.generate("你好");

ChatLanguageModel 與 generate 在 1.x 都不存在了。第二種是依賴版本參差:

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-core</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai</artifactId>
    <version>0.35.0</version>
</dependency>

core 是 1.x,provider 還是 0.x,兩代 API 拼在一起。

Root Cause(根因分析)

接口統一是源碼級改名

0.x 裡最常用的 ChatLanguageModel,在 1.x 統一成了 ChatModel;流式接口 StreamingChatLanguageModel 統一成 StreamingChatModel。方法名也換了:0.x 的 generate(...) 變成 chat(...),返回值從 Response<AiMessage> 變成 ChatResponse。

所以「找不到符號」是編譯器在說:這個名字在新的包結構裡已經沒有了,跟依賴有沒有下載下來無關。看到 cannot find symbol 就去查依賴,方向會偏。

core 與集成模塊版本不齊,運行期才炸

langchain4j-core 是底座,provider 模塊和第三方集成(Quarkus、Spring 擴展、社區 provider)都編譯在它之上。core 升到 1.x,某個模塊還停在 0.x 或 beta 版,編譯期往往看不出來:引用的符號可能在別處還在。問題留到運行期才暴露,表現為 NoClassDefFoundError 或 NoSuchMethodError。

issue #2873 就是這個形態。core 從 1.0.0-beta2 升到 1.0.0-beta3,類 TokenCountEstimator 被移除,Quarkus 擴展啟動時去加載它,直接拋 NoClassDefFoundError。注意這是同一個大版本內的 beta 升級,說明 patch/minor 升級也可能刪類。

The Fix(解決方案)

先確認是不是改名。全局搜 ChatLanguageModel 和 generate(,按 1.x 寫法替換:

// 1.x 写法
ChatModel model = OpenAiChatModel.builder()
        .apiKey(System.getenv("OPENAI_API_KEY"))
        .build();

ChatResponse response = model.chat("你好");

流式側對應改成 StreamingChatModel,用 chat(...) 的重載。

再治版本參差。用 langchain4j-bom 統一版本,別逐個手寫:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-bom</artifactId>
            <version>1.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

然後檢查有沒有多個 langchain4j 版本混進來:

mvn dependency:tree -Dincludes=dev.langchain4j

Gradle 用:

./gradlew dependencies | grep langchain4j

輸出裡出現兩個及以上版本號,就是參差的源頭。把 core、各 provider、第三方集成版本對齊到同一代。具體版本號去 Maven Central 核對。

最後一條經驗:升級前讀 release notes。core 的小版本也可能刪類,beta2→beta3 就刪掉了 TokenCountEstimator。可參考 1.0.0 release notes。

小結

  • 編譯報 ChatLanguageModel 找不到,是 1.x 改名,改成 ChatModel / chat(...)。
  • 版本不齊的報錯在運行期,表現為 NoClassDefFoundError / NoSuchMethodError。
  • 用 langchain4j-bom 統一版本,dependency:tree 查重複版本。
  • core 的小版本升級也可能刪類,升級前必讀 release notes。

References(參考來源)

最後更新於 2026-09-28

這篇幫到你了嗎?

剛解決了一個棘手的報錯?花兩分鐘記錄下來,幫助下一個遇到同樣問題的開發者。

貢獻一條解法