我们使用Artifactory来存储我们的maven生成的java工件。我们有许多相互依赖的相互关联的项目。是否可以使用maven或Artifactory来选择单个工件并查找具有该依赖项的所有项目?
在下面的示例中,我想找到哪些项目使用artifact1 v1.0.0。我希望能够使用maven / Artifactory来查找artifact2依赖于此版本的依赖项,但找不到artifact3 / 4这一事实。理想情况下,如果我只是在寻找artifact1的使用而不管版本,那么找到artifact2也是很好的。
<project>
<groupId>mygroup</groupId>
<artifactId>artifact1</artifactId>
<version>1.0.0</version>
</project>
<project>
<groupId>mygroup</groupId>
<artifactId>artifact2</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>mygroup</groupId>
<artifactId>artifact1</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
<project>
<groupId>mygroup</groupId>
<artifactId>artifact3</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>mygroup</groupId>
<artifactId>artifact1</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
</project>
<project>
<groupId>mygroup</groupId>
<artifactId>artifact4</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>mygroup</groupId>
<artifactId>otherartifact</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
答案 0 :(得分:5)
这几乎是您首先使用Artifactory的主要原因之一。 Artifactory以AQL的形式提供了非常广泛的搜索功能,它完全符合您的要求。
以您的案例为例运行:
builds.find(
{"module.dependency.item.name":{"$match":"*artifact1*"}}
).include("module.artifact.name")
将返回所有以Artifact1
作为依赖项的构建(您还可以添加"$and"
子句以将其限制为特定版本的Arifact1
),最后的include将包含返回属于Artifact1
作为依赖项的模块一部分的所有工件(这样您将在案例中看到Artifact2
)
以下是在一个名为multi-module-build
的简单maven构建上运行此查询时获得的示例输出,该构建具有多个模块,其中一个模块(multi3
)具有名为multi1
的依赖项:
"results" : [ {
"build.created" : "2016-03-10T09:08:51.283+02:00",
"build.created_by" : "admin",
"build.name" : "multi-module-build",
"build.number" : "10",
"build.url" : "http://localhost:9090/jenkins/job/multi-shmulti/10/",
"modules" : [ {
"artifacts" : [ {
"artifact.name" : "multi3-3.6-SNAPSHOT.war"
}, {
"artifact.name" : "multi3-3.6-SNAPSHOT.pom"
} ]
} ]
} ]