在Eclipse的“Package Explorer”中,假设我有一个这样的包列表:
如果我想将包结构的“com”部分重命名为“animal”,那么我可以选择每个包(上面)并执行重构>重命名。
如果我有许多以“com”开头的软件包,那么这个过程可能需要一段时间。是否有一种简单的方法来重命名“com”包名称,而无需在Package Explorer中单独重命名每个包?或者在重命名之前从构建路径中删除这些包?
我尝试进入“导航器”窗格,在窗格中显示树状结构中的文件夹,但我没有给予重命名功能。
答案 0 :(得分:55)
默认情况下,如果您在软件包资源管理器中修改过滤器... 以取消选中清空父软件包,则默认情况下会在软件包资源管理器中隐藏空父软件包(排名第三)在第二个屏幕截图中)你将能够看到空包。
(来源:eclipse.org)
然后,您可以重命名 com 包并检查重命名子包选项以强制重命名所有子包。
(来源:eclipse.org)
然后,当您完成重新应用过滤器以再次隐藏所有这些空包时。
答案 1 :(得分:6)
看起来当前的JDT API(Java开发工具,包含包重命名的部分)一次只重命名一个包(而不是子包)
请参阅:
当重构具有子包的包时,JDT会创建子包 再次,而不是只重命名父
我们需要
IPackageFragment
上的API才能重命名 片段,但也包括所有子包 实际上,实现将重命名包片段的文件夹,然后更新所有包含的CU(包括子包中的CU)中的包声明
所以当时是“按设计”(eclipse 3.5),但会记录增强功能并将其考虑在内。
注意:自2005年以来一直注意到“缺乏功能”!
我正在测试新的分层包重命名,并有两个源文件夹 具有相同的包结构。要在两者中重命名包,我必须这样做 操作两次。
得到一个提示并被问及包重命名是否应该是很好的 也应用于其他源文件夹。
答案 2 :(得分:4)
在'com'包中创建一个文件。重命名并选中“重命名子包”。删除文件。
答案 3 :(得分:3)
我已经实现了一个重命名父包的插件。它将“重命名父包”项添加到上下文菜单中,或者可以由 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
答案 4 :(得分:0)
然后只需重命名您的包,如果您希望更改级联层次结构,请选中此框。