首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Maven 編譯快照版本時間戳導致依賴 JAR 包名稱不匹配的解決方案

     編輯:程式設計綜合問答

現象

`MANIFEST.MF` 中 Class-Path 引用 `storage-1.0-20131202.054649-56.jar`,但實際複製到 `lib/` 的是 `storage-1.0-SNAPSHOT.jar`,運行時 `ClassNotFoundException`。

根因

`maven-jar-plugin` 生成清單時使用唯一時間戳版本,而 `maven-dependency-plugin:copy-dependencies` 默認複製文件系統中的文件名(可能為非唯一快照)。兩者版本解析策略不一致。

解決方案

  1. 統一使用唯一快照版本(推薦):在部署到私服(Nexus/Artifactory)時啟用 `uniqueVersion=true`(默認),確保下載的 JAR 帶時間戳。本地開發需 `mvn clean install` 更新本地倉庫。
  2. 插件配置對齊:強制 `copy-dependencies` 使用項目構建輸出的 JAR:
    <plugin>
      <artifactId>maven-dependency-plugin</artifactId>
      <executions>
        <execution>
          <id>copy</id>
          <phase>package</phase> <!-- 改為 package,確保 jar 已生成 -->
          <goals><goal>copy-dependencies</goal></goals>
          <configuration>
            <outputDirectory>${project.build.directory}/lib</outputDirectory>
            <includeScope>runtime</includeScope>
            <useProjectArtifact>true</useProjectArtifact> <!-- 包含項目自身 JAR -->
          </configuration>
        </execution>
      </executions>
    </plugin>
    
  3. 避免快照依賴發布:發布版本(RELEASE)時務必移除 `-SNAPSHOT`,使用 `maven-release-plugin` 自動化版本管理。

排查技巧

執行 `mvn dependency:tree -Dverbose` 查看實際解析的版本;檢查 `target/lib/` 下文件名與 `MANIFEST.MF` Class-Path 是否完全一致。

Maven 快照版本時間戳導致 MANIFEST Class-Path 與複製 JAR 文件名不匹配,uniqueVersion 配置,dependency-plugin phase 對齊,發布版本移除 SNAPSHOT。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved