查找使用过 类 的所有可传递工件

Find all transitive artifacts with used classes

我正在使用 jqassistant 创建工件的传递依赖列表。我的目标是将其基于类型依赖性,因为我想通过将 Maven 传递依赖性列表与类型依赖性给出的列表进行比较来找到体系结构缺陷(所有工件中至少有一种类型以任何传递形式使用)。

不幸的是,以下查询仅返回原始工件 basis-vs-bo。查询应用于我通过扫描 Maven 存储库创建的数据库。

我错过了什么?

 MATCH (basis:Artifact{name:"basis-vs-bo",version:"4.0.0"})
 WHERE NOT( HAS (basis.classifier))
 WITH basis
 MATCH (basis) -[:CONTAINS]-> (t:Type) -[:DEPENDS_ON*]-> (s:Type) <-[:CONTAINS]- (a:Artifact)
 RETURN DISTINCT a

Maven 存储库扫描器隔离处理所有工件,即在扫描时不评估它们之间的依赖关系 classes。

这与从目录中扫描多个 JAR 文件的行为相同,因此 classes 之间的依赖关系(方法调用、继承层次结构等)仅在涉及 classes 时才得到解决位于同一工件内。

由于在 Maven 存储库的情况下工件之间的依赖关系是已知的,因此应该可以应用查询来解决这些依赖关系,类似于 "classpath:*" 概念,但这需要评估。

更新

以下查询应该有助于在不同工件的 class 之间获得基于 class 的依赖关系(DEPENDS_ON):

根据 POM 中声明的依赖关系在工件之间建立 DEPENDS_ON 关系:

MATCH
  (r:Repository)-[:CONTAINS_POM]->(p1:Pom)-[:DESCRIBES]->(a1:Java:Archive),
  (r:Repository)-[:CONTAINS_POM]->(p2:Pom)-[:DESCRIBES]->(a2:Java:Archive),
  (p1)-[:DECLARES_DEPENDENCY]->(a2)
MERGE
  (a1)-[:DEPENDS_ON]->(a2)
RETURN
  a1.fqn, collect(a2.fqn)

将工件所需的类型解析为作为依赖项的工件中包含的类型,创建关系 RESOLVES_TO:

MATCH
  (a1:Artifact)-[:DEPENDS_ON]->(a2:Artifact),
  (a1)-[:REQUIRES]->(requiredType:Type),
  (a2)-[:CONTAINS]->(containedType:Type)
WHERE
  requiredType.fqn = containedType.fqn
MERGE
  (requiredType)-[:RESOLVES_TO]->(containedType)
RETURN
  a1.fqn, a2.fqn, collect(requiredType.fqn)

根据 RESOLVES_TO 关系在类型之间传播 DEPENDS_ON 关系:

MATCH
  (a1:Artifact)-[:REQUIRES]->(requiredType:Type),
  (a1)-[:CONTAINS]->(type:Type)-[:DEPENDS_ON]->(requiredType),
  (a2:Artifact)-[:CONTAINS]->(resolvedType:Type),
  (requiredType)-[:RESOLVES_TO]->(resolvedType:Type)
MERGE
  (type)-[dependsOn:DEPENDS_ON]->(resolvedType)
SET
  dependsOn.resolved=true
RETURN
  a1.fqn, type.fqn, a2.fqn, collect(resolvedType.fqn)

这对你有用吗?