291 lasījumi

Maven atkarības analizatora izmantošana, lai atbrīvotos no neizmantotajām atkarībām, šodien ir bīstams padoms

autors Nicolas Fränkel4m2025/03/13
Read on Terminal Reader

Pārāk ilgi; Lasīt

Pašreizējais Maven analizatora stāvoklis nesniedz nekādu labumu mūsdienu Spring Boot projektiem.
featured image - Maven atkarības analizatora izmantošana, lai atbrīvotos no neizmantotajām atkarībām, šodien ir bīstams padoms
Nicolas Fränkel HackerNoon profile picture


Nesen mans labs draugs Ričards Fihtners ieteica izmantot komandu mvn dependency:analyze , lai atbrīvotos no deklarētajām, bet neizmantotajām atkarībām:

Lai gan pirms gadiem tā bija lieliska ideja, šodien tas ir bīstams padoms. Šajā ziņojumā es vēlētos paskaidrot, ko dara spraudnis un kāpēc to nevajadzētu izmantot, bet gan visvienkāršākajos projektos.

Komanda mvn dependency:analyze

Maven izmanto spraudņa arhitektūru; iepriekš minētajā komandā spraudnis ir maven-dependency-plugin . Spraudnis mitina vairākus saistītus mērķus . Lūk, tā ir analyze .


Analizē šī projekta atkarības un nosaka, kuras ir: izmantotas un deklarētas; lietots un nedeklarēts; neizmantota un deklarēta. Šis mērķis ir paredzēts lietošanai atsevišķi, tāpēc tas vienmēr izpilda test-compile fāzi — tā vietā izmantojiet dependency:analyze-only mērķi, piedaloties būvējuma dzīves ciklā.


Pēc noklusējuma analīzes veikšanai tiek izmantots maven-dependency-analyzer ar ierobežojumiem, jo tas darbojas baitu koda līmenī, taču jebkuru analizatoru var pievienot, izmantojot analyzer parametru.


-- atkarība: analizēt


maven-dependency-analyzer ir kopīgs Maven komponents. Tās apraksts ir diezgan aprakstošs:


Analizē projekta atkarības attiecībā uz nedeklarētiem vai neizmantotiem artefaktiem.

Brīdinājums : tā kā analīze tiek veikta baitkodam , nevis avotam, daži gadījumi netiek atklāti, tostarp konstantes, anotācijas ar tikai avota saglabāšanu un saites Javadoc. Tas var novest pie nepareiziem rezultātiem, ja tie ir vienīgie atkarības lietojumi.


Galvenais komponents ir ProjectDependencyAnalyzer , kas izmanto ClassAnalyzer un DependencyAnalyzer .


-- Maven-dependency-analyzer


Brīdinājums skaidri parāda, ka tas darbojas baitu koda līmenī. Jo īpaši tajā ir skaidri norādīts, ka tajā netiek ņemtas vērā avota līmeņa anotācijas.

Spring Boot starteri

Es jau sen aprakstīju, kā izveidot savu Spring Boot starteri , un kopš tā laika tas nav daudz mainījies. Ja esat iesācējs Spring Boot iesācējiem, šeit ir kopsavilkums.


SpringBoot paļaujas uz automātiskās konfigurācijas klasēm. Automātiskās konfigurācijas klases ir parastas konfigurācijas klases, ti , tās papildina lietojumprogrammu klases. Varat iestatīt konkrētus aktivizācijas kritērijus, piemēram, Spring rekvizīta klātbūtni, taču tie neattiecas uz automātisko konfigurāciju.


Šeit ir ļoti vienkāršota plūsma:


Vienkāršota Spring Boot automātiskās konfigurācijas secības diagramma


JAR, kas automātiski tiek piegādāts kopā ar Spring Boot, ir org.springframework.boot:spring-boot-autoconfigure . Varat pārbaudīt tā META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports saturu:


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


Piemēram, šeit ir RestClientAutoConfiguration :


 @AutoConfiguration(after = { HttpClientAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class }) //1 @ConditionalOnClass(RestTemplate.class) //2 @Conditional(NotReactiveWebApplicationCondition.class) //3 public class RestTemplateAutoConfiguration { // Class body }
  1. Iestatiet automātiskās konfigurācijas klašu secību
  2. Aktivizējiet, ja RestTemplate klase atrodas klases ceļā
  3. Aktivizējiet, ja neatrodamies reaktīvā tīmekļa lietotnes kontekstā


Ņemiet vērā, ka klases ielādētājs labi ielādē RestTemplateAutoConfiguration klasi neatkarīgi no tā, vai RestTemplate klase atrodas klases ceļā vai nē! Pavasaris pilnībā izmanto šo mehānismu, kā redzams iepriekš. Faktiski anotācijās konfigurēto klašu izšķirtspēja tiek atlikta, līdz tām tiek tieši piekļūts.

maven-dependency-analyzer ienesšana mūsdienu laikmetā

Committers izstrādāja analizatoru 2007. gadā: lūk, kā tas izskatījās toreiz. Spring Boot sākās vēlāk, 2010. gadā. Šī iemesla dēļ analizators anotācijās neņēma klašu atlikto ielādi. Ņemiet vērā, ka tas joprojām tā nav; projekts nesaņem daudz mīlestības.


Izmantojot spraudni Spring Boot projektā, jūs saņemsiet daudz viltus pozitīvu rezultātu. Es to izmēģināju ar vienkāršu Spring Boot projektu, izmantojot WebFlux un R2DBC vietnē PostgreSQL.


Šeit ir neliels izvilkums no izvades, kad es palaižu 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


Ja es noņemšu kādu no šīm atkarībām, testi netiks palaisti.


Kas būtu nepieciešams, lai analizators darbotos ar Spring Boot projektiem? Analizēsim analizatoru.


Analizatora klases diagramma


Spraudnis ļauj konfigurēt citu analizatoru:


Norādiet izmantojamo projekta atkarības analizatoru (plexus komponenta lomas padoms). Pēc noklusējuma tiek izmantots maven-dependency-analyzer. Lai to izmantotu, jums ir jādeklarē šī spraudņa atkarība, kas satur analizatora kodu. Analizatoram ir jābūt deklarētam Plexus lomas nosaukumam, un jūs šeit norādāt lomas nosaukumu.


  • Tips : java.lang.String

  • Kopš : 2.2

  • Nepieciešams : No

  • Lietotāja īpašums : analyzer

  • Noklusējums : default


-- atkarība: analizēt


Mēs varam izveidot vispārēju analizatoru, kas atkārtoti izmanto iepriekš minēto, bet pievieno vienu konkrētu Spring Boot.

Secinājums

Pašreizējais Maven analizatora stāvoklis nesniedz nekādu labumu mūsdienu Spring Boot projektiem. Esošais kods ir atvērts konfigurēšanai un pat paplašinājumam. Tomēr mums būtu jāiekļauj daudz Spring Boot loģikas. Quarkus un Micronaut projektiem mums būtu nepieciešams arī īpašs kods.


Es nezinu, vai tas ir tā laika un pūļu vērts. Ja jūs domājat, ka tā ir, es ceru, ka šis emuāra ieraksts var kalpot kā agrīnas stadijas analīze.


Lai dotos tālāk:





Sākotnēji publicēts vietnē A Java Geek 2025. gada 9. martā

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks