需求
我們需要分析一個項目的相關依賴,評估對其改動的影響點。工具可以輔助開發人員評估影響點,畫出依賴樹
解決方案
方案1
直接對項目執行mvn dependency:tree 然後對結果進行
優點:maven官方工具可靠穩定
缺點:如果想要線上服務化需要對線上伺服器配置maven。服務強依賴maven生成的依賴樹檔案。并且通過執行shell指令後要開發人員編寫分析maven輸出檔案的代碼,如果檔案結構因為更新發現變化或者改變會影響分析結果。
方案2
服務自動解析項目的pom分析
優點:通過解析pom檔案傳回對象,反序列化為對象,更容易分析。服務隻需要關系抽象對象間的關心分析,不需要關心pom反序列化的過程。解耦pom與依賴分析服務
缺點:非官方工具,分析結果的準确性、穩定性需要多觀察注意,避免bug引起的錯誤分析導緻評估遺漏出現盲區。
shrinkwrap-resolver使用
pom依賴
<dependency>
<groupId>org.jboss.shrinkwrap.resolver</groupId>
<artifactId>shrinkwrap-resolver-depchain</artifactId>
<version>${version.shrinkwrap.resolvers}</version>
<type>pom</type>
</dependency>
// 擷取依賴時需要使用該依賴
<dependency>
<groupId>org.jboss.shrinkwrap.resolver</groupId>
<artifactId>shrinkwrap-resolver-impl-maven</artifactId>
<version>${version.shrinkwrap.resolvers}</version>
</dependency>
// 1. 加載并解析pom檔案
MavenResolveStageBase<PomEquippedResolveStage, MavenStrategyStage, MavenFormatStage> mavenResolveStageBase = Maven.resolver()
.loadPomFromFile(pomPath);
// 2. 擷取依賴
MavenWorkingSession session = ((MavenWorkingSessionContainer) mavenResolveStageBase).getMavenWorkingSession();
Set<MavenDependency> mavenDependencies = session.getDependencyManagement();
問題
出現如下警告與報錯,解析失敗。
警告是未能在maven2資源庫中找到父pom的maven-metadata.xml。
報錯比較明顯指出了對于jdk tools的依賴需要制定絕對路徑。
一月 16, 2020 6:42:25 下午 org.jboss.shrinkwrap.resolver.impl.maven.logging.LogTransferListener transferFailed
警告: Failed downloading com/.../dispatch/dispatch-parent/3.0.0-SNAPSHOT/maven-metadata.xml from https://repo1.maven.org/maven2/. Reason:
org.eclipse.aether.transfer.MetadataNotFoundException: Could not find metadata com.....dispatch:dispatch-parent:3.0.0-SNAPSHOT/maven-metadata.xml in central (https://repo1.maven.org/maven2)
一月 16, 2020 6:42:26 下午 org.jboss.shrinkwrap.resolver.impl.maven.logging.LogTransferListener transferFailed
警告: Failed downloading com/.../wireless/parent/3.2.0-SNAPSHOT/maven-metadata.xml from https://repo1.maven.org/maven2/. Reason:
org.eclipse.aether.transfer.MetadataNotFoundException: Could not find metadata com.....wireless:parent:3.2.0-SNAPSHOT/maven-metadata.xml in central (https://repo1.maven.org/maven2)
Exception in thread "main" org.jboss.shrinkwrap.resolver.api.InvalidConfigurationFileException: Found 1 problems while building POM model from D:\git\...\dispatch\dispatch-grafana-service\dispatch-grafana-service-server\pom.xml
1/ [ERROR] 'dependencyManagement.dependencies.dependency.systemPath' for jdk.tools:jdk.tools:jar must specify an absolute path but is ${JAVA_HOME}/lib/tools.jar @ com.....dispatch:dispatch-grafana-service-server:1.0-SNAPSHOT, D:\git\...\dispatch\dispatch-grafana-service\dispatch-grafana-service-server\pom.xml
解決方法
排除maven中心資源庫;在setting檔案中增加JAVA_HOME變量的配置。上面的報錯也提醒我們再pom配置中應該盡量使用maven提供的内置變量而非自定義變量,父類中的jdk路徑的配置可以修改為:${java.home}。
修改後的代碼
MavenResolveStageBase<PomEquippedResolveStage, MavenStrategyStage, MavenFormatStage> mavenResolveStageBase = Maven.configureResolver()
// 1. 排除maven中心資源庫
.withMavenCentralRepo(false)
// 2. 從resource中讀取setting檔案(相對路徑)
.fromClassloaderResource(settingPath)
// 3. 讀取解析pom檔案
.loadPomFromFile(pomPath);
// 4. 擷取依賴
MavenWorkingSession session = ((MavenWorkingSessionContainer) mavenResolveStageBase).getMavenWorkingSession();
Set<MavenDependency> mavenDependencies = session.getDependencyManagement();
pom增加JAVA_HOME配置
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
// JAVA_HOME 變量配置
<JAVA_HOME>C:\Program Files (x86)\Java\jdk1.8.0_73</JAVA_HOME>
</properties>
</profile>
至此解析依賴成功
[...MavenDependency [org.springframework.security:spring-security-acl:jar:4.2.9.RELEASE:compile],
MavenDependency [org.springframework.security:spring-security-aspects:jar:4.2.9.RELEASE:compile],
MavenDependency [org.springframework.security:spring-security-cas:jar:4.2.9.RELEASE:compile],
MavenDependency [org.springframework.security:spring-security-config:jar:4.2.9.RELEASE:compile],
MavenDependency [org.springframework.security:spring-security-core:jar:4.2.9.RELEASE:compile],
MavenDependency [org.springframework.security:spring-security-crypto:jar:4.2.9.RELEASE:compile],
MavenDependency [org.springframework.security:spring-security-data:jar:4.2.9.RELEASE:compile],
MavenDependency [org.springframework.security:spring-security-ldap:jar:4.2.9.RELEASE:compile],
MavenDependency [org.springframework.security:spring-security-messaging:jar:4.2.9.RELEASE:compile],
MavenDependency [org.springframework.security:spring-security-openid:jar:4.2.9.RELEASE:compile],
MavenDependency [org.springframework.security:spring-security-remoting:jar:4.2.9.RELEASE:compile],
MavenDependency [org.springframework.security:spring-security-taglibs:jar:4.2.9.RELEASE:compile],
MavenDependency [org.springframework.security:spring-security-test:jar:4.2.9.RELEASE:compile],
MavenDependency [org.springframework.security:spring-security-web:jar:4.2.9.RELEASE:compile],
MavenDependency [com.dianwoba.dispatch:dispatch-grafana-service-impl:jar:1.0-SNAPSHOT:compile],
MavenDependency [org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-depchain:pom:3.1.3:test]]
總結
shrinkwrap-resolver不僅可以幫助我們解析pom依賴,還可以實作打包上傳部署等功能。并且項目提供了内嵌的Maven可以直接執行maven指令。功能很強大,相關使用可以直接檢視官方文檔均有詳細的解釋與使用案例
還有一點應該注意的是在pom中應當盡量使用maven内置的參數定義,例如:${java.home}而不是${JAVA_HOME}