当前位置: 首页 > 知识库问答 >
问题:

查看dependencyManagement的依赖关系树

邹锦
2023-03-14

我们都知道依赖树对于解决可传递依赖冲突至关重要。对于依赖关系管理,情况也是如此,但我找不到一种方法,可以像依赖关系那样打印依赖关系树。

有没有插件或其他东西可以帮助你?

Maven版本:3.2.3

编辑

对于认为这个问题与另一个问题重复的人,请考虑:

>

  • 另一个问题是关于依赖关系管理的插件管理。

    另一个问题与生成依赖关系树无关。

  • 共有1个答案

    齐昊苍
    2023-03-14

    我找不到任何打印依赖关系管理部分的依赖关系树的插件。

    但是,你可以为此编写自己的魔咒。下面的所有代码都是用Maven 3.3.9编写和测试的,通过修改新MOJO的依赖项,可以很容易地使其适应当前的Maven版本。

    以下是Maven插件的POM:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>sample.plugin</groupId>
        <artifactId>test-maven-plugin</artifactId>
        <version>1.0.0</version>
        <packaging>maven-plugin</packaging>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.apache.maven</groupId>
                <artifactId>maven-plugin-api</artifactId>
                <version>3.3.9</version>
            </dependency>
            <dependency>
                <groupId>org.apache.maven.plugin-tools</groupId>
                <artifactId>maven-plugin-annotations</artifactId>
                <version>3.4</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.maven</groupId>
                <artifactId>maven-core</artifactId>
                <version>3.3.9</version>
            </dependency>
        </dependencies>
    </project>
    

    而魔咒本身就是:

    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    import org.apache.maven.artifact.Artifact;
    import org.apache.maven.artifact.DefaultArtifact;
    import org.apache.maven.artifact.handler.ArtifactHandler;
    import org.apache.maven.execution.MavenSession;
    import org.apache.maven.model.Dependency;
    import org.apache.maven.model.building.ModelBuildingRequest;
    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.DefaultProjectBuildingRequest;
    import org.apache.maven.project.MavenProject;
    import org.apache.maven.project.ProjectBuilder;
    import org.apache.maven.project.ProjectBuildingException;
    import org.apache.maven.project.ProjectBuildingRequest;
    import org.eclipse.aether.transfer.ArtifactNotFoundException;
    
    @Mojo(name = "foo", requiresDependencyResolution = ResolutionScope.TEST)
    public class MyMojo extends AbstractMojo {
    
        @Parameter(defaultValue = "${project}", readonly = true, required = true)
        private MavenProject project;
    
        @Parameter(defaultValue = "${session}", readonly = true, required = true)
        private MavenSession session;
    
        @Component
        private ArtifactHandler artifactHandler;
    
        @Component
        private ProjectBuilder projectBuilder;
    
        public void execute() throws MojoExecutionException, MojoFailureException {
            Set<Artifact> visitedArtifacts = new HashSet<Artifact>();
            for (Dependency dependency : project.getDependencyManagement().getDependencies()) {
                printDependencyTree(toArtifact(dependency), "", visitedArtifacts);
            }
        }
    
        private void printDependencyTree(Artifact artifact, String level, Set<Artifact> visitedArtifacts) throws MojoExecutionException {
            getLog().info(level + "+ " + artifact);
            for (Dependency transitive : getTransitiveDependencies(artifact)) {
                Artifact transitiveArtifact = toArtifact(transitive);
                if (!visitedArtifacts.contains(transitiveArtifact)) {
                    visitedArtifacts.add(transitiveArtifact);
                    printDependencyTree(transitiveArtifact, level + "  ", visitedArtifacts);
                }
            }
        }
    
        private List<Dependency> getTransitiveDependencies(Artifact artifact) throws MojoExecutionException {
            try {
                ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest(session.getProjectBuildingRequest());
                buildingRequest.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
                buildingRequest.setProject(null);
                MavenProject mavenProject = projectBuilder.build(artifact, buildingRequest).getProject();
                return mavenProject.getDependencies();
            } catch (ProjectBuildingException e) {
                if (e.getCause() != null && e.getCause().getCause() instanceof ArtifactNotFoundException) {
                    //ignore
                    return new ArrayList<Dependency>();
                }
                throw new MojoExecutionException("Error while building project", e);
            }
        }
    
        private Artifact toArtifact(Dependency dependency) {
            return new DefaultArtifact(dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion(), dependency.getScope(), dependency.getType(), dependency.getClassifier(), artifactHandler);
        }
    
    }
    

    这有点复杂,但主要成分是:

    • 我们被注入到当前的Maven项目中,我们在依赖关系管理部分用project解决依赖关系。getDependencyManagement()。getDependencies()

    作为示例,我用下面的依赖关系管理部分测试了这一点

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-annotations</artifactId>
                <version>3.4.0.GA</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

    结果是:

    + org.hibernate:hibernate-annotations:jar:3.4.0.GA
      + org.hibernate:ejb3-persistence:jar:1.0.2.GA:compile
      + org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA:compile
        + org.slf4j:slf4j-api:jar:1.4.2:compile
          + junit:junit:jar:3.8.1:test
      + org.hibernate:hibernate-core:jar:3.3.0.SP1:compile
        + antlr:antlr:jar:2.7.6:compile
        + commons-collections:commons-collections:jar:3.1:compile
        + dom4j:dom4j:jar:1.6.1:compile
          + jaxme:jaxme-api:jar:0.3:compile
          + jaxen:jaxen:jar:1.1-beta-6:compile
            + dom4j:dom4j:jar:1.5.2:compile
              + jaxen:jaxen:jar:1.1-beta-4:compile
                + jdom:jdom:jar:b10:compile
                + xerces:xmlParserAPIs:jar:2.6.2:compile
                + xerces:xercesImpl:jar:2.6.2:compile
                + xom:xom:jar:1.0b3:compile
                  + xerces:xmlParserAPIs:jar:2.6.1:compile
                  + xerces:xercesImpl:jar:2.2.1:compile
                  + com.ibm.icu:icu4j:jar:2.6.1:compile
                  + xalan:xalan:jar:2.6.0:compile
                    + xml-apis:xml-apis:jar:2.0.2:compile
                    + xerces:xercesImpl:jar:2.6.0:compile
                  + org.ccil.cowan.tagsoup:tagsoup:jar:0.9.7:compile
                  + javax.servlet:servlet-api:jar:2.4:provided
              + msv:xsdlib:jar:20030807:compile
              + msv:relaxngDatatype:jar:20030807:compile
              + pull-parser:pull-parser:jar:2:compile
              + xpp3:xpp3:jar:1.1.3.3:compile
              + stax:stax-api:jar:1.0:compile
              + junitperf:junitperf:jar:1.8:test
              + stax:stax-ri:jar:1.0:test
              + xalan:xalan:jar:2.5.1:test
            + jdom:jdom:jar:1.0:compile
              + xml-apis:xml-apis:jar:1.0.b2:compile
              + jaxen:jaxen:jar:1.0-FCS:compile
              + saxpath:saxpath:jar:1.0-FCS:compile
              + xalan:xalan:jar:2.5.0:compile
        + javax.transaction:jta:jar:1.1:compile
        + javax.security:jaas:jar:1.0.01:provided
        + javax.security:jacc:jar:1.0:provided
        + ant:ant:jar:1.6.5:provided
          + xml-apis:xml-apis:jar:1.3.04:compile
        + javassist:javassist:jar:3.4.GA:compile
        + org.hibernate:hibernate-cglib-repack:jar:2.1_3:compile
    

    为了测试这一点,您当然需要将该MOJO绑定到测试Maven项目,并且您需要事先安装该MOJO。

    1. 在上面有POM的Maven插件上运行mvn清洁安装
    2. 创建一个新的测试Maven项目,声明该插件。

    上述MOJO的插件配置可以是:

    <plugin>
        <groupId>sample.plugin</groupId>
        <artifactId>test-maven-plugin</artifactId>
        <version>1.0.0</version>
        <executions>
            <execution>
                <id>t</id>
                <goals>
                    <goal>foo</goal>
                </goals>
                <phase><!-- something --></phase>
            </execution>
        </executions>
    </plugin>
    
     类似资料:
    • 编写的PHP扩展需要需要依赖另外一个扩展,在PHP-X中可以调用Extension->require来实现。 PHPX_EXTENSION() { Extension *ext = new Extension("test", "0.0.1"); ext->require("swoole"); ext->require("sockets"); return ext;

    • 依赖关系 这是一个非常轻量级的模块,没有其他依赖项。希望大家在JVM或Android上使用以太坊的RLP编码的项目时会选择使用这个模块,而不再编写自己的实现。

    • 依赖关系 ABI一个非常轻量级的模块,唯一的第三方依赖是 Bouncy Castle,用于hash加密 (Spongy Castle on Android)。 最后希望java和安卓开发者,在JVM或Android上有以太坊ABI合作的项目时会选择使用这个模块,而不是再编写自己的实现。

    • 问题内容: 我有一个依赖关系如下: 当我部署一切正常时,这将拉下另一个引发ClassDefNotFound的依赖项。 我添加了两个依赖项,如下所示: 并且仍然面临着同样的问题,即:MVN带来下来不 我该如何解决? 编辑: 添加; 问题答案: 您可能有一个传递依赖项,另一个依赖项取决于您不需要的版本。 要获得所有直接和传递依赖关系的概述,请尝试: mvn依赖项:树 如果您发现同一依赖项的不同版本之间

    • 问题内容: 我有一个二进制文件,其中ldd显示了意外的依赖项和libicuuc(来自“ icu”)。 由于在该系统上libxml动态依赖于libicuuc,因此ldd最终会找到它是有意义的,但是是否期望libicuuc也出现在A的ldd输出中?是否有一些命令仅检索链接为依赖项依赖关系的库? 问题答案: 显示启动应用程序或加载共享库时需要加载的所有库。 仅显示二进制文件的直接依赖项。 是否有一些命令

    • 问题内容: 我正在运行一个依赖groovy 1.7-beta-1的项目。gmaven插件使用groovy 1.6版作为依赖项。在pom中,我在依赖性管理部分中将grooyv-all版本指定为: 但是,当我在调试模式下运行maven时,我看到groovy 1.6被用于对gmaven插件的依赖。我以为我的依赖项管理部分会重写此设置,因此它们都使用1.7-beta-1,但是由于常规版本不同,我遇到了错误