291 čtení

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

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

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


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í:

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


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


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

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks