Maven/Gradle如何计算一个依赖项及其所有传递依赖项的总大小?

28

我希望能够对我的每个项目POM进行分析,以确定每个直接依赖项引入了多少字节到结果包中,这取决于其所有传递依赖项的总和。

例如,如果依赖关系A引入B、C和D,则我希望能够看到一个摘要,显示A->总大小=(A+B+C+D)。

是否有现有的Maven或Gradle方法可以确定此信息?


如果C引入了C1和C2,我想你也希望它们被包含进来了,对吧? - RaGe
是的,目的是为了能够轻松地识别依赖项对生成的WAR或可执行JAR的总大小的影响。 - Shawn Sherwood
4个回答

19

这是一个针对你的 build.gradle 的任务:

task depsize  {
    doLast {
        final formatStr = "%,10.2f"
        final conf = configurations.default
        final size = conf.collect { it.length() / (1024 * 1024) }.sum()
        final out = new StringBuffer()
        out << 'Total dependencies size:'.padRight(45)
        out << "${String.format(formatStr, size)} Mb\n\n"
        conf.sort { -it.length() }
            .each {
                out << "${it.name}".padRight(45)
                out << "${String.format(formatStr, (it.length() / 1024))} kb\n"
            }
        println(out)
    }
}

该任务打印出所有依赖项的总和,并按大小(以KB为单位)降序打印它们,更新:任务的最新版本可以在github gist上找到。


太棒了,谢谢!:) 有没有办法以类似于“gradle dependencies”的方式显示它? - fabien
2
没有想法。不过你可以享受更新后的任务修订版。现在它包含了填充,输出看起来更加出色! - Slava Medvediev

16

我在工作站上保留了一个小的pom.xml模板,以识别大型依赖项。

假设你想查看所有传递依赖项中org.eclipse.jetty:jetty-client的重量,请在新文件夹中创建此文件。

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>not-used</groupId>
  <artifactId>fat</artifactId>
  <version>standalone</version>

  <dependencies>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-client</artifactId>
      <version>LATEST</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-shade-plugin</artifactId>
        <executions>
          <execution>
           <phase>package</phase>
           <goals>
              <goal>shade</goal>
           </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

然后使用cd命令进入文件夹,运行mvn package命令,并检查生成的fat jar包的大小。在类Unix系统上,您可以使用du -h target/fat-standalone.jar命令来完成该操作。

若要测试另一个maven artifact,只需更改上面模板中的groupId:artifactId即可。


3
谢谢,这是我找到的最接近答案的内容。我仍然不敢相信没有一种适当的(内置的)方法来做到这一点。 - Shawn Sherwood
据我所知,截至2016年1月,没有内置的方法。Maven 依赖插件 是最接近的,可能会有帮助,但不幸的是 mvn dependency:get 已经弃用了将下载到自定义位置; mvn dependency:copy 不支持传递依赖项,而 mvn dependency:copy-dependencies 需要一个 pom.xml 文件,这使它至少与上述解决方案一样繁琐 - Alex Yursha

1
如果您有一个包含所有所需依赖项的配置,希望计算大小,只需在build.gradle文件中放入以下代码片段即可:
def size = 0
configurations.myConfiguration.files.each { file ->
    size += file.size()
}
println "Dependencies size: $size bytes"

当构建文件编译后,运行任何Gradle任务时,此内容应打印出来。

No such property: size for class: org.gradle.api.internal.project.DefaultProject_Decorated Possible solutions: state, name - M. Reza Nasirloo

1

并不是我所期望的,因为我只需打开生成的war文件即可获得此信息。不过,感谢您指出这个插件,它确实具有一些不错的功能,比如许可证摘要。 - Shawn Sherwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接