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)
这对你有用吗?