.lastUpdated文件出现的原因
  1. jar包自身的问题(groupId发生改变或artifactId改变,所需要的版本不存在等),这是最重要的一点,很多人找了半天问题,最后才发现自己找的jar本来就不存在。
  2. 网络问题,无法下载对应的jar。
  3. maven中setting配置的中央仓库镜像出现问题,没有生效或镜像已失效。
解决办法
  1. 删除.lastUpdated文件,切换网络(可选择手机热点)重新下载。
  2. 直接访问 阿里云云效 Maven进行文件搜索,根据groupId和artifactId查看是否能找到对应版本的jar包(找到则可以直接下载对应的jar包和pom.xml文件)。
  3. 直接访问中央仓库源地址或找到自己maven的setting文件中配置的中央仓库镜像,根据jar包的目录结构找到自己需要的jar包和pom.xml。
  4. 直接访问 mvnrepository搜索自己需要的版本的jar包,选择 View All 进行下载jar包和pom.xml文件。
总结

.lastUpdated文件出现的原因一般考虑 jar包自身问题网络问题maven配置问题(镜像,未生效等问题);
而我们的解决办法也是针对这些问题进行解决,首先确认jar本身是否存在,其次是通过一切手段拿到需要的jar,最后才是 解决可能存在的环境问题,防范问题下次继续出现。

.lastUpdated

maven从私服下载依赖包时如果失败会形成 *.lastUpdated文件,这种文件使得再次下载时不会再去私服中下载。

出现 *.lastUpdated文件 多半是因为网络问题。也有可能是mirror地址有问题。

windows系统

cd %userprofile%\.m2\repository
for /r %i in (*.lastUpdated) do del %i

linux系统

find /app/maven/localRepository -name "*.lastUpdated" -exec grep -q "Could not transfer" {} \; -print -exec rm {} \;

setting设置每次更新缓存

<repository>
  <id>central</id>
  <url>http://maven.aliyun.com/nexus/content/groups/public</url>
  <releases>
      <enabled>true</enabled>
      <updatePolicy>always</updatePolicy>
  </releases>
  <snapshots>
      <enabled>false</enabled>
      <updatePolicy>always</updatePolicy>
  </snapshots>
</repository>

打包更新

mvn -U clean package -Dmaven.test.skip=true

lib放jar包

<dependency>
    <groupId>abc</groupId>
    <artifactId>abc</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/abc.jar</systemPath>
</dependency>

配置本地仓库

<repositories>
        <repository>
            <id>oss</id>
            <url>file:D:\apache-maven-3.6.3\localRepo</url>
        </repository>
</repositories>

maven配置

-Xmx768m -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

清理脚本

@echo>nul 2>nul @author: muyua

cls
@echo off
color 0A
title 清理maven仓库冗余文件
chcp 936>nul 2>nul
set lastUpdatedFileName=*.lastUpdated *m2e-lastUpdated.properties
::默认的maven本地仓库路径
set defaultRepoPath=D:\Software\apache-maven\mavenRepo
::%1获取拖动文件夹的路径
set pathVar=%1
if "%pathVar%" neq "" set defaultRepoPath=%pathVar%

::设置maven本地仓库地址
echo.
echo *--------------------------------------------------------------------------*
echo *                                  初始化                                  *
echo *--------------------------------------------------------------------------*
echo * 路径设置提示:                                                           *
echo *   1.拖拽maven本地仓库到bat批处理文件上执行脚本,会修改本地仓库默认路径   *
echo *   2.将你的maven本地仓库文件夹拖拽到cmd窗口,可以完成其路径输入           *
echo *   3.输入0,直接使用批处理文件所在的路径                                  *
echo *   4.使用默认路径,可以回车跳过                                           *
echo *--------------------------------------------------------------------------*
echo.
echo 默认的maven本地仓库路径:%defaultRepoPath%
echo.
set /p repoPath="请输入你的maven仓库路径:"

if "%repoPath%" equ "" (
    set repoPath=%defaultRepoPath%
) else (
    if "%repoPath%" equ "0" set repoPath=%~dp0
)
echo 您输入的maven仓库路径:%repoPath%

pause
goto menu

:menu 打印菜单目录
cls
echo maven仓库路径:%repoPath%
echo.
echo *---------------------------------------------*
echo *            清理maven仓库冗余文件            *
echo *---------------------------------------------*
echo * 【0】修改输入的maven仓库路径                *
echo * 【1】查看未完全下载的Jar包文件              *
echo * 【2】查看空文件夹                           *
echo * 【3】删除未完全下载的Jar包文件              *
echo * 【4】删除空文件夹                           *
echo * 【5】退出程序                               *
echo *请选择^<0-5^>进行操作                          *
echo *---------------------------------------------*

set /p id=
if /i "%id%"=="0" goto updateRepoPath
if /i "%id%"=="1" goto findLastUpdated
if /i "%id%"=="2" goto findEmptyFolder 
if /i "%id%"=="3" goto delLastUpdated
if /i "%id%"=="4" goto delEmptyFolder
if /i "%id%"=="5" exit
pause
goto menu

:updateRepoPath 修改输入的maven仓库路径
cls
set /p repoPathTemp="请输入你的maven仓库路径(回车返回菜单页面,输入0恢复默认路径):"
if "%repoPathTemp%" equ "" goto menu
if "%repoPathTemp%" equ "0" set repoPathTemp=%defaultRepoPath%
set repoPath=%repoPathTemp%
echo 已更新maven仓库路径:%repoPath%
set repoPathTemp=
pause
goto menu

:findLastUpdated 查看未完全下载的Jar包文件 
cls
cd /d %repoPath%
for /r %%i in (%lastUpdatedFileName%) do echo %%i
echo OK
pause 
goto menu

:findEmptyFolder 查看空文件夹
cls
cd /d %repoPath%
echo 读取空文件夹列表中...
echo 遍历文件需要时间,请稍等...
for /f "delims=" %%i in ('dir /ad/b %repoPath%\*') do (
    set xh=0
    for /f "delims=" %%a in ('dir /s/b "%repoPath%\%%i"') do if not "%%~nxa"=="" set xh=1
    if !xh! == 0 (
        echo %%~dpni
    )
)
echo OK
pause 
goto menu

:delLastUpdated 删除未完全下载的Jar包文件
cls
cd /d %repoPath%
for /r %%i in (%lastUpdatedFileName%) do del %%i && echo 正在删除%%i
echo 删除操作完成,OK
pause 
goto menu

:delEmptyFolder 删除空文件夹
cls
cd /d %repoPath%
echo 开始遍历...
for /f "delims=" %%a in ('dir /ad /b /s %repoPath% ^| sort /r') do (
    rd "%%~a">nul 2>nul & echo %%~a
)
echo 删除操作完成,OK
pause 
goto menu

保存为bat格式

ClassNotFound

  • 引用外部lib

通过<scope>system</scope>依赖本地jar包

在使用Maven的时候,如果我们要依赖一个本地的jar包的时候,通常都会使用system来处理。
例如:

//引用本地jar包

<dependency>
    <groupId>com.mytest</groupId>
    <artifactId>test</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${pom.basedir}/lib/test-1.0.jar</systemPath>
</dependency>

如果你仅仅是这么做了,在你使用SpringBoot打包插件生成jar包的时候,你会发现这个jar包不会被打进去,进而出现错误。
这个就需要在maven插接中配置一个includeSystemScope属性:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <!--设置为true,以便把本地的system的jar也包括进来-->
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>