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

时间:2016-08-10 10:04:09

标签: maven neo4j jqassistant

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

1 个答案:

答案 0 :(得分:2)

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

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

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

<强>更新

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

这对你有用吗?