web-dev-qa-db-ja.com

Eclipseでのパッケージの名前変更

Eclipseの「Package Explorer」で、次のようなパッケージのリストがあるとします。

  • com.dog
  • com.cat
  • com.frog

パッケージ構造の「com」部分の名前を「animal」に変更したい場合、各パッケージ(上記)を選択して、リファクタリング>名前の変更を実行できます。

「com」で始まる多くのパッケージがある場合、そのプロセスにはしばらく時間がかかる場合があります。パッケージエクスプローラーで各パッケージの名前を個別に変更せずに、「com」パッケージの名前を変更する簡単な方法はありますか?または名前を変更する前にビルドパスからそれらのパッケージを削除しますか?

フォルダをツリー構造で表示する[ナビゲータ]ペインに移動しようとしましたが、名前の変更機能がありません。

31
digiarnie

デフォルトでは、パッケージエクスプローラーでFilters ...を変更してチェックをはずすと空の親パッケージ(2番目のスクリーンショットの上から3番目)空のパッケージが表示されます。

package Explorer filters

filters view
(ソース: Eclipse.org

次に、comパッケージの名前を変更し、Rename subpackagesオプションをオンにして、すべての子パッケージを強制的に名前が変更されました。

rename package
(ソース: Eclipse.org

次に、完了したら、フィルターを再適用して、空のパッケージをすべて非表示にします。

55
Rich Seller

現在のJDT API(Java開発ツール、パッケージの名前変更を含む部分)は一度に1つのパッケージのみを名前変更します(サブパッケージは名前を変更しません)

見る:

サブパッケージを持つパッケージをリファクタリングするとき、JDTは親の名前を変更するだけでなく、子パッケージを再度作成します

フラグメントだけでなくすべてのサブパッケージの名前も変更するには、IPackageFragmentのAPIが必要です。
事実上、実装はパッケージフラグメントのフォルダーの名前を変更し、含まれているすべてのCU(サブパッケージのCUを含む)のパッケージ宣言を更新します

そのため、現時点では(設計上)(Eclipse 3.5)ですが、拡張機能がログに記録され、3.6で考慮されます。

注:2005年以降、「機能の欠如」が指摘されています。

新しい階層パッケージの名前変更をテストしていて、同じパッケージ構造の2つのソースフォルダーがありました。両方のパッケージの名前を変更するには、同じ操作を2回実行する必要がありました。
ヒントを得て、パッケージの名前変更を他のソースフォルダーにも適用する必要があるかどうかを尋ねられるのは良いことです。

6
VonC

「com」パッケージにファイルを作成します。名前を変更し、「サブパッケージの名前を変更する」をチェックします。ファイルを削除します。

4

親パッケージの名前を変更するためのプラグインの実装に取り​​組んできました。 「親パッケージの名前変更」アイテムをのコンテキストメニューに追加するか、 ctrl-7

アクティブな選択に基づいてメニュー項目を有効/無効にするコードを実装していません(ウィザードがキャンセルを中止する原因となるいくつかの競合状態があります)。アクティブな選択が親パッケージを持つパッケージの場合、その親を選択して名前変更ウィザードを起動します。それでも、「サブパッケージの名前を変更」を手動で選択する必要があります。

ここにプラグインコードがあります:

package name.seller.rich.packagerenamer.actions;

import org.Eclipse.core.commands.AbstractHandler;
import org.Eclipse.core.commands.ExecutionEvent;
import org.Eclipse.core.commands.ExecutionException;
import org.Eclipse.jdt.core.IJavaElement;
import org.Eclipse.jdt.core.IPackageFragment;
import org.Eclipse.jdt.core.IPackageFragmentRoot;
import org.Eclipse.jdt.core.JavaModelException;
import org.Eclipse.jdt.internal.ui.JavaPlugin;
import org.Eclipse.jdt.internal.ui.actions.SelectionConverter;
import org.Eclipse.jdt.ui.actions.RenameAction;
import org.Eclipse.jface.viewers.IStructuredSelection;
import org.Eclipse.jface.viewers.StructuredSelection;
import org.Eclipse.ui.IWorkbenchPart;
import org.Eclipse.ui.handlers.HandlerUtil;

public class RenameParentPackageHandler extends AbstractHandler {

    public RenameParentPackageHandler() {
    }

    public Object execute(ExecutionEvent event) throws ExecutionException {
        IWorkbenchPart activePart = HandlerUtil.getActivePart(event);
        try {
            IStructuredSelection selection = SelectionConverter
                    .getStructuredSelection(activePart);

            IPackageFragment parentPackage = getParentPackage(selection);

            if (parentPackage != null && parentPackage.exists()) {

                RenameAction action = new RenameAction(HandlerUtil
                        .getActiveSite(event));

                StructuredSelection parentSelection = new StructuredSelection(
                        parentPackage);
                action.run(parentSelection);
            }
        } catch (JavaModelException e) {
            logException(e);
        }
        return null;
    }

    private IPackageFragment getParentPackage(IStructuredSelection selection) {
        IJavaElement[] elements = SelectionConverter.getElements(selection);

        if (elements != null && elements.length > 0) {
            if (elements[0] != null && elements[0] instanceof IPackageFragment) {
                IPackageFragment fragment = (IPackageFragment) elements[0];

                String packageName = fragment.getElementName();
                int lastDotIndex = packageName.lastIndexOf(".");

                if (lastDotIndex != -1) {
                    String parentPackageName = packageName.substring(0,
                            lastDotIndex);

                    IJavaElement parent = fragment.getParent();
                    if (parent != null
                            && parent instanceof IPackageFragmentRoot) {

                        return ((IPackageFragmentRoot) parent)
                                .getPackageFragment(parentPackageName);

                    }
                }
            }
        }
        return null;
    }

    protected void logException(Exception e) {
        JavaPlugin.log(e);
    }
}

ここにplugin.xmlがあります

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
   <extension
     point="org.Eclipse.ui.commands">
      <command
        name="Rename parent package"
        categoryId="name.seller.rich.packagerenamer.category"
        id="name.seller.rich.packagerenamer.renameParentPackage">
      </command>
   </extension>
   <extension
     point="org.Eclipse.ui.handlers">
      <handler
        commandId="name.seller.rich.packagerenamer.renameParentPackage"
        class="name.seller.rich.packagerenamer.actions.RenameParentPackageHandler">
      </handler>
   </extension>
   <extension
     point="org.Eclipse.ui.bindings">
      <key
        commandId="name.seller.rich.packagerenamer.renameParentPackage"
        contextId="org.Eclipse.ui.contexts.window"
        sequence="M1+7"
        schemeId="org.Eclipse.ui.defaultAcceleratorConfiguration">
      </key>
   </extension>
   <extension
     point="org.Eclipse.ui.menus">
      <menuContribution
        locationURI="popup:org.Eclipse.ui.popup.any?after=additions">
         <command
           commandId="name.seller.rich.packagerenamer.renameParentPackage"
           mnemonic="K">
         </command>
      </menuContribution>
   </extension>
</plugin>

そしてマニフェスト:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Classwizard
Bundle-SymbolicName: name.seller.rich.packagerenamer; singleton:=true
Bundle-Version: 1.0.0
Require-Bundle: org.Eclipse.ui,
 org.Eclipse.core.runtime,
 org.Eclipse.jdt.core;bundle-version="3.5.0",
 org.Eclipse.core.expressions;bundle-version="3.4.100",
 org.Eclipse.jface.text;bundle-version="3.5.0",
 org.Eclipse.jdt.ui;bundle-version="3.5.0",
 org.Eclipse.ui.ide;bundle-version="3.5.0",
 org.Eclipse.ui.editors;bundle-version="3.5.0",
 org.Eclipse.core.resources;bundle-version="3.5.0"
Eclipse-AutoStart: true
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
3
Rich Seller

ええと、私はここにいる他の誰もが何をしているのかはわかりませんが、Eclipse Junoでパッケージを右クリックします->リファクタリング->名前を変更します

次に、パッケージの名前を変更し、変更を階層の下にカスケードする場合はチェックボックスをオンにします。

0
Scuba Steve