Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ остро Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ провСрял ΠΈΡ… ΠΊΠΎΠ΄. ОсобСнно это касаСтся Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Но ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‡ΡƒΠΆΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π΄Π° ΠΈ занятиС это скучноватоС. Однако ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот аспСкт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ нСльзя, вСдь ΠΎΠ½ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ влияСт Π½Π° качСство ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, Π΄Π° ΠΈ Π½Π° качСство вас ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π² Ρ†Π΅Π»ΠΎΠΌ. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² SpotBugs: инструмСнт для статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° - 1ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ€Π΅Π²ΡŒΡŽ ΠΊΠΎΠ΄Π° β€” ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ эту Π·Π°Π΄Π°Ρ‡Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ срСдства для статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π°. Об ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ… ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ сСгодня. Для Π½Π°Ρ‡Π°Π»Π° ΡƒΡ‚ΠΎΡ‡Π½ΠΈΠΌ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Π£ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Java-компилятор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт ΠΊΠΎΠ΄, Ρ‚Π°ΠΊ Π² Ρ‡Π΅ΠΌ ΠΆΠ΅ Π΅Π³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ статичСского Π°Π½Π°Π»ΠΈΠ·Π°? БтатичСский Π°Π½Π°Π»ΠΈΠ· провСряСт Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java (скомпилированныС Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .class) Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… ошибок, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ компилятор Java лишь провСряСт исходный ΠΊΠΎΠ΄ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ синтаксичСских ошибок. Π’Π°ΠΊΠΈΠ΅ срСдства ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ»ΠΎΡ…ΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄, нСэффСктивныС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ошибки ΠΈ Ρ‚.Π΄. Они ΠΎΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‚ Тизнь Ρ€Π΅Π²ΡŒΡŽΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅ ΡƒΡ‡Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅. Если Π²Ρ‹ совсСм Π½ΠΎΠ²ΠΈΡ‡ΠΎΠΊ ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, Π΄Π°Π½Π½Ρ‹Π΅ инструмСнты Π²Π°ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ особСнно ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡΠ²Π΅Ρ‰Π°Ρ‚ΡŒ нСдостатки вашСго ΠΊΠΎΠ΄Π°, ΠΈ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡ… ΠΏΠΎΠ΄ΡΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π°. Ну Π° впослСдствии Π²Ρ‹ сами смоТСтС ΡΡ‚Π°Ρ‚ΡŒ ΠΊΡ€ΡƒΡ‚Ρ‹ΠΌ Ρ€Π΅Π²ΡŒΡŽΠ΅Ρ€ΠΎΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ всС нСдостатки ΠΊΠΎΠ΄Π°. БСгодня ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ нСбольшой ΠΎΠ±Π·ΠΎΡ€ статичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° SpotBugs.Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² SpotBugs: инструмСнт для статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° - 2SpotBugs β€” это инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ для поиска Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Он ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ статичСский Π°Π½Π°Π»ΠΈΠ·, просматривая ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π°Π½Ρ‚ΠΈΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΈΠ·ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ). Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт эти ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ автоматичСски, ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ, спасСт ΠΊΠΎΠ΄ ΠΎΡ‚ постСпСнного ΡƒΡ…ΡƒΠ΄ΡˆΠ΅Π½ΠΈΡ. Если Π½Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ этот процСсс, Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ для всСх, Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ слишком ΠΏΠΎΠ·Π΄Π½ΠΎ, вСдь ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ сотни ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ.
Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ SpotBugs Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Java вСрсии 8 ΠΈ Π²Ρ‹ΡˆΠ΅.
Π”Π°Π½Π½Ρ‹ΠΉ инструмСнт Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΡ€Π΅Π΅ΠΌΠ½ΠΈΠΊΠΎΠΌ (наслСдником) общСизвСстного статичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° FindBugs. SpotBugs ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с:
  • Ant
  • Maven
  • Gradle
  • Eclipse
Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС Ρ‡Π΅Ρ€Π΅Π· скачиваниС ΠΈ установку Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ дистрибутива. ΠœΡ‹ с Π²Π°ΠΌΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· Maven. ДобавляСм Π² Maven:
<plugin>
  <groupId>com.github.spotbugs</groupId>
  <artifactId>spotbugs-maven-plugin</artifactId>
  <version>4.2.2</version>
  <dependencies>
     <dependency>
        <groupId>com.github.spotbugs</groupId>
        <artifactId>spotbugs</artifactId>
        <version>4.2.0</version>
     </dependency>
  </dependencies>
