我正在使用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
答案 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)
这对你有用吗?