Cách ngăn chặn cảnh báo Java cho các thư mục hoặc tệp cụ thể, chẳng hạn như mã được tạo


110

Tôi đang sử dụng trình tạo phân tích cú pháp tạo ra mã hơi xấu. Kết quả là dự án Eclipse của tôi có hàng chục cảnh báo phát ra từ các tệp nguồn được tạo. Tôi biết tôi có thể sử dụng @SuppressWarningchú thích để loại bỏ các cảnh báo cụ thể trong các phần tử cụ thể, nhưng bất kỳ chú thích nào tôi thêm bằng tay sẽ bị mất khi trình tạo phân tích cú pháp chạy lại. Có cách nào để cấu hình Eclipse để ngăn chặn các cảnh báo cho một tệp hoặc thư mục cụ thể không?


Câu trả lời:


91

Bắt đầu với phiên bản 3.8 M6, Eclipse (chính xác là: JDT) đã tích hợp sẵn chức năng cho việc này. Nó có thể được cấu hình thông qua đường dẫn xây dựng của một dự án: Thuộc tính dự án> Đường dẫn xây dựng Java> Trình biên dịch> Nguồn

nhập mô tả hình ảnh ở đây

Được công bố ở đây: Eclipse 3.8 và 4.2 M6 - Mới và đáng chú ý , được gọi là Bỏ qua có chọn lọc các lỗi / cảnh báo từ các thư mục nguồn . Đó cũng là nơi chụp ảnh chụp màn hình. Đây là tính năng mới được phát triển trên Bug 220928 được liên kết trước đó .


2
Tôi không thể tìm thấy cách chuyển "Không" -> "Có" ... đó là nút "Chuyển đổi" (và không chỉnh sửa hoặc thứ gì khác) ;-)
Betlista

@Betlista: Chỉ cần nhấp đúp vào nó. Hoặc nhấp vào nút Toggle ở ​​bên phải.
altumano

