2009-07-02 28 views
7

Tôi đang trong quá trình đánh giá FindBugs và đang cố gắng sử dụng excludeFilter để công cụ không xử lý các gói thử nghiệm hoặc sơ đồ ejb được tạo.Các vấn đề với FindBugs loại trừ bộ lọc

Tôi đã thử những điều sau đây:

<FindBugsFilter> 
<!-- Match any test packages --> 
<Match> 
    <Package name="~.*\.test"/> 
</Match> 
<Match> 
    <Or> 
     <Class name="~.*\.^_*"/> 
     <Class name="~.*EJS*"/> 
    </Or> 
    <Bug pattern="MALICIOUS_CODE"/> 
</Match> 

của EJB tạo vẫn đang được xem xét. Ai đó có thể cung cấp một số hướng tốt hơn về điều này.

Tôi muốn loại trừ ra khỏi tất cả các lớp học bắt đầu bằng "_"

Ví dụ:

com/mycompany/kinh doanh/admin/ejb/_AdminRemoteHome_Stub.java

com/mycompany/kinh doanh/admin/ejb/_EJSRemoteStatelessAdminHome_054d51b9_Tie.java

Đã cập nhật tệp bộ lọc.

tôi thay đổi tập tin bộ lọc để cấu trúc sau đây sử dụng những thay đổi regx gợi ý và bây giờ mọi thứ đang làm việc như mong đợi:

<FindBugsFilter> 
<!-- Match any test packages --> 
<Match> 
    <Package name="~.*\.test"/> 
</Match> 
<Match> 
    <Class name="~.*\._.*"/> 
</Match> 
<Match> 
    <Class name="~.*?EJS.*"/>  
</Match> 

Hình như tôi cần phải quay trở lại và chải lên trên của tôi regx.

+0

Các lớp học EJS có còn hiển thị không? Bạn có vấn đề với các lớp '_' bây giờ không? – VonC

Trả lời

7

Về FindBugFilter,

(chỉ để chắc chắn) bạn có chắc bạn đang xem xét việc biên soạn các file lớp directoriesa, và không phải là SourcePath? (như đã đề cập trong số này SO answer).

Từ Java element name matching phần:

Nếu thuộc tính tên của Class, Phương pháp hay Dòng bắt đầu với nhân vật ~ phần còn lại của nội dung thuộc tính được xem như là một biểu thức chính quy Java được khớp với tên của phần tử Java được đề cập.

Regex sau có chính xác hơn không?

<Class name="~.*\._.*"/> 
    <Class name="~.*?EJS.*"/> 
  • ".*\._.*" thay vì ".*\.^_*" vì anchor là nghĩa vụ phải phù hợp với lúc bắt đầu của chuỗi mô hình regex được áp dụng cho.

  • ".*?EJS.*" thay vì ".*EJS*" vì ?quantifier làm cho phù hợp với lười biếng, tránh để 'ăn' EJS. (Cộng "S*" có nghĩa là "0 hoặc n S", không có tác dụng ở đây)

+0

Tôi vừa mới sử dụng đề xuất của bạn nhưng các lớp học vẫn hiển thị trong báo cáo. – boyd4715

+0

Đây là những gì báo cáo được tạo ra: com/mycompany/kinh doanh/admin/ejb/_AdminRemoteHome_Stub.java Dòng 33 \t MALICIOUS_CODE \t Có thể khiến đại diện nội bộ bằng cách trả lại tham chiếu đến đối tượng có thể thay đổi – boyd4715

+1

Tôi có cùng một vấn đề, nó doesnt thậm chí loại trừ: HaveAGuess

1

Tệp tìm kiếm loại trừ tệp không hoạt động như trên. Tôi đang sử dụng findbugs-maven-plugin v3.0.0. Để giải quyết vấn đề này, tôi chạy một công cụ tạo ra findbugsXml.xml, sau đó được phát hành:

mvn findbugs:gui 

Điều này bắt đầu giao diện người dùng tìm kiếm. Sau đó, tôi tải tệp findbugsXml.xml, điều hướng đến các cảnh báo mà tôi muốn loại trừ, loại trừ chúng và sau đó lưu các loại trừ vào findbugs_exclude.xml. Tôi đã thêm plugin này vào plugin maven dưới dạng

<excludeFilterFile>findbugs_exclude.xml</excludeFilterFile> 

Tệp được tạo hoạt động và loại trừ thực sự bị bỏ qua khỏi báo cáo tìm kiếm.

Một mẹo tuyệt vời, tôi tìm thấy cho các plugin maven đã thêm:

<omitVisitors>UnreadFields</omitVisitors> 
0

Đó là hữu ích để nhắc rằng nếu một lớp học là nghĩa vụ phải được loại trừ, hãy cẩn thận với lớp bên trong của nó. Nó đã cho tôi thời gian để tìm ra rằng thay vì

<Match> 
    <Class name="com.some.Proto" /> <!--or com.some.Proto$.*--> 
</Match> 

tôi nên sử dụng các cấu hình sau đây với các lớp bên trong của nó được liệt kê từng người một

<Match> 
    <Or> 
    <Class name="com.some.Proto$Event" /> 
    <Class name="com.some.Proto$Msg" /> 
    <Class name="com.some.Proto$Query" /> 
    </Or> 
</Match> 

Và cho đến nay tôi vẫn chưa tìm ra cách để loại trừ một lớp và tất cả các lớp con của nó (không phải là một đầu mối trong filter), một regex đơn giản như com.some.Proto$.* chỉ không hoạt động. Và tôi cũng nhận thấy rằng $ trong regex có nghĩa là kết thúc của dòng, trong khi findbugs đọc nó như là một ký tự văn bản tôi nghĩ, nếu không nó phải có được com.some.Proto\$Query. Bên cạnh đó, một giá trị regex tester đã giúp tôi trên regex bằng cách giải thích mọi nhân vật trong đó.

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