谁在使用我的Maven构件?

7

我有一个由多个Web应用程序(war)和库(jar)组成的系统。它们都使用Maven并在我的控制下(源代码、构建工件在Nexus中等)。假设应用程序A直接使用库L1,间接使用库L2(从L1中使用)。我可以轻松地从应用程序自上而下地检查依赖树,使用Maven的dependency:tree或graph:project插件。但是我如何检查谁在使用我的库?从我的例子中,我想知道是否只有应用程序(或库)A在使用L1,L2是从L1和其他应用程序(比如B)中使用的。Maven或Nexus有任何插件吗?还是我应该尝试编写一些脚本来实现呢?您有什么建议?


2
这将非常有用,我很多次需要这个功能 :-) 可惜,我不相信这样的东西可能存在。也许有一些工具可以扫描您工作区中的项目,但它如何知道那些在您域之外独立运行的项目正在使用它... - alterfox
8个回答

5
如果您希望在存储库级别上实现此目标,Apache Archiva 在项目信息下具有“使用者”功能See screenshot。这类似于mvnrepository.com在工件描述的“使用者”部分列出的内容。
不幸的是,Nexus似乎没有提供等效的功能。
我认为维护另一个仓库可能会很麻烦,但这可能比其他一些答案建议的事情更容易,例如编写针对Nexus的插件。我相信可以配置Archiva代理其他存储库。
更新
实际上,还存在一个用于Nexus的插件(链接)可实现“使用者”功能。

+1:这正是我正在寻找的,不幸的是它不适用于Nexus。 - Kojotak
这个插件不支持Nexus 3+,很遗憾。 - NoName

3
据我所知,在开源工具中并不存在类似的解决方案。您可以编写一个Nexus插件来遍历存储库并通过迭代所有POM文件并分析它们来检查组件在其他所有组件中的使用情况。但是,运行此任务会非常繁重,因为它需要查看所有组件并解析所有的pom文件。
类似地,您可以使用其他工具在本地存储库上执行此操作。然而,解析存储库管理器的内容可能比解析本地存储库更有意义。

2

我已经尝试了仅依赖于应用程序的主 POM,但是由于它们被打包为WAR文件,因此对库(JAR)的传递依赖项未被包括在内。我无法简单地创建一个依赖于所有项目(应用程序和库)的主POM,因为不同版本的相同库被不同应用程序使用,并且具有不同的依赖项。 - Kojotak
我成功运行了Maven命令。但是,当我尝试在yed中打开outputFile时,出现异常: yEd遇到以下错误:无法导入文件dependency.graphml。 原因是:org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog. 在com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:251)处引起。 - drop.in.ocean

2
我不知道有没有公共库可以完成这项工作,所以我编写了一个定制的应用程序来帮助我完成。我的工作涉及超过70个打包在一起的构件。很多时候,在修改构件后,我想确保更改是向后兼容的(即在依赖构件中不会引入编译错误)。为了实现这一点,了解所有修改后构件的依赖关系至关重要。
因此,我编写了一个应用程序,扫描目录(/子目录)下的所有构件,提取它们的pom.xml,并搜索(在pom的依赖部分)修改后构件的出现情况。(虽然shell / windows脚本可以更紧凑地完成此操作,但我使用了Java。)
如果有帮助的话,我很乐意在github上分享代码。

那是个好主意! - Kojotak
@Kojotak - 代码托管在git位置:https://github.com/ShrutiTiwari/artifacto 主类:JarInspector。main()方法查找“apache-maven-3.0.4”库中所有依赖于“junit”和“aether”的工件。 它已在Windows上进行了测试(希望它可以直接在Linux上运行)。但是,这种方法有一个缺点-无法捕获传递依赖项。 - drop.in.ocean
嘿,Kojotak!你觉得gitcode对于这个目的有用吗?(如果在使用过程中遇到问题,请告诉我)。我已经修改了它以接受命令行参数输入,例如,要检查基于junit的maven-distribtution-library-artifacts,命令将是:java -jar artifacto-1.0.0-SNAPSHOT.jar C:\software\installation\build-tools\apache-maven-3.0.4\lib junit。 - drop.in.ocean

2
我认为没有 Maven 的方法来完成这个任务。尽管如此,有许多类似的方法可以使用。以下是一些例子:
  • 在您喜欢的 IDE 中打开项目。例如,Eclipse 可以帮助您对类进行影响分析,这在大多数情况下可能已经足够了。

  • 在源目录中使用简单的“grep”。这听起来有点粗鲁(并且显而易见),但我们经常使用它。

  • 使用依赖分析工具,如 Sonargraph 或 Lattix。


1
从我的经验和个人看法来看,为这样的问题寻找技术解决方案通常是过度设计。如果你想知道谁在使用你的工具库(library),因为当你更改工具库或类似情况时,你想确保向后兼容性,我认为最好通过传统渠道进行沟通,并鼓励其他可能使用你的库的团队进行交流(项目博客、维基、电子邮件、已知的文档位置、Jour fixe等)。
理论上,你可以编写一个脚本来遍历仓库中的每个项目,然后解析maven build.xml(假设它们都使用maven),并查看它们是否定义了对你的工具库的依赖关系。如果你的组织中的所有项目都遵循标准maven结构,那么编写这样一个脚本应该很容易(尽管如果其中任何项目通过传递依赖关系依赖于你的工具库,事情可能会变得有些棘手)。

1
更有趣的问题可能是:你会如何利用这些信息?通知A开发人员不再使用L1或L2库,因为它存在严重漏洞吗? 我认为你应该能够在你的存储库管理器上创建依赖项/父级/插件的黑名单。一旦一个项目试图使用被列入黑名单的工件进行部署/上传,它就应该失败。我说"上传"而不是"下载",因为那可能会破坏很多项目。据我所知,目前还没有任何存储库管理器提供此功能。

Sonatype CLM通过Nexus分阶段和CLM策略的集成,使这一切成为可能。它还与Jenkins/Hudson和Eclipse集成,因此您可以失败构建或作为开发人员检查您的组件。 - Manfred Moser
我知道扩展的可能性,但不知道有现成的解决方案。谢谢。 - Robert Scholte
我会使用这些信息进行重构和测试。如果我已经修复了一个库中的某个错误,应该测试哪个应用程序?如果一个库(或来自库的方法/类/包)变得过时,应该重构哪些应用程序(以及其他库)?是的,有单元测试和集成测试来捕获最大的不兼容更改,但它们并不总是足够的。 - Kojotak

1

解决这个问题的一种方法是在Java之外编写一个操作系统级别的监控脚本,跟踪所涉及的jar文件上每个fopen()的情况!假设这是在企业环境中,您可能需要等待几周(!)以允许所有使用该库的进程至少访问一次。

在Windows上,您可以使用Sysinternals Process Monitor来完成此操作: http://technet.microsoft.com/en-us/sysinternals/bb896645

在Unix变体中,您将使用DTrace或strace。


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