Implementação do SpotBugs Plugin
Criação do projeto Maven
Use spotbugs-archetype para criar o projeto Maven. Então, a arquitetura do Maven plugin pede para que você informe o groupId, artifactId, package e versão inicial do plugin.
$ mvn archetype:generate \
-DarchetypeArtifactId=spotbugs-archetype \
-DarchetypeGroupId=com.github.spotbugs \
-DarchetypeVersion=0.4.11
Escrita do código Java para representar o bug a ser encontrado
In generated project, you can find a file named as BadCase.java. Update this file to represent the target bug to find.
Se você tem muitos padrões a serem representados, adicione mais classes no diretório src/test/java.
Escreva casos de teste para garantir que seu detector pode encontrar bugs
In generated project, you can find another file named as MyDetectorTest.java.
The spotbugs.performAnalysis(Path) in this test runs SpotBugs with your plugin, and return all found bugs (here 1st argument of this method is a path of class file compiled from BadCase.java).
Você pode usar BugInstanceMatcher para verificar que seu plugin pode encontrar bug como o esperado.
Atualmente, esse teste deve falhar, porque não atualizamos o detector ainda.
Escrita de código Java para evitar falso-positivos
Para evitar falso positivos, é bom garantir os casos em que o detector NÃO deve encontrar um bug.
Update GoodCase.java in your project, and represent such cases.
After that, add a test method into MyDetectorTest.java which verify that no bug found from this GoodCase class.
Se você tem muitos padrões a serem representados, adicione mais classes no diretório src/test/java.
Atualize o detector para passar em todos os testes de unidade
Agora você tem testes que garantem que seu detector funciona como o esperado.
Nota
TBU
Qual super classe você deve escolher
- AnnotationDetector
Um detector base que analisa anotações em classes, campos, métodos e parâmetros de método.
- BytecodeScanningDetector
Um detector base que analisa Java bytecode em arquivos de classe.
- OpcodeStackDetector
Sub class of
BytecodeScanningDetector, which can scan the bytecode of a method and use an operand stack.
Atualizar o findbugs.xml
O SpotBugs lê o arquivo findbugs.xml em cada plugin para encontrar os detectores e bugs.Portanto, ao adicionar um novo detector, você precisa adicionar o novo elemento <Detector> da seguinte maneira :
<Detector class="com.github.plugin.MyDetector" reports="MY_BUG" speed="fast" />
Você também precisa adicionar <BugPattern> para descrever o tipo e a categoria do padrão de bug.
<BugPattern type="MY_BUG" category="CORRECTNESS" />
você pode encontrar o arquivo findbugs.xml no diretório src/main/resources do projeto Maven gerado
Atualizar messages.xml
O SpotBugs lê o arquivo messages.xml em cada plugin e cria uma mensagem legível por humanos para relatar os bugs detectados. Além disso, ele também suporta a leitura de mensagens localizadas em messages_ja.xml, messages_fr.xml e etc.
Você pode encontrar o arquivo messages.xml no diretório src/main/resources do projeto Maven gerado.
Atualizar a mensagem do Detector
Você pode adicionar uma mensagem descritiva no elemento <Detector>. Observe que a mensagem deve ser texto simples, HTML não é suportado.
<Detector class="com.github.plugin.MyDetector">
<Details>
Original detector to detect MY_BUG bug pattern.
</Details>
</Detector>
Atualizar a mensagem de Bug Pattern
Você pode adicionar uma mensagem descritiva no elemento <BugPattern>. Há três tipos de mensagens:
- ShortDescription
Apresenta uma breve descrição de um padrão de bug. Essa mensagem é útil para comunicar as intenções e o caráter para os usuários. Deve ser texto simples e HTML não é compatível.
- LongDescription
Apresenta uma descrição mais longa do padrão de bug. Você pode usar um espaço reservado como
{0}(0-índice) e os dados de BugInstance serão inseridos nesse espaço. Portanto, oLongDescriptioné útil para fornecer informações detalhadas sobre os bugs encontradosDeve ser texto simples e HTML não é compatível.
- Detalhes
Uma descrição detalhada do padrão de bug. Deve estar no formato HTML para comunicar especificações/exemplos detalhados em tabelas, listas e fragmentos de código.
<BugPattern type="MY_BUG">
<ShortDescription>Explain bug pattern shortly.</ShortDescription>
<LongDescription>
Explain existing problem in code, and how developer should improve their implementation.
</LongDescription>
<Details>
<![CDATA[
<p>Explain existing problem in code, and how developer should improve their implementation.</p>
]]>
</Details>
</BugPattern>