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