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ā izmantojietdependency: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, izmantojotanalyzer
parametru.
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 izmantoClassAnalyzer
unDependencyAnalyzer
.
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:
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 }
- Iestatiet automātiskās konfigurācijas klašu secību
- Aktivizējiet, ja
RestTemplate
klase atrodas klases ceļā - 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.
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
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:
- atkarība: analizēt
- Maven atkarības analizators
- Sava Spring Boot startera projektēšana — 1. daļa
- Sava Spring Boot startera projektēšana — 2. daļa
Sākotnēji publicēts vietnē A Java Geek 2025. gada 9. martā