paint-brush
Použití Maven's Dependency Analyzer k odstranění nevyužitých závislostí je dnes nebezpečná radapodle@nfrankel
Nová historie

Použití Maven's Dependency Analyzer k odstranění nevyužitých závislostí je dnes nebezpečná rada

podle 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
cs-flagCS
Přečtěte si tento příběh v češtině!
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!
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-flagLT
Skaitykite šią istoriją lietuvių kalba!
CS

Příliš dlouho; Číst

Současný stav analyzátoru Maven nenabízí žádnou výhodu moderním projektům Spring Boot.
featured image - Použití Maven's Dependency Analyzer k odstranění nevyužitých závislostí je dnes nebezpečná rada
Nicolas Fränkel HackerNoon profile picture
Nicolas Fränkel

Nicolas Fränkel

@nfrankel

Developer Advocate, eternal learner, author


Nedávno můj dobrý přítel Richard Fichtner poradil pomocí příkazu mvn dependency:analyze se zbavit deklarovaných, ale nepoužívaných závislostí:


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.

Zatímco před lety to byl skvělý nápad, dnes je to nebezpečná rada. V tomto příspěvku bych rád vysvětlil, co plugin dělá a proč byste jej neměli používat, ale v těch nejpřímějších projektech.

Příkaz mvn dependency:analyze

Maven používá architekturu zásuvných modulů; ve výše uvedeném příkazu je plugin maven-dependency-plugin . Plugin hostí několik souvisejících cílů . Tady je to analyze .


Analyzuje závislosti tohoto projektu a určuje, které jsou: použité a deklarované; použité a nedeklarované; nepoužité a deklarované. Tento cíl je určen k použití samostatně, takže vždy provádí fázi test-compile - místo toho použijte cíl dependency:analyze-only když se účastníte životního cyklu sestavení.


Ve výchozím nastavení se k provádění analýzy používá maven-dependency-analyzer s omezeními kvůli skutečnosti, že pracuje na úrovni bajtkódu, ale pomocí parametru analyzer lze připojit jakýkoli analyzátor.


-- závislost:analyzovat


maven-dependency-analyzer je sdílená komponenta Maven. Jeho popis je docela výstižný:


Analyzuje závislosti projektu na nedeklarované nebo nepoužívané artefakty.

Upozornění : Protože se analýza provádí na bajtovém kódu , nikoli na zdroji, některé případy nejsou detekovány, včetně konstant, anotací se zachováním pouze zdroje a odkazů v Javadoc. To může vést k nesprávným výsledkům, pokud se jedná o jediné použití závislosti.


Hlavní komponentou je ProjectDependencyAnalyzer , který používá ClassAnalyzer a DependencyAnalyzer .


-- Maven-dependency-analyzer


Varování jasně ukazuje, že funguje na úrovni bajtkódu . Zejména výslovně uvádí, že nebere v úvahu anotace na úrovni zdroje.

Spring Boot startéry

Jak si navrhnout vlastní startér Spring Boot jsem popsal už dávno a od té doby se toho moc nezměnilo. Pokud jste se začátky Spring Boot noví, zde je shrnutí.


SpringBoot spoléhá na třídy AutoConfiguration. Třídy AutoConfiguration jsou běžné konfigurační třídy, tj . přispívají k třídám aplikací. Můžete nastavit specifická aktivační kritéria, jako je přítomnost vlastnosti Spring, ale nejsou specifická pro automatickou konfiguraci.


Zde je velmi zjednodušený postup:


Zjednodušený sekvenční diagram automatické konfigurace ve Spring Boot

Zjednodušený sekvenční diagram automatické konfigurace ve Spring Boot


JAR, který se automaticky dodává se Spring Boot, je org.springframework.boot:spring-boot-autoconfigure . Můžete zkontrolovat obsah jeho META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports :


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


Jako příklad je zde RestClientAutoConfiguration :


 @AutoConfiguration(after = { HttpClientAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class }) //1 @ConditionalOnClass(RestTemplate.class) //2 @Conditional(NotReactiveWebApplicationCondition.class) //3 public class RestTemplateAutoConfiguration { // Class body }
  1. Nastavte pořadí tříd automatické konfigurace
  2. Aktivujte, pokud je třída RestTemplate na cestě třídy
  3. Aktivovat, pokud nejsme v kontextu reaktivní webové aplikace


Všimněte si, že zavaděč třídy načte třídu RestTemplateAutoConfiguration v pohodě, bez ohledu na to, zda je třída RestTemplate na cestě třídy nebo ne! Pružina využívá tento mechanismus naplno, jak je vidět výše. Ve skutečnosti je rozlišení tříd nakonfigurovaných v anotacích odloženo, dokud nejsou explicitně zpřístupněny.

Přinášíme maven-dependency-analyzer do moderní doby

Committers navrhl analyzátor v roce 2007: Zde je návod, jak to tehdy vypadalo. Spring Boot začal později, v roce 2010. Z tohoto důvodu analyzátor nebral v anotacích odložené načítání třídy. Všimněte si, že tomu tak stále není; projekt nemá moc lásky.


Při použití pluginu na projektu Spring Boot získáte spoustu falešných poplachů. Vyzkoušel jsem to s jednoduchým projektem Spring Boot, pomocí WebFlux a R2DBC na PostgreSQL.


Zde je malý výňatek z výstupu, když spustím 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


Pokud některou z těchto závislostí odstraním, testy se nespustí.


Co by bylo nutné, aby analyzátor fungoval s projekty Spring Boot? Pojďme analyzovat analyzátor.


Diagram tříd analyzátoru

Diagram tříd analyzátoru


Plugin umožňuje konfiguraci dalšího analyzátoru:


Zadejte analyzátor závislostí projektu, který se má použít (nápověda role komponenty plexus). Ve výchozím nastavení se používá maven-dependency-analyzer. Chcete-li to použít, musíte pro tento plugin deklarovat závislost, která obsahuje kód pro analyzátor. Analyzátor musí mít deklarovaný název role Plexus a zde zadejte název role.


  • Typ : java.lang.String

  • Od : 2.2

  • Požadováno : No

  • Vlastnost uživatele : analyzer

  • Výchozí : default


-- závislost:analyzovat


Můžeme vytvořit celkový analyzátor, který znovu použije výše uvedené, ale přidá jeden specifický pro Spring Boot.

Závěr

Současný stav analyzátoru Maven nenabízí žádnou výhodu moderním projektům Spring Boot. Stávající kód je otevřený pro konfiguraci a dokonce i rozšíření. Potřebovali bychom však vložit hodně logiky Spring Boot. Pro projekty Quarkus a Micronaut bychom také vyžadovali vyhrazený kód.


Nevím, jestli to stojí za ten čas a úsilí. Pokud si myslíte, že ano, doufám, že tento blogový příspěvek může sloužit jako analýza v rané fázi.


Chcete-li jít dále:





Původně publikováno na A Java Geek 9. března 2025

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

ZAVĚŠIT ZNAČKY

TENTO ČLÁNEK BYL PŘEDSTAVEN V...

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