1
@hheimbuerger: giải pháp này chỉ hoạt động cho các thư mục nguồn. Nhưng điều gì sẽ xảy ra nếu tôi chỉ có một thư mục trong dự án chứa một số tệp XML không đúng định dạng? Tôi ghét nhìn thấy những cảnh báo về chúng :(
altumano

@altumano Tính năng / tùy chọn trên đến từ plugin JDT, tức là hỗ trợ Java cho Eclipse. (Hãy nhớ rằng hầu hết mọi thứ trong Eclipse đều là một plugin, ngay cả hỗ trợ Java cũng không được tích hợp sẵn.) Vì vậy, bạn phải kiểm tra lại với nhà phát triển của plugin mà bạn sử dụng để thực hiện xác thực XML. IIRC, có rất nhiều, vì vậy bạn có thể nên mở một câu hỏi mới dành riêng cho câu hỏi bạn đang sử dụng.
Henrik Heimbuerger

+1. Nhân tiện, bạn đã sử dụng hệ điều hành nào? Kết xuất phông chữ khá lạ.
Tên hiển thị

20

Có một vé cho điều này, Bug 220928 , đã được hoàn thành cho Eclipse 3.8. Vui lòng xem câu trả lời này để biết chi tiết.

Nếu bạn gặp khó khăn với Eclipse 3.7 hoặc thấp hơn: Người dùng "Marc" nhận xét về vé đó đã tạo (hoặc ít nhất là liên kết đến) một plugin có tên 'warningcleaner' trong nhận xét 35 . Tôi đang sử dụng nó với rất nhiều thành công trong khi chờ tính năng này được tích hợp vào Eclipse.

Nó thực sự khá đơn giản:

  1. Cài đặt plugin.
  2. Nhấp chuột phải vào dự án và chọn "Thêm / xóa bản chất mã đã tạo".
  3. Mở cài đặt dự án (nhấp chuột phải và chọn "thuộc tính").
  4. Mở tab 'Trình dọn dẹp Cảnh báo'.
  5. Chọn các thư mục nguồn mà bạn muốn bỏ qua các cảnh báo.

Ảnh chụp màn hình Warning Cleaner


Thật không may, liên kết đến plugin hiện là 403
Kutzi

1
Có vẻ như tiến trình vẫn đang được thực hiện (đọc các nhận xét về lỗi) hướng tới việc triển khai cốt lõi. Đảm bảo cập nhật câu hỏi / câu trả lời để sử dụng số phiên bản cụ thể nếu tính năng được triển khai. Nếu không, những người dùng Eclipse trong tương lai có thể bị nhầm lẫn.
Chris Browne

1
Tôi không cảm thấy câu hỏi / câu trả lời hiện có thể được cải thiện, vì chức năng này vẫn chưa tồn tại, nhưng nếu chức năng đã từng được thêm vào nhật thực thì ai đó nên chỉnh sửa điều này. Không nhất thiết là tôi, nhưng nếu tôi ở đúng nơi, đúng lúc thì tất nhiên tôi sẽ làm như vậy.
Chris Browne,

5
Có ai có liên kết hiện tại đến plugin này không? Tôi rất muốn có thể sử dụng nó!
Tom Tresansky

1
Chú ý: Eclipse hiện có một giải pháp tích hợp cho việc này, như bạn có thể thấy trong câu trả lời khác từ hheimbuerger. Nhân tiện, hheimbuerger, bạn nên cấu trúc lại câu trả lời này với thông tin cập nhật để biến nó thành 'chính thức'.
Roberto

18

Tôi đã giải quyết vấn đề này bằng cách sử dụng plugin thay thế maven regexp - nó không giải quyết được nguyên nhân, nhưng chữa lành nỗi đau:

<plugin>
  <groupId>com.google.code.maven-replacer-plugin</groupId>
  <artifactId>maven-replacer-plugin</artifactId>
  <version>1.3.2</version>
  <executions>
<execution>
  <phase>prepare-package</phase>
  <goals>
    <goal>replace</goal>
  </goals>
</execution>
  </executions>
  <configuration>
<includes>
  <include>target/generated-sources/antlr/**/*.java</include>
</includes>

<regex>true</regex>
<regexFlags>
  <regexFlag>MULTILINE</regexFlag>
</regexFlags>

<replacements>
  <replacement>
    <token>^public class</token>
    <value>@SuppressWarnings("all") public class</value>
  </replacement>
</replacements>
  </configuration>
</plugin>

Lưu ý rằng tôi đã không quản lý để ký hiệu ** hoạt động, vì vậy bạn có thể phải chỉ định chính xác đường dẫn.

Xem bình luận bên dưới để biết cải tiến về cách không tạo @SupressWarnings trùng lặp


Vì Maven không được đề cập, điều này không nhất thiết trả lời câu hỏi. Nhưng nó hoạt động tốt trong trường hợp của tôi, như tôi đã sử dụng Maven ;-)
Kutzi

Điều tương tự có thể được thực hiện nếu bạn đang sử dụng Ant thay vì Maven, hãy xem câu trả lời của tôi.
Jorn

1
Có vẻ như ANTLR 3.4 tự thêm chú thích, nhưng tôi thích tính tổng quát của giải pháp (không chỉ ANTLR tạo mã). Để vẫn áp dụng nó cho tất cả các nguồn tạo ra, tôi sử dụng mô hình này: ^(@SuppressWarnings\(.*?\)\s+)?public class. Bằng cách bao gồm chú thích trong mẫu, nó sẽ không bị trùng lặp nếu nó đã ở đó.
Silly Freak

Điều này (ít nhiều) đã làm việc cho tôi - tôi phải thêm ${basedir}/trước đó targettrong <include>thẻ. Cảm thấy hơi buồn cười, nhưng vì nó chỉ hoạt động trên các tệp đã tạo, tôi sẽ chấp nhận!
Rob

7

Tôi nghĩ điều tốt nhất bạn có thể làm là bật cài đặt cụ thể của dự án để hiển thị cảnh báo.

Window -> Preferences -> Java -> Compiler -> Errors / Warnings

Trên đầu biểu mẫu là một liên kết để định cấu hình các cài đặt cụ thể của dự án.


4

Người dùng @Jorn đã gợi ý về mã Ant để làm điều này. Đây là những gì tôi có

<echo>Adding @SuppressWarnings("all") to ANTLR generated parser/lexer *.java</echo>
<echo> in ${project.build.directory}/generated-sources/antlr/</echo>
<replace dir="${project.build.directory}/generated-sources/antlr/" 
         summary="true" 
         includes="**/*.java" 
         token="public class" 
         value='@SuppressWarnings("all") public class' />

