Найти все переходные артефакты с использованием классов
Я использую 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 ответ
Сканер репозитория Maven обрабатывает все артефакты изолированно, то есть зависимости между ними не оцениваются при сканировании классов.
Это такое же поведение, как при сканировании нескольких файлов JAR из каталога, поэтому зависимости между классами (вызовы методов, иерархии наследования и т. Д.) Разрешаются только в том случае, если участвующие классы находятся в одном и том же артефакте.
Поскольку в случае репозитория Maven известны зависимости между артефактами, должна быть возможность применять запросы, которые разрешают эти зависимости, аналогично понятиям "classpath:*", но это необходимо оценить.
Обновить
Следующие запросы должны помочь получить зависимости на основе классов (DEPENDS_ON) между классами в разных артефактах:
Создайте отношения DEPENDS_ON между артефактами на основе объявленных зависимостей в POM:
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)
Распространите отношения DEPENDS_ON между типами на основе отношения RESOLVES_TO:
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)
Это работает для вас?