2015-08-26 56 views
2

我目前正在重構由兩個應用項目中的一個項目的Java類參考,並面臨以下問題:查找特定項目(日蝕)通過腳本

舊的項目應該被分爲三個新項目, B和C,因爲它越來越混亂。

所以項目A被實現通過應用1中所用的類,項目B實施由應用2和其餘其由兩個應用程序1和2所使用的類的使用的一些其它類應該在項目實施C.

http://i.imgur.com/8GvGSJ2.png

我已經開始重構了,所以結構已經存在並且正在工作。現在我想知道,如果項目C中有任何類只剩下應用程序1或應用程序2使用的類別

因爲有大約500個Java類我想使用腳本來查看Java類由項目A,B或兩者來實現。在日食手動我可以選擇每個Java類的類名,並去「參考 - >工作區」,並檢查結果,但我希望有人有一個更好的主意:-)

謝謝你提前!

回答

1

我現在寫了一個powershellscript,它可以找到項目c中的任何java文件。然後,它搜索項目a和b的每個java文件,以查找項目c的java類的名稱並進行分類,這在每個項目中都找不到。

我不得不說,這不會涵蓋任何繼承...所以這只是一個尋找類的提示。

奇怪的解決方案,但我認爲它的工作原理,繼承人的代碼:

# all classes used in the project C 
$classNames = New-Object System.Collections.ArrayList 
Get-ChildItem "path-to-project-C" -Recurse -Filter *.java | ` 
Sort-Object -Descending | ` 
Foreach-Object { 
    $className = $_.name.Split(".") 
    #[void] to prevent .add-function to pass the added index into console 
    [void]$classNames.add($className[0]) 
} 

# all classes of project C used in project A 
$projectA_classes = New-Object System.Collections.ArrayList 
Get-ChildItem "path-to-project-A" -Recurse -Filter *.java | ` 
Foreach-Object { 
    $path = $_.FullName 
    foreach ($class in $classNames){ 
     if(Select-String -Path $path -pattern $class -quiet) { 
      [void]$projectA_classes.add($class) 
     } 
    } 
} 

write-host $projectA_classes.count classes used by project A 

# all classes of project C used in project B 
$projectB_classes = New-Object System.Collections.ArrayList 
Get-ChildItem "path-to-project-B" -Recurse -Filter *.java | ` 
Foreach-Object { 
    $path = $_.FullName 
    foreach ($class in $classNames){ 
     if(Select-String -Path $path -pattern $class -quiet) { 
      [void]$projectB_classes.add($class) 
     } 
    } 
} 

write-host $projectB_classes.count classes used by daemon project 

#find classes not used by porject A 
$projectB_classesNotUsedByProjectA = New-Object System.Collections.ArrayList 
foreach ($class in $projectB_classes) { 
    if(!($projectA_classes.contains($class))) { 
     if(!($projectB_classesNotUsedByProjectA.contains($class))) { 
      [void]$projectB_classesNotUsedByProjectA.add($class); 
     } 
    } 
} 

#find classes not used by porject B 
$projectA_classesNotUsedByProjectB = New-Object System.Collections.ArrayList 
foreach ($class in $projectA_classes) { 
    if(!($projectB_classes.contains($class))) { 
     if(!($projectA_classesNotUsedByProjectB.contains($class))) { 
      [void]$projectA_classesNotUsedByProjectB.add($class); 
     } 

    } 
} 

write-host $projectB_classesNotUsedByProjectA.count classes not used by project A 
write-host $projectA_classesNotUsedByProjectB.count classes not used by project B 

write-host Classes not used by project A: $projectB_classesNotUsedByProjectA 
write-host Classes not used by project B: $projectA_classesNotUsedByProjectB 

我不會選擇這個作爲正確答案,因爲我希望有一個更好的解決方案。