Lưu ý rằng <replace> của Ant thực hiện thay thế văn bản chứ không phải thay thế biểu thức chính quy, vì vậy nó không thể sử dụng ký tự ^ meta trong mã thông báo để khớp với đầu dòng như plugin thay thế maven regexp.

Tôi đang thực hiện việc này cùng lúc khi tôi chạy Antlr từ maven-antrun-plugin trong Maven pom của mình, vì plugin ANTLR maven không hoạt động tốt với plugin Cobertura maven.

(Tôi nhận thấy đây không phải là câu trả lời cho câu hỏi ban đầu, nhưng tôi không thể định dạng mã Ant trong một nhận xét / trả lời cho một câu trả lời khác, chỉ trong một câu trả lời)


1

Tôi không nghĩ rằng Eclipse vốn cung cấp một cách để thực hiện việc này ở cấp thư mục (nhưng tôi không chắc).

Bạn có thể để các tệp đã tạo đi vào một dự án Java riêng biệt và kiểm soát các cảnh báo cho dự án cụ thể đó.

Tôi thường thích đặt mã được tạo tự động trong một dự án riêng biệt.


1

Bạn chỉ có thể chặn cảnh báo ở cấp độ dự án. Tuy nhiên, bạn có thể định cấu hình tab sự cố của mình để ngăn chặn cảnh báo từ tệp hoặc gói. Vào menu Cấu hình Nội dung và làm việc với phạm vi "Trên bộ làm việc:".


Menu Cấu hình Nội dung không có ý nghĩa gì đối với tôi.
Chris Conway

Bạn không thể tìm thấy nó hoặc bạn không thể tìm ra nơi để điều hướng trong nó? Tôi đang sử dụng Eclipse 3.4.1 (Tôi nghĩ đó là bản cài đặt Ganymede có thêm PyDev). Nó nằm ở góc trên bên phải của tab Vấn đề khi bạn nhấp vào biểu tượng mũi tên nhỏ để thả xuống menu cho tab đó.
Greg

Tôi có thể tìm nó. Tôi không hiểu việc thay đổi cài đặt trong hộp thoại đó sẽ đạt được kết quả gì.
Chris Conway

Tôi có thể thấy điều này có thể hoạt động như thế nào, nhưng sau đó bạn phải sử dụng các bộ làm việc, đây không phải là một giải pháp chung. Nó thêm vào vấn đề vì bây giờ bạn phải cập nhật bộ làm việc của mình để xem các cảnh báo phù hợp.
Peter Dolberg

1

Tôi đang làm điều này với một số ngữ pháp ANTLR, tạo ra trình phân tích cú pháp Java bằng Ant. Tập lệnh xây dựng Ant thêm @SuppressWarnings("all")vào một tệp Java và @Overridemột vài phương thức trong một tệp khác. Tôi có thể tra cứu cách nó được thực hiện chính xác, nếu bạn quan tâm.


Một ý tưởng thú vị. @SuppressWarnings không cần phải xuất hiện ngay trước khai báo lớp (tức là, không dễ như chèn nó vào dòng đầu tiên của tệp)?
Chris Conway

Nó cần phải được đặt ở đó, nhưng nó có thể làm được. Tôi cần phải đi sâu vào tài liệu về kiến ​​để tìm ra chức năng phù hợp, nhưng tôi không có nhiều kinh nghiệm về Ant.
Jorn 14/07/09

Xem antlr.org/wiki/pages/viewpage.action?pageId=1865 mô tả cách sửa đổi mẫu mã nguồn Java ANTLR. Tuy nhiên, không rõ làm thế nào để làm cho điều đó hoạt động khi sử dụng plugin ANTLR cho Eclipse. Tôi đoán rằng một trong những cách còn lại là hack jar plugin hoặc sử dụng một trong những cách giải quyết khác được liệt kê ở trên.
djb

1

Tập lệnh python nhỏ này "vá" các .classpathtệp do M2E tạo và thêm thẻ XML cần thiết vào tất cả các thư mục nguồn bắt đầu bằng target/generated-sources. Bạn chỉ có thể chạy nó từ thư mục gốc của dự án. Rõ ràng là bạn cần chạy lại nó khi thông tin dự án Eclipse được tạo lại từ M2E. Và tất cả đều có rủi ro của riêng bạn, rõ ràng ;-)

