7

我有一个由多个 Web 应用程序(war)和库(jar)组成的系统。他们都在使用 maven 并且在我的控制之下(源代码,Nexus 中的内置工件,......)。假设应用程序 A 直接使用库 L1 而间接使用 L2(它从 L1 使用)。我可以使用 maven 的 dependency:tree 或 graph:project 插件轻松地从应用程序中自上而下检查依赖关系树。但是我如何检查,谁在使用我的图书馆?从我的示例中,我想知道,A 是否是唯一使用 L1 的应用程序(或库),并且 L2 是从 L1 和其他一些应用程序使用的,比如说 B。是否有任何用于 maven 或 nexus 的插件,或者我应该尝试为此编写一些脚本?你有什么建议?

4

8 回答 8

5

如果您希望在存储库级别上实现这一点,Apache Archiva 在项目信息下列出了“使用者”功能

看截图.

这类似于 mvnrepository.com 在工件描述的“使用者”部分下列出的内容。

不幸的是,Nexus 似乎没有提供等效的功能。

现在我想为此维护另一个存储库会很麻烦,但是它可能比其他一些答案建议更容易,例如向 Nexus 编写插件。我相信 Archiva 可以配置为代理其他存储库。

更新

事实上,Nexus 也有一个插件来实现“被使用”功能。

于 2013-10-25T05:14:05.707 回答
3

据我所知,在这些方面没有任何东西可以作为开源工具存在。您可以编写一个 Nexus 插件,该插件遍历 repo 并通过遍历所有 pom 并分析它们来检查您的组件在所有其他组件中的使用情况。不过,这将是一项相当繁重的任务,因为它必须查看所有组件并解析所有 pom。

以类似的方式,您可以使用其他工具在本地存储库上执行此操作。然而,解析存储库管理器的内容可能比本地存储库更有意义。

于 2013-10-16T17:22:48.667 回答
2

我认为没有 Maven 方法可以做到这一点。话虽如此,有很多方法可以做到这一点或类似的事情。这里有几个例子:

  • 在您最喜欢的 IDE 中打开您的项目。例如,Eclipse 将帮助您在类级别上进行影响分析,这在大多数情况下可能已经足够好了

  • grep在源目录上使用简单的“ ”。也许这听起来有点粗鲁(以及说明显而易见的),但我们已经使用了很多

  • 使用 Sonargraph 或 Lattix 等依赖关系分析工具

于 2013-10-15T23:35:20.783 回答
2

我不知道有任何公共图书馆适合这项工作,所以我编写了一个定制的应用程序来为我做这件事。我使用的发行版涉及捆绑在一起的 70 多个工件。多次修改工件后,我想确保更改是向后兼容的(即在相关工件中不会引入编译错误)。为了实现这一点,了解修改后的工件的所有依赖项至关重要。

因此,我编写了一个应用程序,它扫描目录(/子目录)下的所有工件,提取它们的 pom.xml 并搜索(在 pom 的依赖项部分)以查找修改后的工件。(我在 java 中做到了这一点,尽管 shell/windows 脚本可以更紧凑地做到这一点。)

如果有帮助的话,我很乐意在 github 上分享代码。

于 2013-10-21T15:44:33.303 回答
2

一种可能适合您需求的方法是使用您的所有 maven 项目创建一个 master-pom。然后在 master-pom 上运行以下命令:

mvn dependency:tree -DoutputType=graphml -DoutputFile=dependency.graphml

在 yEd 中打开生成的文件。

使用了此处的说明:http: //www.summa-tech.com/blog/2011/04/12/a-visual-maven-dependency-tree-view/

于 2013-10-22T11:47:38.807 回答
1

更有趣的可能是:你会如何处理这些信息?通知 A 的开发人员不要再使用库 L1 或 L2,因为它有一个严重的错误?在我看来,您应该能够在存储库管理器上创建依赖项/父项/插件的黑名单。一旦项目尝试使用列入黑名单的工件来部署/上传自己,它应该会失败。我说的是uploading不是downloading,因为这可能会破坏很多项目。据我所知,这还不适用于任何存储库管理器。

于 2013-10-18T15:59:46.007 回答
1

解决这个问题的方法之一是在 Java 本身之外:编写一个操作系统级别的监视脚本,跟踪所讨论的 jar 文件上的每个 fopen() 情况!假设这是在公司环境中,您可能需要等待几周(!)才能允许所有使用进程至少访问库一次!

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

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

于 2013-10-20T15:58:46.787 回答
1

恕我直言,而且根据我的经验,为此类问题寻找技术解决方案通常是矫枉过正。如果您想知道谁在使用您的工件(库)的原因是因为您希望在更改工件或类似的东西时确保向后兼容性,我认为最好通过使用传统渠道传达您的更改并鼓励其他可能正在使用您的库来讨论它的团队(项目博客、wiki、电子邮件、放置文档的知名位置、Jour fixe 等)。

理论上,您可以编写一个脚本来爬取存储库中的每个项目,然后解析 maven build.xml(假设它们都使用 maven)并查看它们是否定义了对您的工件的依赖关系。如果您组织中的所有项目都遵循标准的 maven 结构,那么编写一个这样的脚本应该很容易(尽管如果这些项目中的任何一个通过传递依赖关系依赖于您的工件,事情就会变得更加棘手)。

于 2013-10-24T10:59:32.850 回答