paint-brush
„Maven“ priklausomybės analizatoriaus naudojimas norint atsikratyti nepanaudotų priklausomybių yra pavojingas patarimas šiandienpateikė@nfrankel
Nauja istorija

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

pateikė Nicolas Fränkel
Nicolas Fränkel HackerNoon profile picture

Nicolas Fränkel

@nfrankel

Developer Advocate, eternal learner, author

4 min read2025/03/13
Read on Terminal Reader
Read this story in a terminal
Print this story
tldt arrow
lt-flagLT
Skaitykite šią istoriją lietuvių kalba!
en-flagEN
Read this story in the original language, English!
es-flagES
Lee esta historia en Español!
zh-flagZH
用繁體中文閱讀這個故事!
ja-flagJA
この物語を日本語で読んでください!
qu-flagQU
Ñawinchay kay willakuyta en quechua!
ht-flagHT
Li istwa sa a an kreyòl ayisyen!
cs-flagCS
Přečtěte si tento příběh v češtině!
fa-AF-flagFA-AF
این داستان را به زبان دری بخوانید!
nl-flagNL
Lees dit verhaal in het Nederlands!
bg-flagBG
Прочетете тази история на български!
fi-flagFI
Lue tämä tarina suomeksi!
lv-flagLV
Izlasi šo stāstu latviešu valodā!
LT

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
Nicolas Fränkel

Nicolas Fränkel

@nfrankel

Developer Advocate, eternal learner, author


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


article preview
BLUESKY SOCIAL

Richard Fichtner 💻☕ (@richard.fichtner.dev)

There is another use case for mvn dependency:analyze It can show you the dependencies you use in your code but have not declared in your pom.xml. This works because you have a transitive dependency on your classpath. Either don't use the dependency or declare it.

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

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

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

L O A D I N G
. . . comments & more!

About Author

Nicolas Fränkel HackerNoon profile picture
Nicolas Fränkel@nfrankel
Developer Advocate, eternal learner, author

PABAIGTI ŽYMES

ŠIS STRAIPSNIS BUVO PRISTATYMAS...

Read on Terminal Reader
Read this story in a terminal
 Terminal
Read this story w/o Javascript
Read this story w/o Javascript
 Lite
Also published here
X REMOVE AD