天天看點

shrinkwrap-resolver解析pom依賴需求解決方案shrinkwrap-resolver使用總結

需求

我們需要分析一個項目的相關依賴,評估對其改動的影響點。工具可以輔助開發人員評估影響點,畫出依賴樹

解決方案

方案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}