Java 谁在使用我的maven神器?

Java 谁在使用我的maven神器?,java,maven,dependencies,nexus,Java,Maven,Dependencies,Nexus,我有一个由多个web应用程序(war)和库(jar)组成的系统。他们都在使用maven,并且在我的控制之下(源代码、Nexus中构建的工件等等)。假设应用程序A直接使用库L1,间接使用库L2(从L1使用)。使用maven的dependency:tree或graph:project插件,我可以从应用程序中轻松地自上而下检查依赖关系树。但我怎么能查到,谁在用我的图书馆?从我的示例中,我想知道A是否是唯一使用L1的应用程序(或库),L2是否从L1和其他应用程序中使用,比如B。是否有maven或nexu

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

我认为没有专业的方法可以做到这一点。也就是说,有很多方法可以做到这一点或类似的事情。这里有几个例子:

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

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

  • 使用依赖性分析工具,如Sonaragraph或Lattix


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


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

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

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

在Windows上,您可以使用Sysinternals进程监视器执行以下操作:


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

我不知道有任何公共库可用于此项工作,因此我编写了一个定制的应用程序来为我实现此功能。 我使用的发行版包含70多个捆绑在一起的工件。很多时候,在修改工件之后,我希望确保更改是向后兼容的(即,在依赖工件中不会引入编译错误)。为了实现这一点,了解修改工件的所有依赖项是至关重要的

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


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

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

mvn dependency:tree -DoutputType=graphml -DoutputFile=dependency.graphml
在中打开生成的文件

使用此处的说明:
根据我的经验,为此类问题寻找技术解决方案通常是一种过火的做法。如果您想知道谁在使用您的工件(库)是因为您想在更改工件或类似的东西时确保向后兼容性,那么我认为最好通过使用传统渠道传达您的更改,并鼓励可能正在使用您的库的其他团队讨论它(项目博客、维基、电子邮件、放置文档的著名地点、期刊等)


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

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

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

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

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

更新


事实上,还有一个方法可以实现“使用人”功能。

这将非常有用,我多次需要此功能:-)唉,我不相信这样的事情可能存在。也许有一些工具可以扫描你工作区中的项目,但它怎么可能知道哪些项目,在你的领域之外生活,正在使用它……Sonatype CLM让这一切与t完全可能