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í:
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.
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íldependency: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í parametruanalyzer
lze připojit jakýkoli analyzátor.
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
aDependencyAnalyzer
.
Varování jasně ukazuje, že funguje na úrovni bajtkódu . Zejména výslovně uvádí, že nebere v úvahu anotace na úrovni zdroje.
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 }
RestTemplate
na cestě třídy
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.
maven-dependency-analyzer
do moderní dobyCommitters 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
Můžeme vytvořit celkový analyzátor, který znovu použije výše uvedené, ale přidá jeden specifický pro Spring Boot.
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