场景:
项目A依赖项目B,此时项目A可以正常构建,当我修改项目B后,并将B项目Deploy到私服,本地正常运行。

此时再次使用Jenkins构建项目A,构建失败。

报错信息如下:

1

2

3

4

5

6

[INFO] -------------------------------------------------------------

[ERROR] COMPILATION ERROR :

[INFO] -------------------------------------------------------------

[ERROR] /var/jenkins_home/workspace/aaa-aaa/src/main/java/com/aaa/aaa/aaa/aaa/aaa/aaa.java:[367,24] cannot find symbol

symbol:   method setRoomName(java.lang.String)

location: variable aaaDTO of type com.aaa.aaa.aaa.domain.dto.AaaDTO

原因:
Jenkins项目配置的使用本地仓库,本地仓库中的jar是旧版本,当Jenkins编译时,在本地仓库找到就直接纳入项目了。

除非本地仓库没有找到,才会去远程仓库拉取。所以构建A时,老的jar没有新版本中新增的内容,导致编译出错。

解决方法(心急的帅哥直接看最后一种方法):
方法一:Jenkins手动清除旧的依赖,缓存
每次部署项目前:

1、进入容器内部。

2、进入本地仓库。

3、将有变动的依赖删除掉,或者简单一点,把所有的依赖都删除。

方法二:项目配置中增加构建前脚本

写脚本将本地仓库依赖清空,每次构建项目前都先清空一下。
这种方法和第一种方法差不多,一个是手动挡,一个是自动挡,本质上还是使用Jenkins中本地仓库,大家应该都喜欢自动挡吧。

方法三:修改Jenkins中maven配置文件。(未测试,仅仅记录一下)
修改~/.m2/settings.xml 或/opt/maven/conf/settings.xml文件,
添加 <updatePolicy>always</updatePolicy>,强制每次都更新依赖库。

        <repositories>
                <repository>
                        <id>central</id>
                        <url>http://central</url>
                        <releases>
                                <enabled>true</enabled>
                                <updatePolicy>always</updatePolicy>
                        </releases>
                        <snapshots>
                                <enabled>true</enabled>
                                <updatePolicy>always</updatePolicy>
                        </snapshots>
                </repository>
        </repositories>


方法四:强制使用远程仓库中最新的依赖(推荐)
这种方法就没有本地仓库什么事儿了,不会对本地仓库有任何CRUD操作,完全使用私服中的依赖,不存在旧的jar。

系统管理–maven项目配置–local maven Reposiory 选择Loacl to the workspace。OK。 

测试:
现在本地仓库是老的依赖包,我更改系统配置后,构建一下项目。

没毛病。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