从git或者svn上拉取了项目,然后as a meven project 后发现文件中有红色无法导入的问题,是不是这种现象经常遇到。
嗯,没有错,这个可能是同事提交的时候没有测试,提交了错误的依赖,也可能是你因为网络原因确实没有拉下来。
在这里总结下可能遇到的几种情况。
可能是依赖包确实有问题。例如多添加了一个字母,版本错误等等。可以使用maven仓库验证下。
验证地址:https://mvnrepository.com/
举个栗子:
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poiartifactId>
<version>3.14version>
dependency>
打开连接地址,输入poi查询,可以对查询到的结果点击查看。
这个有就可以确认依赖的groupId,artifactId和version是没有问题的。
因为大家使用的Maven版本不同,IDEA对Maven支持的也不同,我这里使用的2018.3版本就无法支持最新的Maven版本。
可以根据IDEA下载的时候支持的那个版本,之后的版本可能是无法支持的。
具体Maven下载地址:https://maven.apache.org/download.cgi
我们在开发的时候经常会使用内部封装的一些包,例如一些通用的工具包,假如我们使用了公用的Maven仓库无法拉取到这些包。
一般我们配置开发环境的时候会配置公司的私有库,我们可以打开下载解压的maven配置文件:
maven是免安装的,解压配置即可:
我放在D:/soft下,打开setting文件修改,例如:
<localRepository>D:\mvnrepositorieslocalRepository>
<servers>
<server>
<id>releasesid>
<username>adminusername>
<password>adminpassword>
server>
<server>
<id>snapshotsid>
<username>adminusername>
<password>adminpassword>
server>
servers>
<mirrors>
<mirror>
<id>nexusid>
<url>http://xx.xx.xx.xx:xx/url>
<mirrorOf>centralmirrorOf>
mirror>
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
注意: 要把公司的私有库放阿里云上面。
假如刚才公司不知道公司私有库,就去找同事问下。
对于
假如可以访问成功,就证明maven依赖库本地是可以访问公司私有库,也就是网络没啥问题。
当我们拉取jar包失败的时候,本地库就会生成lastUpdated 文件。
拉取成功的使用可以在本地仓库中查看到jar包。
查看的路径和groupId,artifactId和version有关。通常是 setting 文件中的地址 加上 groupId,artifactId 和 version。
例如fastJson , D:\mvnrepositories + com + alibaba + fastjson + version
拉取失败的情况:
删除lastUpdated 可以挨个查找,假如多个依赖有问题的话,查找删除太麻烦。
也可以全部依赖库删除再重新拉取,但是多次拉取耗费时间过长。
bat脚本删除:
set REPOSITORY_PATH=D:\mvnrepositories
rem 正在搜索...
for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
del /s /q %%i
)
rem 搜索完毕
pause
新建txt文件,ctrl + v 放入脚本,修改扩展名为 .bat。
其中 REPOSITORY_PATH 后的地址是 setting 文件
脚本来自 https://blog.csdn.net/qq_36095679/article/details/97271879,具体细节可以访问查看。
推荐软件everything, 下载地址 https://www.voidtools.com/zh-cn/。
安装后可以对lastUpdated 检索,比windows自带检索速度快。
删除完成之后再次maven reimport。
使用 IDEA 推荐插件 maven helper 对maven的操作比较友好。
点击项目右键执行:
假如以上的方案都不行怎么办。我们还有终极解决方案 : pom system 依赖。
也是依赖第三方的jar包的方案解决方案:
新增 scope 为 system
scope 的依赖传递规则为,其中 system 与 provider 一致 在编译和测试时有效:
修改示例:
<dependency>
<groupId>com.xx.xxgroupId>
<artifactId>xx-xxartifactId>
<version>15.8.0version>
<scope>systemscope>
<systemPath>${project.basedir}/lib/xx.jarsystemPath>
dependency>
点击 File 选择 Project Structure 修改项目设置:
选择 + ==> Java 找到 项目下jar包,之后添加即可。
增加的时候,可以选择source或者classes,好像两种都可以,这个不太确定。
4. pom文件插件打包配置
以上1-3就可以解决本地无法运行的问题,但是还是无法打包,这个时候就需要在pom文件 builder中配置。
<resources>
<resource>
<directory>${project.basedir}/libdirectory>
<targetPath>/BOOT-INF/lib/targetPath>
<includes>
<include>**/*.jarinclude>
includes>
resource>
resources>
5、补充(20230316)
假如我们有存在第三方包放在commons公共依赖组件中,隔了一层上面的打包方式就会失效,这里SpringBoot 配置可以增加配置:
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<includeSystemScope>trueincludeSystemScope>
configuration>
plugin>
includeSystemScope 见名知意就是把system scope依赖内容打进来。
关于lastUpdated 问题,也就是无法从私服拉取jar包,可能由于网络原因下载失败,按照原来的访问删除重新拉取即可。
特别注意
也存在一种情况,私服的jar包本身就没有pom文件,所以怎么拉取都会失败!!!!!!
也就导致pom文件依赖再拉取都会不成功!
xxxx-15.8.0.jar
xxxx-15.8.0.jar.lastUpdated
xxxx-15.8.0.jar.sha1
xxxx-15.8.0.pom.lastUpdated
这种情况可以通过 pom system 依赖 进行配置。
在配置 systemPath 时候从项目根路径出发,IDEA 开发会提示路径。
使用 maven 进行打包的时候注意 使用上述 build 进行配置。
<resources>
<resource>
<directory>${project.basedir}/libdirectory>
<targetPath>/BOOT-INF/lib/targetPath>
<includes>
<include>**/*.jarinclude>
includes>
resource>
resources>
扩展
${project.basedir} 代表项目的路径,以上配置也就是把lib下所有jar 放到 /BOOT-INF/lib 下。
也可以尝试放到resources下,示例:
${project.basedir}/lib 替换为 ${project.basedir}/src/main/resources/lib
打包之后,所有使用到jar包可以传递。
如何判断是否没有pom文件,具体可以解压查看jar包的情况。