文章目錄
- 1、背景
- 2、解決
- 3、一點思考
- 4、環境升級導致AOP失效
- 5、okhttp Bean找不到
- 6、總結
記錄一些Maven依賴相關的思考
1、背景
做一個監控指標收集,用一下jna依賴:
<dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>${dev.jna.version}</version><!-- <dev.jna.version>5.12.1</dev.jna.version> -->
</dependency>
發現采集失敗,根據錯誤信息,懷疑是依賴問題:
mvn dependency:tree | grep jna
根據返回結果,發現elastic search的依賴種也有用到jna,依賴沖突了
2、解決
首先想到直接排除依賴
<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><exclusions><!-- 排除 Elasticsearch 自帶的舊版 JNA --><exclusion><groupId>org.elasticsearch</groupId><artifactId>jna</artifactId></exclusion></exclusions>
</dependency>
寫完發現,這個jna坐標還是es自己的,應該是es自己做了一些二次開發和補丁,這樣直接排除,大概率ES自身的功能要受影響,于是,考慮:
- 升級整個 Elasticsearch 依賴版本,使其自帶的jna和我需要的版本不再沖突
- 選擇一個jna的版本,兼容ES
最后,打開官方倉庫:https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch/7.17.28,升級ES到7.17.28版本,并且父pom里管理下版本
<dependencyManagement><dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>${dev.jna.version}</version><!-- <dev.jna.version>5.12.1</dev.jna.version> --></dependency>
</dependencyManagement>
3、一點思考
排除依賴前,考慮下影響,比如:
-
版本不兼容問題:要是引入的其他 JNA 版本和 Elasticsearch 不兼容,可能會出現NoClassDefFoundError、LinkageError等錯誤
-
功能缺失情況:對于這種二開依賴的,更要注意換依賴后原來的一些二開的補丁功能丟失的問題
4、環境升級導致AOP失效
系統近來在做升級,JDK從8升級到了JDK 17,相應的SpringBoot和SpringCloud版本也在更新迭代,升級后,新開發了一個AOP,結果發現一直不生效,首先排除常見的原因,比如:
- 方法是private,代理失敗
- 內部調用
- 沒有enable AOP功能
等等,因為之前的AOP功能都是正常的,因此考慮是否是版本升級導致:搜索相關依賴,發現有aspectjweaver依賴,但沒有spring-boot-starter-aop依賴,回到升級前,發現aop的依賴在open-feign里:
openfeign-core,在3.1.0是有aop依賴的,但升級到4.2.1版本后,aop不再包含了
因此,需要額外手動引入下spring-boot-starter-aop依賴
5、okhttp Bean找不到
同樣的,升級后,服務啟動報錯okhttp Bean找不到了
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>${okhttp3.version}</version></dependency>
升級前,版本是3.14.9,搭配下面這配置
spring:cloud:openfeign:okhttp:enabled: true
升級后,啟動發現okhttp Bean找不到,升級了下依賴版本解決
<okhttp3.version>4.12.0</okhttp3.version>
6、總結
依賴大升級,比如從2.x到3.x,一些API和核心類難免會被重構優化,此時,就會導致一些類找不到、原本包含的依賴升級后需要你自己引入一下、版本沖突導致一些自動裝配失效等等一系列的問題,注意兼容和影響范圍