Como suprimir avisos Java para diretórios ou arquivos específicos, como código gerado


110

Estou usando um gerador de analisador que cria um código meio feio. Como resultado, meu projeto Eclipse tem várias dezenas de avisos provenientes de arquivos de origem gerados. Sei que posso usar a @SuppressWarninganotação para suprimir avisos específicos em elementos específicos, mas qualquer anotação que adicionar manualmente será perdida quando o gerador do analisador for executado novamente. Existe uma maneira de configurar o Eclipse para suprimir avisos para um arquivo ou diretório específico?


Respostas:


91

A partir da versão 3.8 M6, o Eclipse (para ser exato: o JDT) tem funcionalidade integrada para isso. É configurável por meio do caminho de construção de um projeto: Propriedades do projeto> Caminho de construção Java> Compilador> Código-fonte

insira a descrição da imagem aqui

Anunciado aqui: Eclipse 3.8 e 4.2 M6 - Novo e notável , chamado Ignorar erros / avisos seletivamente das pastas de origem . É também de onde vem a imagem. Este é o novo recurso desenvolvido no Bug 220928 anteriormente vinculado .


2
Não consegui encontrar como alternar "Não" -> "Sim" ... é o botão "Alternar" (e não editar ou outra coisa) ;-)
Betlista

@Betlista: Basta clicar duas vezes. Ou clique no botão Alternar à direita.
altumano

1
@hheimbuerger: esta solução funciona apenas para pastas de origem. Mas e se eu tiver apenas uma pasta no projeto contendo alguns arquivos XML malformados? Odeio ver avisos sobre eles :(
altumano

@altumano O recurso / opção acima vem do plugin JDT, ou seja, o suporte Java para Eclipse. (Lembre-se de que quase tudo no Eclipse é um plug-in, mesmo o suporte a Java não é incorporado.) Portanto, você terá que verificar novamente com o desenvolvedor do plug-in que usa para fazer a validação XML. IIRC, existem vários, então você provavelmente deve abrir uma nova pergunta especificamente para aquele que você está usando.
Henrik Heimbuerger

+1. A propósito, qual sistema operacional você usou? A renderização da fonte é bastante estranha.
Nome de exibição

20

Há um tíquete para isso, Bug 220928 , que já foi concluído para o Eclipse 3.8. Por favor, veja esta resposta para detalhes.

Se você estiver preso ao Eclipse 3.7 ou inferior: O usuário "Marc" comentando sobre esse tíquete criou (ou pelo menos se vincula a) um plugin chamado 'warningcleaner' em comentário 35 . Estou usando isso com muito sucesso enquanto espero que esse recurso seja integrado ao Eclipse.

É realmente muito simples:

  1. Instalar plugin.
  2. Clique com o botão direito do mouse no projeto e selecione "Adicionar / remover natureza do código gerado".
  3. Abra as configurações do projeto (clique com o botão direito e selecione "propriedades").
  4. Abra a guia 'Warning Cleaner'.
  5. Selecione as pastas de origem das quais deseja ignorar os avisos.

Captura de tela do Warning Cleaner


Infelizmente, o link para o plugin dá um 403 agora
Kutzi

1
Parece que o progresso ainda está sendo feito (lendo os comentários sobre o bug) em direção a uma implementação central. Certifique-se de atualizar a pergunta / resposta para usar números de versão específicos se o recurso for implementado. Caso contrário, os futuros usuários do Eclipse podem ficar confusos.
Chris Browne,

1
Não sinto que a pergunta / resposta possa ser melhorada atualmente, uma vez que a funcionalidade ainda não existe, mas se a funcionalidade for adicionada ao eclipse, alguém deve editar isso. Não necessariamente eu, mas se estou no lugar certo na hora certa, é claro que o farei.
Chris Browne,

5
Alguém tem um link atual para este plugin? Eu adoraria poder usá-lo!
Tom Tresansky

1
Atenção: o Eclipse agora tem uma solução integrada para isso, como você pode ver na outra resposta de hheimbuerger. A propósito, hheimbuerger, você deve refatorar esta resposta com informações atualizadas para torná-la 'oficial'.
Roberto

18

Eu resolvi isso usando o plugin maven regexp replace - ele não resolve a causa, mas cura a dor:

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

Observe que eu não consegui fazer a notação ** funcionar, então você pode ter que especificar o caminho exatamente.

Veja o comentário abaixo para uma melhoria em como não gerar @SupressWarnings duplicados


Como Maven não foi mencionado, isso não responde necessariamente à pergunta. Mas funciona muito bem no meu caso, já que uso o Maven ;-)
Kutzi

A mesma coisa pode ser feita se você estiver usando o Ant em vez do Maven, veja minha resposta.
Jorn

1
parece que ANTLR 3.4 adiciona a anotação por si só, mas eu gosto da generalidade da solução (não apenas ANTLR gera código). Para ainda aplicá-lo a todas as fontes gerados, eu uso este padrão: ^(@SuppressWarnings\(.*?\)\s+)?public class. Ao incluir a anotação no padrão, ela não é duplicada se já estiver lá.
Silly Freak

Isso (mais ou menos) funcionou para mim - eu tive que adicionar ${basedir}/antes targetna <include>tag. Parece meio desagradável, mas como só funciona em arquivos gerados, vou aceitar!
Rob

7

