2016-08-10 52 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

Maven資源庫掃描程序將孤立地處理所有工件,即掃描類時不評估它們之間的依賴關係。

這與從目錄中掃描多個JAR文件的行爲相同,因此只有涉及的類位於相同的工件中時,才能解析類之間的依賴關係(方法調用,繼承層次結構等)。

由於在Maven倉庫中已知工件之間的依賴關係,因此應該可以應用類似於「classpath:*」概念的解析這些依賴關係的查詢,但這需要進行評估。

更新

下面的查詢將有助於獲得類之間基於類的依賴關係(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) 
基礎上,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) 

這是否對你的工作?

+0

謝謝。實際上,使用Maven回購(尤其是POM)的結構來避免「重複節點」會很好。那麼在我們的大公司Maven回購中找到建築問題會容易得多。 –

+0

感謝您的快速更新。我目前正在等待第二個查詢(在144GB數據庫中需要一些時間...)。我下週休假,然後我會到德累斯頓參加你的研討會,所以不要指望我回答得太快。 –

相關問題