#!/usr/bin/env python
from xml.dom.minidom import parse
import glob
import os

print('Reading .classpath files...')
for root, dirs, files in os.walk('.'):
    for name in files:
        if (name == '.classpath'):
            classpathFile = os.path.join(root, name)
            print('Patching file:' + classpathFile)
            classpathDOM = parse(classpathFile)
            classPathEntries = classpathDOM.getElementsByTagName('classpathentry')
            for classPathEntry in classPathEntries:
                if classPathEntry.attributes["path"].value.startswith('target/generated-sources'):
                    # ensure that the <attributes> tag exists
                    attributesNode = None;
                    for attributes in classPathEntry.childNodes:
                            if (attributes.nodeName == 'attributes'):
                                attributesNode = attributes

                    if (attributesNode == None):
                        attributesNode = classpathDOM.createElement('attributes')
                        classPathEntry.appendChild(attributesNode)

                    # search if the 'ignore_optional_problems' entry exists
                    hasBeenSet = 0
                    for node in attributesNode.childNodes:
                        if (node.nodeName == 'attribute' and node.getAttribute('name') == 'ignore_optional_problems'):
                            # it exists, make sure its value is true
                            node.setAttribute('value','true')
                            #print(node.getAttribute('name'))
                            hasBeenSet = 1

                    if (not(hasBeenSet)):
                        # it does not exist, add it
                        x = classpathDOM.createElement("attribute")
                        x.setAttribute('name','ignore_optional_problems')
                        x.setAttribute('value','true')
                        attributesNode.appendChild(x)

            try:
                f = open(classpathFile, "w") 
                classpathDOM.writexml(f)
                print('Writing file:' + classpathFile)
            finally:
                f.close()
print('Done.')

0

Trong trường hợp ANTLR 2, có thể chặn cảnh báo trong mã được tạo bởi appenidng @SuppressWarningstrước khi khai báo lớp trong tệp ngữ pháp, ví dụ:

{@SuppressWarnings("all")} class MyBaseParser extends Parser;

0

Điều này có thể được thực hiện bằng cách loại trừ một số thư mục nhất định khỏi đường dẫn xây dựng (Ví dụ sau được đưa ra bằng Eclipse 3.5)

[1] Đưa ra Đường dẫn xây dựng Java

  • Nhấp vào Trình khám phá gói projectin
  • Nhấp chuột phải, thuộc tính
  • Chọn đường dẫn xây dựng Java

[2] Thêm thư mục để loại trừ

  • Tab Nguồn phải chứa thông tin chi tiết về các thư mục nguồn của dự án
  • Mở rộng thư mục nguồn và tìm thuộc tính 'Đã loại trừ:'
  • Chọn 'Bị loại trừ:' và nhấp vào Chỉnh sửa
  • Thêm các thư mục vào các mẫu Loại trừ bằng cách sử dụng các tùy chọn Thêm / Thêm Nhiều
  • Nhấp vào Kết thúc, sau đó đồng ý để Eclipse xây dựng lại.

0

Đã một thời gian kể từ khi tôi phát hành plugin dọn dẹp cảnh báo và bây giờ tôi đang sử dụng Eclipse 3.8, tôi không cần nó nữa. Tuy nhiên, đối với những người vẫn cần plugin này, tôi đã phát hành nó trên github với trang web cập nhật trên bintray. Nếu bạn vẫn đang sử dụng Eclipse 3.7 trở về trước, điều này có thể hữu ích. Kiểm tra trang web này để biết chi tiết cài đặt.


0

Nếu dự án nhật thực được tạo từ gradle bằng lệnh của plugin Eclipse, tùy chọn có thể được đặt bằng cách thêm tùy chọn này vào cấp cao nhất của tệp của bạn :eclipseSelectively ignore errors/warnings from source foldersbuild.gradle

eclipse.classpath.file {
    whenMerged { classpath ->
        classpath.entries.each { entry -> 
            if (entry.path.contains('build/generated/parser')) {
                entry.entryAttributes['ignore_optional_problems'] = true
            }
        }
    }
}

Điều này giả định rằng các nguồn được tạo nằm trong build/generated/parserthư mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.