2016-08-10 2 views
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 

ответ

2

The Maven Сканер хранилища обрабатывает все артефакты в изоляции, т.е. зависимости между ними не вычисляются при сканировании классов.

Это то же поведение, что и сканирование нескольких файлов JAR из каталога, поэтому зависимости между классами (вызовы методов, иерархии наследования и т. Д.) Разрешаются только в том случае, если участвующие классы находятся внутри одного и того же артефакта.

Поскольку зависимости между артефактами известны в случае репозитория Maven, должно быть возможно применить запросы, которые разрешают эти зависимости, похожие на понятия «classpath: *», но это необходимо оценить.

Update

Следующие запросы должны помочь получать зависимости на основе класса (DEPENDS_ON) между классами в различных артефактов:

Сложение 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) 

Propagate 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) 

ли эта работа для вас?

+0

Спасибо. На самом деле было бы здорово использовать структуру репозитория Maven (особенно POM), чтобы избежать «дублированных узлов». Тогда было бы намного легче найти архитектурные проблемы в нашей крупной компании Maven repo. –

+0

Благодарим за быстрое обновление. В настоящее время я жду второго запроса (занимает некоторое время в базе данных 144 ГБ ...). Я нахожусь в отпуске на следующей неделе, а затем я приеду в Дрезден для вашего семинара, так что не ждите от меня ответа слишком рано. –

Смежные вопросы