Acho que o melhor que você pode fazer é habilitar as configurações específicas do projeto para a exibição de avisos.

Janela -> Preferências -> Java -> Compilador -> Erros / Avisos

No topo do formulário está um link para definir as configurações específicas do projeto.


4

O usuário @Jorn sugeriu que o código Ant fizesse isso. Aqui está o que eu tenho

<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' />

Observe que o <replace> do Ant faz a substituição de texto, não a substituição de expressão regular, portanto, ele não pode usar o metacaractere ^ no token para corresponder ao início da linha como o plug-in maven regexp replace faz.

Estou fazendo isso ao mesmo tempo em que executo o Antlr do maven-antrun-plugin no meu pom Maven, porque o plugin ANTLR maven não funcionou bem com o plugin maven Cobertura.

(Eu percebo que esta não é uma resposta à pergunta original, mas não posso formatar o código Ant em um comentário / resposta a outra resposta, apenas em uma resposta)


1

Eu não acho que o Eclipse inerentemente fornece uma maneira de fazer isso no nível do diretório (mas não tenho certeza).

Você poderia fazer com que os arquivos gerados fossem para um projeto Java separado e controlar os avisos para esse projeto específico.

Eu geralmente prefiro colocar o código gerado automaticamente em um projeto separado de qualquer maneira.


1

Você só pode suprimir avisos no nível do projeto. No entanto, você pode configurar a guia de problemas para suprimir avisos de arquivos ou pacotes. Vá para o menu Configurar Conteúdo e trabalhe com o escopo "No conjunto de trabalho:".


O menu Configurar conteúdo não faz sentido para mim.
Chris Conway

Você não consegue encontrar ou não consegue descobrir onde navegar nele? Estou usando o Eclipse 3.4.1 (acho que é uma instalação do Ganymede com PyDev adicionado). Ele está localizado no canto superior direito da guia Problemas quando você clica no ícone de seta pequena para abrir o menu dessa guia.
Greg

Eu posso encontrar. Eu não entendo o que poderia resultar em alterar as configurações nessa caixa de diálogo.
Chris Conway

Eu posso ver como isso poderia funcionar, mas então você teria que usar conjuntos de trabalho, o que não é uma solução genérica. Isso aumenta o problema porque agora você precisa atualizar seu conjunto de trabalho para ver os avisos corretos.
Peter Dolberg,

1

Este pequeno script python "corrige" os .classpatharquivos gerados por M2E e adiciona a tag XML necessária a todas as pastas de origem, começando com target/generated-sources. Você pode simplesmente executá-lo da pasta raiz do seu projeto. Obviamente, você precisa executá-lo novamente quando as informações do projeto Eclipse forem geradas novamente a partir do M2E. E tudo por sua própria conta e risco, obviamente ;-)

#!/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

Estou fazendo isso com algumas gramáticas ANTLR, que geram um analisador Java usando Ant. O script de construção Ant inclui o @SuppressWarnings("all")em um arquivo Java e @Overridealguns métodos em outro. Posso pesquisar como é feito exatamente, se você estiver interessado.


Uma ideia interessante. O @SuppressWarnings não precisa vir logo antes da declaração da classe (ou seja, não é tão fácil quanto inseri-lo na primeira linha do arquivo)?
Chris Conway

Ele precisa ser colocado lá, mas é factível. Eu precisei mergulhar fundo na documentação do Ant para encontrar a função certa, mas não tenho muita experiência com o Ant.
Jorn

Consulte antlr.org/wiki/pages/viewpage.action?pageId=1865 que descreve como modificar o modelo de codegen ANTLR Java. No entanto, não está claro como fazer isso funcionar ao usar o plug-in ANTLR para Eclipse. Acho que resta hackear o jar do plugin ou usar uma das outras soluções alternativas listadas acima.
djb

0

No caso do ANTLR 2, é possível suprimir avisos no código gerado por appenidng @SuppressWarningsantes da declaração da classe no arquivo de gramática, por exemplo

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

0

Isso pode ser feito excluindo certos diretórios do caminho de construção (o exemplo a seguir é fornecido usando o Eclipse 3.5)

[1] Abra o caminho de construção Java

  • Clique no projeto no Package Explorer
  • Clique com o botão direito, propriedades
  • Selecione o caminho de construção Java

[2] Adicionar diretórios para excluir

  • A guia Fonte deve conter detalhes das pastas de fonte do projeto
  • Expanda a pasta de origem e localize a propriedade 'Excluído:'
  • Selecione 'Excluído:' e clique em Editar
  • Adicione pastas aos padrões de exclusão usando as opções Adicionar / Adicionar vários
  • Clique em Concluir e em ok para o Eclipse reconstruir.

0

Já faz um tempo desde que lancei o plugin de limpeza de avisos e agora que estou usando o Eclipse 3.8, não preciso mais dele. No entanto, para aqueles que ainda precisam desse plugin, eu o lancei no github com o site de atualização no bintray. Se você ainda estiver usando o Eclipse 3.7 ou antes, isso pode ser útil. Verifique este site para detalhes de instalação.


0

Se o projeto eclipse for gerado a partir do gradle usando o eclipse comando do plugin Eclipse, a Selectively ignore errors/warnings from source foldersopção pode ser definida adicionando-se isto no nível superior do seu build.gradlearquivo:

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

Isso pressupõe que as fontes geradas estão na build/generated/parserpasta.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.