291 skaitymai

„Maven“ priklausomybės analizatoriaus naudojimas norint atsikratyti nepanaudotų priklausomybių yra pavojingas patarimas šiandien

pateikė Nicolas Fränkel4m2025/03/13
Read on Terminal Reader

Per ilgai; Skaityti

Dabartinė Maven analizatoriaus būsena nesuteikia jokios naudos šiuolaikiniams Spring Boot projektams.
featured image - „Maven“ priklausomybės analizatoriaus naudojimas norint atsikratyti nepanaudotų priklausomybių yra pavojingas patarimas šiandien
Nicolas Fränkel HackerNoon profile picture


Neseniai mano geras draugas Richardas Fichtneris patarė naudoti komandą mvn dependency:analyze , kad atsikratytumėte deklaruotų, bet nepanaudotų priklausomybių:

Nors prieš daugelį metų tai buvo puiki idėja, šiandien tai pavojingas patarimas. Šiame įraše norėčiau paaiškinti, ką daro papildinys ir kodėl neturėtumėte jo naudoti, bet paprasčiausiuose projektuose.

Komanda mvn dependency:analyze

Maven naudoja papildinio architektūrą; aukščiau pateiktoje komandoje papildinys yra maven-dependency-plugin . Papildinys turi keletą susijusių tikslų . Čia yra analyze .


Analizuoja šio projekto priklausomybes ir nustato, kurios yra: naudojamos ir deklaruojamos; naudotas ir nedeklaruotas; nenaudotas ir deklaruotas. Šis tikslas yra skirtas naudoti atskirai, todėl jis visada vykdo test-compile etapą – dalyvaudami kūrimo cikle naudokite dependency:analyze-only tikslą.


Pagal numatytuosius nustatymus analizei atlikti naudojamas maven-dependency-analyzer su apribojimais dėl to, kad jis veikia baito kodo lygiu, tačiau bet kurį analizatorių galima prijungti per analyzer parametrą.


-- priklausomybė: analizuoti


maven-dependency-analyzer yra bendras „Maven“ komponentas. Jo aprašymas yra gana aprašomasis:


Analizuoja projekto priklausomybes nuo nedeklaruotų ar nepanaudotų artefaktų.

Įspėjimas : kadangi analizė atliekama pagal baitinį kodą , o ne į šaltinį, kai kurie atvejai neaptinkami, įskaitant konstantas, komentarus su tik šaltinio išsaugojimu ir nuorodas „Javadoc“. Tai gali lemti neteisingus rezultatus, kai tai yra vieninteliai priklausomybės būdai.


Pagrindinis komponentas yra ProjectDependencyAnalyzer , kuris naudoja ClassAnalyzer ir DependencyAnalyzer .


-- Maven-dependency-analyzer


Įspėjimas aiškiai rodo, kad jis veikia baito kodo lygiu. Konkrečiai, jame aiškiai paminėta, kad neatsižvelgiama į šaltinio lygio anotacijas.

Spring Boot starteriai

Jau seniai aprašiau, kaip sukurti savo „Spring Boot“ starterį , ir nuo to laiko jis beveik nepasikeitė. Jei nesate naujokas „Spring Boot“, pateikiame santrauką.


„SpringBoot“ remiasi „AutoConfiguration“ klasėmis. AutoConfiguration klasės yra įprastos konfigūracijos klasės, ty jos prisideda prie taikomųjų programų klasių. Galite nustatyti konkrečius aktyvinimo kriterijus, pvz., pavasario ypatybės buvimą, tačiau jie nėra būdingi automatinei konfigūracijai.


Štai labai supaprastinta eiga:


Supaprastinta „Spring Boot“ automatinio konfigūravimo sekos schema


JAR, kuris automatiškai pateikiamas kartu su Spring Boot, yra org.springframework.boot:spring-boot-autoconfigure . Galite patikrinti jo META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports turinį:


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


Pavyzdžiui, čia yra „ RestClientAutoConfiguration :


 @AutoConfiguration(after = { HttpClientAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class }) //1 @ConditionalOnClass(RestTemplate.class) //2 @Conditional(NotReactiveWebApplicationCondition.class) //3 public class RestTemplateAutoConfiguration { // Class body }
  1. Nustatykite automatinės konfigūracijos klasių tvarką
  2. Suaktyvinkite, jei klasė RestTemplate yra klasės kelyje
  3. Suaktyvinkite, jei nesame reaktyviosios žiniatinklio programos kontekste


Atminkite, kad klasės įkroviklis puikiai įkelia RestTemplateAutoConfiguration klasę, nepaisant to, ar „ RestTemplate klasė yra klasės kelyje, ar ne! Spyruoklė išnaudoja šį mechanizmą iki galo, kaip matyti aukščiau. Tiesą sakant, anotacijose sukonfigūruotų klasių raiška atidedama, kol jos bus aiškiai pasiekiamos.

maven-dependency-analyzer perkėlimas į šiuolaikinį amžių

„Committers“ analizatorių sukūrė 2007 m.: štai kaip jis atrodė tada. „Spring Boot“ prasidėjo vėliau, 2010 m. Dėl šios priežasties analizatorius nepriėmė atidėto klasės įkėlimo anotacijose. Atkreipkite dėmesį, kad taip nėra; projektas nesulaukia daug meilės.


Naudodami papildinį „Spring Boot“ projekte gausite daug klaidingų teigiamų rezultatų. Išbandžiau tai su paprastu Spring Boot projektu, naudodamas „WebFlux“ ir „R2DBC“ sistemoje „PostgreSQL“.


Štai nedidelė išvesties ištrauka, kai paleidžiu 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


Jei pašalinsiu kurią nors iš šių priklausomybių, testai nebus vykdomi.


Ko reikėtų, kad analizatorius veiktų su Spring Boot projektais? Išanalizuokime analizatorių.


Analizatoriaus klasių diagrama


Papildinys leidžia konfigūruoti kitą analizatorių:


Nurodykite naudojamą projekto priklausomybės analizatorių (plexus komponento vaidmens užuomina). Pagal numatytuosius nustatymus naudojamas maven-dependency-analyzer. Norėdami tai naudoti, turite deklaruoti šio papildinio, kuriame yra analizatoriaus kodas, priklausomybę. Analizatorius turi turėti deklaruotą „Plexus“ vaidmens pavadinimą ir čia nurodykite vaidmens pavadinimą.


  • Tipas : java.lang.String

  • Nuo : 2.2

  • Reikalingas : No

  • Vartotojo ypatybė : analyzer

  • Numatytasis : default


-- priklausomybė: analizuoti


Galime sukurti bendrą analizatorių, kuris pakartotinai naudoja pirmiau minėtus dalykus, bet prideda specialų „Spring Boot“.

Išvada

Dabartinė Maven analizatoriaus būsena nesuteikia jokios naudos šiuolaikiniams Spring Boot projektams. Esamas kodas yra atviras konfigūracijai ir netgi pratęsimui. Tačiau turėtume įterpti daug „Spring Boot“ logikos. Quarkus ir Micronaut projektams taip pat reikės specialaus kodo.


Nežinau, ar verta skirti laiko ir pastangų. Jei manote, kad taip, tikiuosi, kad šis tinklaraščio įrašas gali pasitarnauti kaip ankstyvoji analizė.


Norėdami eiti toliau:





Iš pradžių paskelbta „A Java Geek“ 2025 m. kovo 9 d

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks