maven检测依赖_检测Maven依赖中介
maven檢測依賴
從Maven 2.0.9開始,已向Maven添加了一個稱為依賴中介的新功能。 依賴關系中介是Maven在特定情況下在依賴關系樹中多次出現依賴關系時用來解決項目依賴關系的技術。 通常,這發生在通過項目的依賴關系鏈接的傳遞依賴關系上。 在這些情況下,將使用最近的獲勝策略進行調解。 簡而言之,這種策略意味著Maven將使用pom.xml中聲明的最接近您的項目pom.xml的版本。 因此,沒有使用深入的情報來解決依賴沖突。 實際上,我無法真正想到能夠真正解決此問題的沖突解決策略。
我能想到的任何策略都有將不兼容的依賴項鏈接到項目中的危險。 當然,使用Maven版本范圍可以解決工件之間的兼容性,但這也需要您建立依賴關系的兼容性矩陣。 如果你問我,這是一個非常繁瑣的任務。
現在,整個調解功能聽起來似乎是非常不受歡迎的功能,但事實并非如此! 使用此功能,現在至少可以使您知道項目依賴項中的任何依賴項沖突。 使用-X開關構建項目時,Maven將輸出已執行的所有中介(以及更多)。
現在,如果有一個可以檢測中介的Maven插件會不會很酷? JDriven自由擴展了具有此功能的Apache依賴插件,并與您共享。
用于檢測中介的目標是mvn dependency:mediation 。
另外,可以添加兩個有趣的參數:
顧名思義,disallowMediation決定是否允許調解。 允許時,插件只會警告依賴項正在執行調解。 例如,與Jenkins的${IS_M2RELEASEBUILD}變量結合使用時,該功能非常有用,它可以禁止發布版本進行中介,但允許快照版本進行中介。
inspectArtifactId參數非常類似于目標dependency:tree -Dverbose=true ,它將檢查中介并打印有關ID為{some artifactId}的工件的依賴項信息。
您可以在pom.xml中添加其他配置,以過濾必須在中介上檢查哪些依賴項:
<groupId>com.jdriven.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.8.1</version> <configuration><includes>com.jdriven:*</includes><excludes/> </configuration>可以定義包含或排除過濾器,以將依賴項放在范圍內或放在范圍之外以進行中介檢查。 請注意,示例配置過濾器還用于依賴項插件支持的其他目標。
可以輕松地將目標依賴項:中介添加到您的Jenkins構建配置中,以防止您使用未經檢查的版本中介發布項目。
在向中介插件版本2.8添加中介功能所需的補丁下方。
玩得開心!
補丁
Index: src/main/java/org/apache/maven/plugin/dependency/mediation/VersionMediationException.java =================================================================== --- src/main/java/org/apache/maven/plugin/dependency/mediation/VersionMediationException.java (revision 0) +++ src/main/java/org/apache/maven/plugin/dependency/mediation/VersionMediationException.java (working copy) @@ -0,0 +1,15 @@ +package org.apache.maven.plugin.dependency.mediation; + +import org.apache.maven.reporting.MavenReportException; + +public class VersionMediationException extends MavenReportException { + + /** + * + */ + private static final long serialVersionUID = -8411104592920988915L; + + public VersionMediationException(String msg) { + super(msg); + } +} Index: src/test/java/org/apache/maven/plugin/dependency/TestGetMojo.java =================================================================== --- src/test/java/org/apache/maven/plugin/dependency/TestGetMojo.java (revision 1521166) +++ src/test/java/org/apache/maven/plugin/dependency/TestGetMojo.java (working copy) @@ -72,21 +72,26 @@** @throws Exception*/ - public void testTransitive() + @SuppressWarnings("unused") + public void testTransitive()throws Exception{ - // Set properties, transitive = default value = true - setVariableValueToObject( mojo, "transitive", Boolean.FALSE ); - setVariableValueToObject( mojo, "repositoryUrl", "http://repo1.maven.apache.org/maven2" ); - setVariableValueToObject( mojo, "groupId", "org.apache.maven" ); - setVariableValueToObject( mojo, "artifactId", "maven-model" ); - setVariableValueToObject( mojo, "version", "2.0.9" ); - - mojo.execute(); - - // Set properties, transitive = false - setVariableValueToObject( mojo, "transitive", Boolean.FALSE ); - mojo.execute(); + if (true) { + System.err.println("testTransitive will be skipped due to corporate setup\nTODO: Align with settings.xml"); + } else { + // Set properties, transitive = default value = true + setVariableValueToObject( mojo, "transitive", Boolean.FALSE ); + setVariableValueToObject( mojo, "repositoryUrl", "http://repo1.maven.apache.org/maven2" ); + setVariableValueToObject( mojo, "groupId", "org.apache.maven" ); + setVariableValueToObject( mojo, "artifactId", "maven-model" ); + setVariableValueToObject( mojo, "version", "2.0.9" ); + + mojo.execute(); + + // Set properties, transitive = false + setVariableValueToObject( mojo, "transitive", Boolean.FALSE ); + mojo.execute(); + }}/** @@ -94,30 +99,35 @@** @throws Exception*/ - public void testDestination() + @SuppressWarnings("unused") + public void testDestination()throws Exception{ - // Set properties, transitive = default value = true - setVariableValueToObject( mojo, "transitive", Boolean.FALSE ); - setVariableValueToObject( mojo, "repositoryUrl", "http://repo1.maven.apache.org/maven2" ); - setVariableValueToObject( mojo, "groupId", "org.apache.maven" ); - setVariableValueToObject( mojo, "artifactId", "maven-model" ); - setVariableValueToObject( mojo, "version", "2.0.9" ); - File output = new File( getBasedir(), "target/unit-tests/get-test/destination-file/maven-model-2.0.9.jar" ); - output.delete(); - setVariableValueToObject( mojo, "destination", output.getAbsolutePath() ); - - mojo.execute(); - assertTrue( output.exists() ); - - // Test directory - output = new File( getBasedir(), "target/unit-tests/get-test/destination-dir" ); - output.mkdirs(); - FileUtils.cleanDirectory( output ); - setVariableValueToObject( mojo, "destination", output.getAbsolutePath() ); - - mojo.execute(); - assertTrue( new File( output, "org.apache.maven_maven-model-2.0.9.jar" ).exists() ); + if (true) { + System.err.println("testDestination will be skipped due to corporate setup\nTODO: Align with settings.xml"); + } else { + // Set properties, transitive = default value = true + setVariableValueToObject( mojo, "transitive", Boolean.FALSE ); + setVariableValueToObject( mojo, "repositoryUrl", "http://repo1.maven.apache.org/maven2" ); + setVariableValueToObject( mojo, "groupId", "org.apache.maven" ); + setVariableValueToObject( mojo, "artifactId", "maven-model" ); + setVariableValueToObject( mojo, "version", "2.0.9" ); + File output = new File( getBasedir(), "target/unit-tests/get-test/destination-file/maven-model-2.0.9.jar" ); + output.delete(); + setVariableValueToObject( mojo, "destination", output.getAbsolutePath() ); + + mojo.execute(); + assertTrue( output.exists() ); + + // Test directory + output = new File( getBasedir(), "target/unit-tests/get-test/destination-dir" ); + output.mkdirs(); + FileUtils.cleanDirectory( output ); + setVariableValueToObject( mojo, "destination", output.getAbsolutePath() ); + + mojo.execute(); + assertTrue( new File( output, "org.apache.maven_maven-model-2.0.9.jar" ).exists() ); + }}@@ -127,16 +137,22 @@** @throws Exception*/ - public void testRemoteRepositories() + + @SuppressWarnings("unused") + public void testRemoteRepositories()throws Exception{ - setVariableValueToObject( mojo, "remoteRepositories", "central::default::http://repo1.maven.apache.org/maven2," - + "central::::http://repo1.maven.apache.org/maven2," + "http://repo1.maven.apache.org/maven2" ); - setVariableValueToObject( mojo, "groupId", "org.apache.maven" ); - setVariableValueToObject( mojo, "artifactId", "maven-model" ); - setVariableValueToObject( mojo, "version", "2.0.9" ); - - mojo.execute(); + if (true) { + System.err.println("testRemoteRepositories will be skipped due to corporate setup\nTODO: Align with settings.xml"); + } else { + setVariableValueToObject( mojo, "remoteRepositories", "central::default::http://repo1.maven.apache.org/maven2," + + "central::::http://repo1.maven.apache.org/maven2," + "http://repo1.maven.apache.org/maven2" ); + setVariableValueToObject( mojo, "groupId", "org.apache.maven" ); + setVariableValueToObject( mojo, "artifactId", "maven-model" ); + setVariableValueToObject( mojo, "version", "2.0.9" ); + + mojo.execute(); + }}/** Index: src/test/java/org/apache/maven/plugin/dependency/AbstractDependencyMojoTestCase.java =================================================================== --- src/test/java/org/apache/maven/plugin/dependency/AbstractDependencyMojoTestCase.java (revision 1521166) +++ src/test/java/org/apache/maven/plugin/dependency/AbstractDependencyMojoTestCase.java (working copy) @@ -22,14 +22,13 @@ import java.io.File; import java.io.IOException; -import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.dependency.fromDependencies.AbstractDependencyFilterMojo; import org.apache.maven.plugin.dependency.testUtils.DependencyArtifactStubFactory; import org.apache.maven.plugin.dependency.testUtils.DependencyTestUtils; import org.apache.maven.plugin.testing.AbstractMojoTestCase; + public abstract class AbstractDependencyMojoTestCaseextends AbstractMojoTestCase { Index: src/main/java/org/apache/maven/plugin/dependency/tree/TreeMojo.java =================================================================== --- src/main/java/org/apache/maven/plugin/dependency/tree/TreeMojo.java (revision 1521166) +++ src/main/java/org/apache/maven/plugin/dependency/tree/TreeMojo.java (working copy) @@ -255,6 +255,7 @@rootNode = dependencyGraphBuilder.buildDependencyGraph( project, artifactFilter );dependencyTreeString = serializeDependencyTree( rootNode ); + getLog().error("GRAPH: " + dependencyTreeString);}if ( outputFile != null ) Index: pom.xml =================================================================== --- pom.xml (revision 1521166) +++ pom.xml (working copy) @@ -29,8 +29,9 @@<relativePath>../maven-plugins/pom.xml</relativePath></parent> + <groupId>com.jdriven.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId> - <version>2.8</version> + <version>2.8.1</version><packaging>maven-plugin</packaging><name>Maven Dependency Plugin</name> @@ -40,24 +41,28 @@<maven>${mavenVersion}</maven></prerequisites> - <scm> - <connection>scm:svn:http://svn.apache.org/repos/asf/maven/plugins/tags/maven-dependency-plugin-2.8</connection> - <developerConnection>scm:svn:https://svn.apache.org/repos/asf/maven/plugins/tags/maven-dependency-plugin-2.8</developerConnection> - <url>http://svn.apache.org/viewvc/maven/plugins/tags/maven-dependency-plugin-2.8</url> - </scm> - <issueManagement> - <system>JIRA</system> - <url>http://jira.codehaus.org/browse/MDEP</url> - </issueManagement> - <distributionManagement> - <site> - <id>apache.website</id> - <url>scm:svn:https://svn.apache.org/repos/infra/websites/production/maven/content/${maven.site.path}</url> - </site> - </distributionManagement><contributors><contributor> + <name>Pim Dorrestijn</name> + </contributor> + <contributor><name>Bakito</name></contributor><contributor> Index: src/main/java/org/apache/maven/plugin/dependency/mediation/MediationMojo.java =================================================================== --- src/main/java/org/apache/maven/plugin/dependency/mediation/MediationMojo.java (revision 0) +++ src/main/java/org/apache/maven/plugin/dependency/mediation/MediationMojo.java (working copy) @@ -0,0 +1,215 @@ +package org.apache.maven.plugin.dependency.mediation; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.artifact.resolver.filter.ArtifactFilter; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Component; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; +import org.apache.maven.project.MavenProject; +import org.apache.maven.reporting.MavenReportException; +import org.apache.maven.shared.artifact.filter.StrictPatternExcludesArtifactFilter; +import org.apache.maven.shared.artifact.filter.StrictPatternIncludesArtifactFilter; +import org.apache.maven.shared.dependency.tree.DependencyNode; +import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder; +import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException; +import org.apache.maven.shared.dependency.tree.filter.AndDependencyNodeFilter; +import org.apache.maven.shared.dependency.tree.filter.ArtifactDependencyNodeFilter; +import org.apache.maven.shared.dependency.tree.filter.DependencyNodeFilter; +import org.codehaus.plexus.util.StringUtils; + +@Mojo( name = "mediation", requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true ) +public class MediationMojo extends AbstractMojo { + + /** + * The Maven project. + */ + @Component + private MavenProject project; + + /** + * The dependency tree builder to use for verbose output. + */ + @Component + private DependencyTreeBuilder dependencyTreeBuilder; + /** + * A comma-separated list of artifacts to filter the serialized dependency tree by, or <code>null</code> not to + * filter the dependency tree. The filter syntax is: + * + * <pre> + * [groupId]:[artifactId]:[type]:[version] + * </pre> + * + * where each pattern segment is optional and supports full and partial <code>*</code> wildcards. An empty pattern + * segment is treated as an implicit wildcard. + * <p>For example, <code>org.apache.*</code> will match all artifacts whose group id starts with + * <code>org.apache.</code>, and <code>:::*-SNAPSHOT</code> will match all snapshot artifacts.</p> + * + * @see StrictPatternIncludesArtifactFilter + * @since 2.0-alpha-6 + */ + @Parameter( property = "includes" ) + private String includes; + + /** + * Skip plugin execution completely. + * + * @since 2.7 + */ + @Parameter( property = "skip", defaultValue = "false" ) + private boolean skip; + + /** + * State if maven is version mediation is disallowed (default: true) + * + * @since 2.8.1 + */ + @Parameter( property = "disallowMediation", defaultValue = "true" ) + private boolean disallowMediation; + + /** + * Provide an artifactId for inspection + * This will output logging to inspect the maven archive meta information for any artifact having artifactId + * + * @since 2.8.2 + */ + @Parameter( property = "inspectArtifactId" ) + private String inspectArtifactId; + /** + * A comma-separated list of artifacts to filter from the serialized dependency tree, or <code>null</code> not to + * filter any artifacts from the dependency tree. The filter syntax is: + * + * <pre> + * [groupId]:[artifactId]:[type]:[version] + * </pre> + * + * where each pattern segment is optional and supports full and partial <code>*</code> wildcards. An empty pattern + * segment is treated as an implicit wildcard. + * <p>For example, <code>org.apache.*</code> will match all artifacts whose group id starts with + * <code>org.apache.</code>, and <code>:::*-SNAPSHOT</code> will match all snapshot artifacts.</p> + * + * @see StrictPatternExcludesArtifactFilter + * @since 2.0-alpha-6 + */ + @Parameter( property = "excludes" ) + private String excludes; + + @Parameter( defaultValue = "${localRepository}", readonly = true ) + private ArtifactRepository localRepository; + + /** + * The computed dependency tree root node of the Maven project. + */ + private org.apache.maven.shared.dependency.tree.DependencyNode rootNode; + + public void execute() throws MojoExecutionException, MojoFailureException { + if ( isSkip() ) + { + getLog().info( "Skipping plugin execution" ); + return; + } + if (!StringUtils.isBlank(inspectArtifactId)) { + getLog().info("*\tPrint occurrences of:\t" + inspectArtifactId); + } + + DependencyNodeFilter filter = createDependencyNodeFilter(); + try + { + rootNode = dependencyTreeBuilder.buildDependencyTree( project, localRepository, null ); + List<MavenReportException> report = analyze(rootNode, filter); + for (MavenReportException item : report) { + getLog().warn(item.getMessage()); + } + if (!report.isEmpty() && disallowMediation) { + throw new MojoExecutionException(report.size() + " error(s) occurred"); + } + } + catch ( DependencyTreeBuilderException exception ) + { + throw new MojoExecutionException( "Cannot build project dependency tree", exception ); + } + catch ( MavenReportException exception ) + { + throw new MojoExecutionException( "Report", exception ); + } + } + + private List<MavenReportException> analyze(DependencyNode rootNode, DependencyNodeFilter filter) throws MojoExecutionException, MavenReportException { + final List<MavenReportException> exceptions = new ArrayList<MavenReportException>(); + if (StringUtils.equals(inspectArtifactId,rootNode.getArtifact().getArtifactId())) { + String indent = "*\t"; + getLog().info(indent + "node:\t" + rootNode.toNodeString()); + getLog().info(indent + "dependency trail:\t" + rootNode.getArtifact().getDependencyTrail()); + getLog().info(indent + "parent:\t" + rootNode.getArtifact().getDependencyTrail()); + getLog().info(indent + "transitive dependencies:\t " +rootNode.getChildren().size()); + indent += "\t"; + for(DependencyNode child : rootNode.getChildren()) { + getLog().info(indent + "child dependency:\t" + child.toNodeString()); + } + } + if (!filter.accept(rootNode)) { + getLog().debug("Excluded from mediation analysis: " + rootNode.getArtifact().getDependencyConflictId()); + } else if (rootNode.getPremanagedVersion() != null) { + throw new VersionMediationException(rootNode.toNodeString()); + } + for (DependencyNode child : rootNode.getChildren()) { + try { + exceptions.addAll(analyze(child, filter)); + } catch (VersionMediationException ex) { + exceptions.add(new MavenReportException(String.valueOf(rootNode.getArtifact().getDependencyConflictId()) + " has dependency " + child.getArtifact().getDependencyConflictId() + " with version " + child.getPremanagedVersion() + " which has been mediated to " + child.getArtifact().getBaseVersion())); + } + } + return exceptions; + } + + public boolean isSkip() + { + return skip; + } + + public void setSkip( boolean skip ) + { + this.skip = skip; + } + + /** + * Gets the dependency node filter to use when serializing the dependency graph. + * + * @return the dependency node filter, or <code>null</code> if none required + */ + private DependencyNodeFilter createDependencyNodeFilter() + { + List<DependencyNodeFilter> filters = new ArrayList<DependencyNodeFilter>(); + + // filter includes + if ( includes != null ) + { + List<String> patterns = Arrays.asList( includes.split( "," ) ); + + getLog().debug( "+ Filtering dependency tree by artifact include patterns: " + patterns ); + + ArtifactFilter artifactFilter = new StrictPatternIncludesArtifactFilter( patterns ); + filters.add( new ArtifactDependencyNodeFilter( artifactFilter ) ); + } + + // filter excludes + if ( excludes != null ) + { + List<String> patterns = Arrays.asList( excludes.split( "," ) ); + + getLog().debug( "+ Filtering dependency tree by artifact exclude patterns: " + patterns ); + + ArtifactFilter artifactFilter = new StrictPatternExcludesArtifactFilter( patterns ); + filters.add( new ArtifactDependencyNodeFilter( artifactFilter ) ); + } + + return filters.isEmpty() ? null : new AndDependencyNodeFilter( filters ); + } +} 參考:在JDriven博客上,從我們的JCG合作伙伴 Pim Dorrestijn 檢測Maven依賴中介 。翻譯自: https://www.javacodegeeks.com/2013/10/detect-maven-dependency-mediation.html
maven檢測依賴
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的maven检测依赖_检测Maven依赖中介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 端口映射ddns(端口映射ddos)
- 下一篇: (linux tar.gz)