2011-07-28 76 views
17

我剛剛將大量源代碼導入到Eclipse中,基本上包名稱不再有效(代碼已被移動文件夾)。有沒有辦法在包資源管理器中選擇所有的源代碼,然後點擊一個熱鍵,這樣所有的包聲明都可以爲我正確解析?我知道你可以通過選擇源代碼並敲擊ctl-shift-o來完成此操作,但是對於包裝聲明也是可以的。Eclipse - 如何「將包聲明更改爲...」跨整個項目

更新:重構包不工作,因爲我不想更改名稱或包裝的位置,我只需要調整在Java源代碼包聲明。

回答

26

如果包聲明不再有效,那麼所有這些無效聲明將出現在Eclipse的​​視圖中。如果您沒有看到此視圖,可以從窗口 - >顯示視圖 - >其他... - >問題(在常規選項卡下)打開它。

通過選擇上下文菜單中的Quick fix選項(右鍵單擊可用),可以過濾問題視圖中的問題並更正易於更正的問題。在你的情況,你應該會看到類似的截圖東西下面貼:

Quick fix for incorrect packages

應用快速修復選項是微不足道的,只要你知道哪一個是正確的 - 你要麼必須改變包聲明在班上,或班級本身的位置。不幸的是,沒有辦法一次解決多個單位的問題;您將不得不針對每個問題應用快速修復。

如果要過濾僅有這種類型的問題,請考慮配置Problems視圖以顯示錯誤文本中文本內容與預期軟件包不匹配的所有錯誤,如以下屏幕截圖所示:

Configure Problem Contents

Eclipse Configure Package Problems

+0

偉大的迴應 - 屏幕截圖和所有;) –

5

右鍵單擊包,選擇重構>重命名。這將使用新的軟件包名稱更新所有源文件。

+0

這不起作用,它需要你重命名包。我不想重命名或移動它們,我只需要將源代碼中的「package blah.blah.blah」更新到正確的包文件夾。 –

+0

@Stephane,重構無法正常工作,因爲重構無法解決你的錯誤,它操縱代碼沒有錯誤的結構不同,你應該將新包移到一個空白的項目位置,重構它以匹配你的源代碼中導入的用過的blah.blah.blah包,將它移回到源代碼中,以及那麼你可以重構你想要的方式 – Atreys

+0

這工作,聰明! –

20

對於這個特定的問題(通常帶有自動生成的附加文件),我找到了一個巧妙的解決辦法。

所以如果問題是你的包聲明是「包abc;」在200個文件中,你希望它是「package com.aa.bb.cc.abc;」

然後在eclipse中,Search-> File for「package abc;」在需要的文件夾或pkg或整個工作區中。不要選擇搜索選項,但選擇「替換」,然後把「package com.aa.bb.cc.abc;」當它在搜索後要求更換時。 應該做的伎倆。

+0

太棒了!我已經使用Eclipse 7年,但從未見過'替換...'按鈕。 –

1

我剛剛有同樣的問題,所以我寫了一個bash腳本來做到這一點。

function java-package-update { 
    for path in $(find $1 -type f -name "*.java"); do 
    D=$(dirname $path); 
    F=$(basename $path); 
    P=$(echo $D|tr '/' '.'); 
    if egrep -q '^\s*package\s*' $path; then 
     sed -i '' '/^\s*package\s*/s/^\(\s*package\s*\)[^;]*\(;.*\)/\1 '$P'\2/' $path; 
    else 
     echo >&2 "no package in $path"; 
    fi; 
    done; 
} 

使用的sed命令是OSX上的命令。如果您使用的是gnu sed,那麼在-i之後您不需要「參數」。

只需粘貼它並在包含源代碼的目錄中運行它。先備份源代碼,除非你非常勇敢。

例子:

$ cd /home/me/proj/fred/src 
$ ls 
com 
$ cp -a com com.backup 
$ java-package-update com 
$ # fingers crossed 
$ diff -ru com.backup com 

我真的應該開始一個更現代的語言如Perl這樣的東西:)

1

這應該爲你做的伎倆。

首先將所有文件導入到默認包中,然後將它們拖入 新包中,JDT將執行重構並更改項目中的包聲明。

1

這是一個老問題,但我遇到了同樣的問題,並寫了一個非常簡單的bash腳本。希望它能幫助別人。

for i in *.java; do 
    sed -i 's/.*package com.example.something;.*/package com.example.something_else;/' $i 
done 

基本上,該腳本遍歷所有的java文件的目錄中,並package com.example.something;每次出現package com.example.something_else;取代。

相關問題