</plugin>
Π’Π°ΠΊΠΆΠ΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² добавляСм:
<plugin>
  <artifactId>maven-project-info-reports-plugin</artifactId>
  <version>2.8</version>
</plugin>

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SpotBugs

Ну Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим основныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для SpotBugs, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ€Π΅Π· консоль МавСна:Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² SpotBugs: инструмСнт для статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° - 3(Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ консоль, Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° Π·Π½Π°Ρ‡ΠΎΠΊ m), Π›ΠΈΠ±ΠΎ Ρ‡Π΅Ρ€Π΅Π· Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» idea:Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² SpotBugs: инструмСнт для статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° - 4

1. mvn spotbugs:help

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΡΠΏΡ€Π°Π²ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки SpotBugs. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π²Ρ‹Π·ΠΎΠ²Π°:Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² SpotBugs: инструмСнт для статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° - 5Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ссли Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: mvn spotbugs:help -Ddetail=true -Dgoal=<goal-name> ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ настройках Ρ†Π΅Π»ΠΈ. Или Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ: mvn spotbugs:help -Ddetail=true ΠΈ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ±ΠΎ всСх Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… цСлях. НапримСр, я запустил mvn spotbugs:help -Ddetail=true -Dgoal=help ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ описаниС:Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² SpotBugs: инструмСнт для статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° - 6

2. mvn spotbugs:check

Данная ΠΊΠΎΠΌΠ°Π½Π΄Π° запускаСт Π°Π½Π°Π»ΠΈΠ· ΠΈ сообщаСт ΠΎ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ сборкС, Ссли ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ошибки ΠΈΠ· спСктра spotbugs. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° запуска ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² SpotBugs: инструмСнт для статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° - 7Π’ΡƒΡ‚ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ spotbugs ругаСтся Π½Π° всС Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ нСдостатки прилоТСния (Π½Π° Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΊΠΎΠ΄).

3. mvn spotbugs:spotbugs

Данная ΠΊΠΎΠΌΠ°Π½Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SpotBugs. Π‘Π΅Π· запуска Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² фактичСски Π±ΡƒΠ΄Π΅Ρ‚ бСсполСзна, Ρ‚.ΠΊ. ΠΎΠ½Π° ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ сам Π°Π½Π°Π»ΠΈΠ·. ПослС запуска Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ создаётся Ρ„Π°ΠΉΠ» spotbugsXml.xml, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ Π»Π΅ΠΆΠ°Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π°Π½Π°Π»ΠΈΠ·Π° для дальнСйшСго отобраТСния. Π’Π°ΠΊΠΆΠ΅ слСдуСт ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ запуск ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ mvn spotbugs:spotbugs сам ΠΏΠΎ сСбС Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ даст: спСрва Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ для компиляции ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° mvn clean compile, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Π½Π΅Ρ‘ β€” ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ для Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π°Ρ рассмотрСнная ΠΊΠΎΠΌΠ°Π½Π΄Π°, mvn spotbugs:check, Ρ‚Π°ΠΊΠΆΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ создаёт Ρ„Π°ΠΉΠ» spotbugsXml.xml, Π½ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ mvn spotbugs:spotbugs ΠΎΠ½Π° Π΅Ρ‰Ρ‘ ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° Π½ΠΈΠΆΠ½Π΅ΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ. Для Π°Π½Π°Π»ΠΈΠ·Π° Ρ‚Π°ΠΊΠΈΠΌ ΠΏΡƒΡ‚Ρ‘ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ спСрва Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ mvn clean compile, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ β€” mvn spotbugs:check.

