Äskettäin hyvä ystäväni Richard Fichtner neuvoi käyttämään mvn dependency:analyze
-komentoa päästäksesi eroon ilmoitetuista, mutta käyttämättömistä riippuvuuksista:
Vaikka se oli hyvä idea vuosia sitten, se on vaarallinen neuvo tänään. Tässä viestissä haluaisin selittää, mitä laajennus tekee ja miksi sinun ei pitäisi käyttää sitä, mutta mitä yksinkertaisimmissa projekteissa.
mvn dependency:analyze
-komento
Maven käyttää laajennusarkkitehtuuria; yllä olevassa komennossa laajennus on maven-dependency-plugin . Laajennuksella on useita toisiinsa liittyviä tavoitteita . Tässä analyze
.
Analysoi tämän projektin riippuvuuksia ja määrittää, mitkä ovat: käytetty ja ilmoitettu; käytetty ja ilmoittamaton; käyttämätön ja ilmoitettu. Tämä tavoite on tarkoitettu käytettäväksi itsenäisenä, joten se suorittaa aina
test-compile
- käytä sen sijaandependency:analyze-only
-tavoitetta osallistuessasi koontiversion elinkaareen.
Oletusarvoisesti analyysin suorittamiseen käytetään
maven-dependency-analyzer
, mutta rajoitukset johtuvat siitä, että se toimii tavukooditasolla, mutta mikä tahansa analysaattori voidaan kytkeäanalyzer
kautta.
maven-dependency-analyzer
on jaettu Maven-komponentti. Sen kuvaus on melko kuvaava:
Analysoi projektin riippuvuuksia ilmoittamattomien tai käyttämättömien esineiden varalta.
Varoitus : Koska analyysi tehdään tavukoodille eikä lähteelle, joitain tapauksia ei havaita, mukaan lukien vakiot, huomautukset, joissa säilytetään vain lähdekoodi, ja linkit Javadocissa. Tämä voi johtaa vääriin tuloksiin, kun nämä ovat ainoita riippuvuuden käyttötarkoituksia.
Pääkomponentti on
ProjectDependencyAnalyzer
, joka käyttääClassAnalyzer
jaDependencyAnalyzer
.
Varoitus osoittaa selvästi, että se toimii tavukooditasolla . Siinä mainitaan erityisesti, että se ei ota huomioon lähdetason huomautuksia.
Spring Boot käynnistimet
Kuvasin oman Spring Boot -käynnistimen suunnittelua kauan sitten, eikä se ole juurikaan muuttunut sen jälkeen. Jos olet uusi Spring Bootin aloittelijoissa, tässä on yhteenveto.
SpringBoot luottaa AutoConfiguration-luokkiin. AutoConfiguration-luokat ovat tavallisia konfigurointiluokkia, eli ne vaikuttavat sovellusluokkiin. Voit määrittää erityisiä aktivointiehtoja, kuten Spring-ominaisuuden, mutta ne eivät liity automaattiseen määritykseen.
Tässä on hyvin yksinkertaistettu kulku:
Spring Bootin mukana tuleva JAR on org.springframework.boot:spring-boot-autoconfigure
. Voit tarkistaa sen META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
sisällön:
... org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.ReactiveMultipartAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.WebSessionIdResolverAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration
Tässä on esimerkkinä RestClientAutoConfiguration
:
@AutoConfiguration(after = { HttpClientAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class }) //1 @ConditionalOnClass(RestTemplate.class) //2 @Conditional(NotReactiveWebApplicationCondition.class) //3 public class RestTemplateAutoConfiguration { // Class body }
- Aseta automaattisen konfiguroinnin luokkien järjestys
- Aktivoi, jos
RestTemplate
-luokka on luokkapolulla - Aktivoi, jos emme ole reaktiivisessa verkkosovelluskontekstissa
Huomaa, että luokan latausohjelma lataa RestTemplateAutoConfiguration
-luokan hienosti riippumatta siitä, onko RestTemplate
luokka luokkapolulla vai ei! Jousi hyödyntää tätä mekanismia täysillä, kuten yllä näkyy. Käytännössä huomautuksiin määritettyjen luokkien ratkaisemista lykätään, kunnes niitä käytetään erikseen .
maven-dependency-analyzer
tuominen nykyaikaan
Committers suunnitteli analysaattorin vuonna 2007: tältä se näytti silloin. Spring Boot käynnistyi myöhemmin, vuonna 2010. Tästä syystä analysaattori ei ottanut viivästettyä luokkalatausta annotaatioissa. Huomaa, että näin ei edelleenkään ole; projekti ei saa paljon rakkautta.
Kun käytät laajennusta Spring Boot -projektissa, saat paljon vääriä positiivisia tuloksia. Kokeilin sitä yksinkertaisella Spring Boot -projektilla käyttäen WebFluxia ja R2DBC:tä PostgreSQL:ssä.
Tässä on pieni ote tuloksesta, kun suoritan mvn analyze:dependencies
:
[WARNING] Unused declared dependencies found: [WARNING] org.springframework.boot:spring-boot-starter-data-r2dbc:jar:3.4.0:compile [WARNING] org.testcontainers:postgresql:jar:1.20.4:test [WARNING] org.testcontainers:r2dbc:jar:1.20.4:test
Jos poistan jonkin näistä riippuvuuksista, testejä ei suoriteta.
Mitä tarvitaan, jotta analysaattori toimisi Spring Boot -projektien kanssa? Analysoidaan analysaattori.
Plugin mahdollistaa toisen analysaattorin määrittämisen:
Määritä käytettävä projektin riippuvuusanalysaattori (plexuskomponentin roolivinkki). Oletusarvoisesti käytetään maven-dependency-analyzeria. Jotta voit käyttää tätä, sinun on ilmoitettava riippuvuus tälle laajennukselle, joka sisältää analysaattorin koodin. Analysaattorilla on oltava ilmoitettu Plexus-roolin nimi, ja määrität roolin nimen tässä.
Tyyppi :
java.lang.String
Alkaen :
2.2
Pakollinen :
No
Käyttäjän ominaisuus :
analyzer
Oletus :
default
Voimme luoda kokonaisanalysaattorin, joka käyttää yllä olevaa uudelleen, mutta lisää yhden Spring Bootiin.
Johtopäätös
Maven-analysaattorin nykyinen tila ei tarjoa mitään hyötyä nykyaikaisille Spring Boot -projekteille. Olemassa oleva koodi on avoin määrityksille ja jopa laajennuksille. Meidän olisi kuitenkin upotettava paljon Spring Boot -logiikkaa. Quarkus- ja Micronaut-projekteissa tarvitsisimme myös erillisen koodin.
En tiedä, onko se ajan ja vaivan arvoista. Jos luulet niin, toivon, että tämä blogikirjoitus voi toimia varhaisen vaiheen analyysinä.
Jos haluat mennä pidemmälle:
- riippuvuus: analysoida
- Maven Dependency Analyzer
- Oman Spring Boot -käynnistimen suunnittelu – osa 1
- Oman Spring Boot -käynnistimen suunnittelu – osa 2
Julkaistu alun perin A Java Geekissä 9. maaliskuuta 2025