2011-07-28 44 views
17

Tôi vừa nhập một lượng lớn mã nguồn vào Eclipse và về cơ bản tên gói không còn hợp lệ nữa (mã đã được di chuyển thư mục). Có cách nào để chọn tất cả mã nguồn trong Package Explorer và nhấn phím nóng sao cho tất cả các khai báo gói được giải quyết đúng cho tôi? Tôi biết bạn có thể làm điều này với nhập khẩu bằng cách chọn nguồn và nhấn ctl-shift-o, nhưng cũng có thể cho việc khai báo gói?Eclipse - Cách "Thay đổi khai báo gói thành ...." trên toàn bộ dự án

Cập nhật:Tái cấu trúc gói không hoạt động vì tôi không muốn thay đổi tên hoặc vị trí của gói, tôi chỉ cần điều chỉnh khai báo gói trong mã nguồn Java.

Trả lời

26

Nếu các khai báo gói không còn giá trị, thì tất cả các khai báo không hợp lệ như vậy sẽ xuất hiện trong khung nhìn Problems trong Eclipse. Nếu bạn không nhìn thấy khung nhìn này, bạn có thể mở nó từ Window-> Show View -> Other ... -> Problems (trong tab General).

Bạn có thể lọc các sự cố trong chế độ xem Sự cố và sửa các vấn đề có thể chỉnh sửa dễ dàng bằng cách chọn tùy chọn Quick fix trong menu ngữ cảnh (có sẵn khi nhấp chuột phải). Trong trường hợp của bạn, bạn sẽ thấy một cái gì đó tương tự như ảnh chụp màn hình đăng tải dưới đây:

Quick fix for incorrect packages

Áp dụng các tùy chọn sửa chữa nhanh chóng được tầm thường, miễn là bạn biết cái nào là đúng - bạn sẽ hoặc phải thay đổi việc kê khai gói trong lớp, hoặc vị trí của lớp đó. Rất tiếc, không có tùy chọn để khắc phục vấn đề trên nhiều đơn vị cùng một lúc; bạn sẽ phải áp dụng bản sửa lỗi nhanh cho mọi vấn đề.

Nếu bạn muốn lọc về các sự cố của giống này, hãy xem xét định cấu hình chế độ xem Sự cố để hiển thị tất cả các lỗi có nội dung văn bản "không khớp với gói dự kiến" trong văn bản lỗi, như minh họa trong các ảnh chụp màn hình sau:

Configure Problem Contents

Eclipse Configure Package Problems

+0

Phản hồi tuyệt vời - ảnh chụp màn hình và tất cả;) –

5

Nhấp chuột phải vào gói, chọn Refactor> Rename. Điều này sẽ cập nhật tất cả các tệp nguồn với tên gói mới.

+0

Thao tác này không hoạt động, yêu cầu bạn đổi tên các gói. Tôi không muốn đổi tên hoặc di chuyển chúng, tôi chỉ cần "gói blah.blah.blah trong mã nguồn sẽ được cập nhật vào đúng thư mục gói. –

+0

@Stephane, Refactoring không hoạt động vì việc tái cấu trúc không khắc phục được Bạn nên di chuyển gói mới đến một vị trí dự án trống, refactor nó để phù hợp với gói blah.blah.blah được sử dụng của bạn được nhập vào nguồn của bạn, di chuyển nó trở lại với nguồn của bạn, và Sau đó bạn có thể cấu trúc lại theo cách bạn muốn – Atreys

+0

Điều này làm việc, thông minh! –

20

Đối với vấn đề cụ thể này (mà thường đi kèm với tự động tạo file artifact), tôi tìm thấy một giải pháp gọn gàng.

Vì vậy, nếu vấn đề là khai báo gói của bạn là "gói abc;" trong 200 tệp và bạn muốn nó là "package com.aa.bb.cc.abc;"

Sau đó trong nhật thực, Tìm kiếm-> Tệp cho "gói abc;" trong thư mục yêu cầu hoặc pkg hoặc toàn bộ không gian làm việc. Không chọn tùy chọn Tìm kiếm nhưng chọn "Thay thế" và sau đó đặt "gói com.aa.bb.cc.abc;" khi nó yêu cầu thay thế sau khi tìm kiếm. Nên làm thủ thuật.

+0

Tuyệt vời! Tôi đã sử dụng Eclipse trong 7 năm nhưng chưa bao giờ thấy nút 'Thay thế ...'. –

1

Tôi vừa gặp sự cố tương tự nên tôi đã viết một tập lệnh bash để thực hiện.

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

Lệnh sed được sử dụng là lệnh trên OSX. Nếu bạn đang sử dụng gnu sed, thì bạn không cần tham số '' sau -i.

Chỉ cần dán vào và chạy nó trên thư mục chứa nguồn của bạn. Sao lưu nguồn của bạn trước tiên trừ khi bạn rất dũng cảm.

Ví dụ:

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

tôi thực sự nên bắt đầu thực hiện công cụ này trong một ngôn ngữ hiện đại hơn như perl :)

1

này nên làm các trick cho bạn.

Nhập tất cả các tệp của bạn vào gói mặc định trước rồi kéo chúng vào gói mới, JDT sẽ thực hiện tái cấu trúc và thay đổi các khai báo gói trong dự án.

1

Đó là một câu hỏi cũ, nhưng tôi đã gặp phải vấn đề tương tự và đã viết một tập lệnh bash rất đơn giản. Hy vọng nó sẽ giúp ai đó.

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

Về cơ bản, kịch bản đi qua tất cả các file java bên trong một thư mục, và mỗi lần xuất hiện của package com.example.something; thay thế với package com.example.something_else;.

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