4. mvn spotbugs:gui

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉ, данная ΠΊΠΎΠΌΠ°Π½Π΄Π° самая интСрСсная: ΠΎΠ½Π° запускаСт графичСский интСрфСйс SpotBugs для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π°Π½Π°Π»ΠΈΠ·Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ нСдостатки Π΅ΡΡ‚ΡŒ Π² вашСм ΠΊΠΎΠ΄Π° ΠΈ Π³Π΄Π΅ ΠΎΠ½ΠΈ находятся. Но, ΠΊΠ°ΠΊ я ΠΈ упомянул Π²Ρ‹ΡˆΠ΅, для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Ρ„Π°ΠΉΠ» spotbugsXml.xml Π² ΠΏΠ°ΠΏΠΊΠ΅ target, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаётся послС описанных Π²Ρ‹ΡˆΠ΅ манипуляций. ΠŸΡ€ΠΈ запускС Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ графичСскоС ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² SpotBugs: инструмСнт для статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° - 8Π’ΡƒΡ‚ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ класса, Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ катСгориям ΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ нСдостатки дСлятся Π½Π° Ρ‚ΠΈΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ дСлятся Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ошибок (400+).

Π’ΠΈΠΏΡ‹ ошибок

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΆΠ΅ рассмотрим ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ошибок:
  • Bad practice

    ΠΠ°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ написания ΠΊΠΎΠ΄Π°.

  • Correctness

    ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠ°Ρ ошибка ΠΊΠΎΠ΄Π°, приводящая ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π½Π΅ соотвСтствуСт замыслу Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. ΠŸΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня Π»ΠΎΠΆΠ½Ρ‹Ρ… срабатываний.

  • Experimental

    Π”Π°Π½Π½Ρ‹ΠΉ Π°Ρ€Ρ…Π΅Ρ‚ΠΈΠΏ описываСт ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ошибок (Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ замСчаниям с Π΄Π°Π½Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ошибки слСдуСт с большой ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ).

  • Internationalization

    Π’ΠΈΠΏ описываСт нСдостатки ΠΊΠΎΠ΄Π°, связанныС с ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.

  • Malicious code vulnerability

    Π”Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎ ваш ΠΊΠΎΠ΄ уязвим для Π°Ρ‚Π°ΠΊ со стороны Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

  • Multithreaded correctness

    Π’ΠΈΠΏ описываСт нСдостатки ΠΊΠΎΠ΄Π°, связанныС с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ.

  • Bogus random noise

    Π”Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для использования ΠΊΠ°ΠΊ срСдство контроля Π² экспСримСнтах ΠΏΠΎ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Π°Π½Π°Π»ΠΈΠ·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π½Π΅ для поиска Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ошибок Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ обСспСчСнии.

  • Performance

    АрхСтип Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ваш ΠΊΠΎΠ΄ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Π²Π΅Ρ€Π΅Π½, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСэффСктивным ΠΈ нуТдаСтся Π² Π½Π΅ΠΊΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

  • Security

    ВСроятно, Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ уязвимости, Π΄Ρ‹Ρ€Ρ‹ Π² систСмы бСзопасности, допустимыС ΠΊ использованию ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎ.

  • Dodgy code

    Под Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π²ΠΎΠ΄ΠΈΡ‚ Π² Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅, являСтся Π°Π½ΠΎΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ»ΠΈ написан Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкам.

ПолноС ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС ошибок Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π² этой Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² SpotBugs: инструмСнт для статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° - 9

Π€Π°ΠΉΠ»Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²

Для ΠΎΡ‚Π»ΠΎΠ²Π° шаблонов β€œΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎ кода” Π² SpotBugs ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹. По сути Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ сопоставляСт экзСмпляры ошибок ΠΏΠΎ Π½Π°Π±ΠΎΡ€Ρƒ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π². БобствСнно, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собствСнныС Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΈ шаблонов ΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ SpotBugs Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚Π»ΠΎΠ²ΠΈΡ‚ΡŒ (ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ кастомныС Ρ„Π°ΠΉΠ»Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°). Π’Π°ΠΊΠΆΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ошибки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρƒ вас Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ фиксируСтся Π² Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ ΠΊΠ°ΠΊ плохая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. Π€Π°ΠΉΠ» Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° β€” это XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ с FindBugsFilter элСмСнтом Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ количСство Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… элСмСнтов Match. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Match прСдставляСт собой ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ примСняСтся ΠΊ сгСнСрированным экзСмплярам ошибок. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ создании Ρ„Π°ΠΉΠ»Π° Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² этой Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.