2009-08-31 79 views
30

Trong "Package Explorer" của Eclipse, chúng ta hãy nói rằng tôi có một danh sách các gói như thế này:gói Đổi tên trong Eclipse

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

Nếu tôi muốn đổi tên phần "com" của cấu trúc gói thành "động vật", thì tôi có thể chọn từng gói (ở trên) và thực hiện một trình đổi tên> cấu trúc lại.

Nếu tôi có nhiều gói bắt đầu bằng "com", quá trình này có thể mất một lúc. Có cách nào dễ dàng để đổi tên tên gói "com" mà không phải đổi tên từng gói trong Package Explorer không? hoặc xóa các gói đó khỏi đường dẫn xây dựng trước khi đổi tên?

Tôi đã cố gắng chuyển đến ngăn "Điều hướng" nơi nó hiển thị các thư mục trong cấu trúc cây nhưng tôi không được cung cấp khả năng đổi tên.

+0

Kiểm tra câu trả lời của Rich (http://stackoverflow.com/questions/1355818/renaming-packages-in-eclipse/1393499#1393499): nếu nó phù hợp với bạn, bạn có thể đặt câu trả lời là câu trả lời chính thức. – VonC

Trả lời

54

By gói mẹ trống mặc định được ẩn trong gói thám hiểm, nếu bạn sửa đổi Filters ... trong Package Explorer để bỏ chọn Gói Chánh Rỗng (thứ ba từ trên trong ảnh chụp màn hình thứ hai), bạn sẽ có thể để xem các gói rỗng.

package explorer filters

filters view http://archive.eclipse.org/eclipse/downloads/drops/R-2.1-200303272130/images/non-shared-project-filter.gif

Sau đó bạn có thể đổi tên com gói và kiểm tra Đổi tên các gói con tùy chọn để buộc tất cả các gói con được đổi tên.

rename package http://archive.eclipse.org/eclipse/downloads/drops/R-3.2-200606291905/new_noteworthy/images/hierarchical_package_rename.png

Sau đó, khi bạn đã hoàn tất filter để ẩn tất cả những gói sản phẩm nào nữa.

+0

Bài viết hay, Rich. +1. Có thể là câu trả lời của bạn nên là câu trả lời chính thức. – VonC

+0

Cái gì? Tôi đã không thực sự làm upvote? Lấy làm tiếc. Tôi thực sự muốn. Chà, trễ hơn không bao giờ ...;) – VonC

+0

Bạn rất tử tế. Ngay sau khi tôi đạt đến giới hạn đại diện cho ngày hôm nay một cách tự nhiên. –

6

Dường như API JDT hiện tại (Công cụ phát triển Java, phần bao gồm gói renamming) không chỉ đổi tên một gói tại một thời điểm (và không phải phụ gói)

Xem:

Khi refactoring một gói, có các gói con, JDT tạo ra các gói con một lần nữa, thay vì chỉ đổi tên paren t

chúng ta cần một API trên IPackageFragment để đổi tên không chỉ là mảnh nhưng cũng còn tất cả các gói con.
có hiệu quả, việc thực hiện sẽ đổi tên thư mục của đoạn gói và sau đó cập nhật tờ khai gói trong tất cả các cus chứa (bao gồm cả những người trong các gói con)

Vì vậy, nó là "bởi thiết kế" tại sau đó thời điểm (eclipse 3.5), nhưng tăng cường được ghi lại và sẽ được tính đến cho 3.6.

Lưu ý: "thiếu tính năng" đã được ghi nhận kể từ năm 2005!

tôi đã được thử nghiệm gói đổi tên thứ bậc mới và có hai thư mục nguồn với cấu trúc cùng một gói. Để đổi tên các gói trong cả hai, tôi đã phải thực hiện cùng thao tác hai lần.
Sẽ rất hay khi nhận được gợi ý và được hỏi xem có đổi tên gói hay không cũng được áp dụng cho (các) thư mục nguồn khác.

4

Tạo tệp trong gói 'com' của bạn. Đổi tên nó và kiểm tra 'Đổi tên các gói con'. Xóa tệp.

+0

Cảm ơn bạn đã nói về "đổi tên gói con" - nó giúp tôi giải thích tại sao giải pháp được đề xuất bởi Andy và MatrixFrog không hoàn toàn phù hợp với tôi (xấu) – digiarnie

3

Tôi đã thực hiện một plugin để đổi tên các gói gốc. Nó thêm mục "Đổi tên gói gốc" thành menu ngữ cảnh hoặc có thể được kích hoạt bởi ctrl-7.

Tôi chưa triển khai mã để bật/tắt mục menu dựa trên lựa chọn hiện hoạt (có một số điều kiện chủng tộc khiến trình hướng dẫn ngừng hủy). Nếu lựa chọn hoạt động là một gói có gói cha, nó sẽ chọn cha mẹ đó và khởi chạy trình hướng dẫn đổi tên. Bạn vẫn sẽ cần phải chọn "đổi tên gói con" theo cách thủ công.

Dưới đây là đoạn code plugin:

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); 
    } 
} 

Đây là 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> 

Và manifest:

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 
+0

Và ... +1. Lần này, nó * nên * đếm trong giới hạn hàng ngày của bạn;) – VonC

+0

cảm ơn rất nhiều, bây giờ chỉ cần thêm 562 –

0

Umm, tôi không biết những gì mọi người khác ở đây đang làm, nhưng trong Eclipse Juno nhấp chuột phải vào packacge -> refactor -> đổi tên

Sau đó, chỉ cần đổi tên gói của bạn và chọn hộp nếu bạn muốn thay đổi để xếp tầng xuống phân cấp.

Các vấn đề liên quan