0

我正在使用 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
4

1 回答 1

2

Maven 存储库扫描器孤立地处理所有工件,即在扫描类时不会评估它们之间的依赖关系。

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

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

更新

以下查询应该有助于在不同工件中的类之间获取基于类的依赖项 (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)

这对你有用吗?

于 2016-08-11T08:42:10.047 回答