Developer Advocate, eternal learner, author
اخیراً، دوست خوب من ریچارد فیختنر توصیه کرده است که از دستور mvn dependency:analyze
برای خلاص شدن از شر وابستگی های اعلام شده اما استفاده نشده استفاده کنید:
در حالی که سال ها پیش ایده خوبی بود، امروز توصیه خطرناکی است. در این پست، میخواهم توضیح دهم که این افزونه چه کاری انجام میدهد و چرا نباید از آن استفاده کنید، اما در سادهترین پروژهها.
mvn dependency:analyze
Maven از معماری پلاگین استفاده می کند. در دستور بالا، افزونه maven-dependency-plugin است. یک افزونه میزبان چندین هدف مرتبط است. در اینجا، آن را analyze
.
وابستگی های این پروژه را تجزیه و تحلیل می کند و تعیین می کند که کدام ها هستند: استفاده شده و اعلام شده; استفاده شده و اعلام نشده؛ استفاده نشده و اعلام شده این هدف برای استفاده مستقل در نظر گرفته شده است، بنابراین همیشه مرحله
test-compile
را اجرا می کند - به جای آن هنگام شرکت در چرخه عمر ساخت، از هدفdependency:analyze-only
استفاده کنید.
به طور پیش فرض،
maven-dependency-analyzer
برای انجام تجزیه و تحلیل استفاده می شود، با محدودیت هایی به دلیل این واقعیت که در سطح بایت کد کار می کند، اما هر تحلیلگری را می توان از طریق پارامترanalyzer
متصل کرد.
maven-dependency-analyzer
یک جزء مشترک Maven است. توضیحات آن کاملاً توصیفی است:
وابستگی های یک پروژه را برای مصنوعات اعلام نشده یا استفاده نشده تجزیه و تحلیل می کند.
هشدار : از آنجایی که تجزیه و تحلیل به جای منبع روی بایت کد انجام می شود، برخی موارد از جمله ثابت ها، حاشیه نویسی با حفظ فقط منبع و پیوندها در جاوادوک شناسایی نمی شوند. این می تواند منجر به نتایج نادرست شود، زمانی که اینها تنها موارد استفاده از یک وابستگی هستند.
جزء اصلی
ProjectDependencyAnalyzer
است که ازClassAnalyzer
وDependencyAnalyzer
استفاده می کند.
هشدار به وضوح نشان می دهد که در سطح بایت کد کار می کند. به ویژه، به صراحت اشاره می کند که حاشیه نویسی در سطح منبع را در نظر نمی گیرد.
من مدتها پیش نحوه طراحی استارت بوت Spring خود را توضیح دادم و از آن زمان تغییر زیادی نکرده است. اگر در شروع کار بهار بوت تازه کار هستید، در اینجا خلاصه ای از آن آورده شده است.
SpringBoot به کلاس های AutoConfiguration متکی است. کلاس های AutoConfiguration کلاس های پیکربندی معمولی هستند، به عنوان مثال ، آنها به کلاس های برنامه کمک می کنند. میتوانید معیارهای فعالسازی خاصی مانند وجود ویژگی Spring را تنظیم کنید، اما این معیارها مختص پیکربندی خودکار نیستند.
در اینجا یک جریان بسیار ساده آمده است:
نمودار توالی ساده شده از پیکربندی خودکار در Spring Boot
JAR که به طور خودکار با Spring Boot ارائه می شود org.springframework.boot:spring-boot-autoconfigure
است. می توانید محتوای 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
به عنوان مثال، RestClientAutoConfiguration
در اینجا آمده است:
@AutoConfiguration(after = { HttpClientAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class }) //1 @ConditionalOnClass(RestTemplate.class) //2 @Conditional(NotReactiveWebApplicationCondition.class) //3 public class RestTemplateAutoConfiguration { // Class body }
RestTemplate
در مسیر کلاس قرار دارد، آن را فعال کنید
توجه داشته باشید که بارگذار کلاس، کلاس RestTemplateAutoConfiguration
را به خوبی بارگیری می کند، صرف نظر از اینکه کلاس RestTemplate
در مسیر کلاس باشد یا خیر! همانطور که در بالا مشاهده شد، فنر از این مکانیسم به طور کامل استفاده می کند. در واقع، وضوح کلاس های پیکربندی شده در حاشیه نویسی تا زمانی که به طور صریح به آنها دسترسی پیدا نکند، به تعویق می افتد.
maven-dependency-analyzer
به عصر مدرنCommitters آنالایزر را در سال 2007 طراحی کرد: در اینجا چگونه به نظر می رسید. Spring Boot بعداً در سال 2010 شروع شد. به همین دلیل، تحلیلگر بارگذاری کلاس معوق را در حاشیه نویسی انجام نداد. توجه داشته باشید که هنوز اینطور نیست. این پروژه مورد علاقه زیادی قرار نمی گیرد.
هنگام استفاده از این افزونه در پروژه Spring Boot، نکات مثبت کاذب زیادی دریافت خواهید کرد. من آن را با یک پروژه ساده Spring Boot، با استفاده از WebFlux و R2DBC در PostgreSQL امتحان کردم.
در اینجا یک گزیده کوچک از خروجی هنگام اجرای 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
اگر هر یک از این وابستگی ها را حذف کنم، آزمایش ها اجرا نمی شوند.
برای اینکه آنالایزر با پروژه های Spring Boot کار کند چه چیزی لازم است؟ بیایید تحلیلگر را تحلیل کنیم.
نمودار کلاس آنالایزر
این افزونه اجازه می دهد تا یک تحلیلگر دیگر را پیکربندی کنید:
تحلیلگر وابستگی پروژه را برای استفاده مشخص کنید (نقطه نقش مولفه پلکس). به طور پیش فرض از maven-dependency-analyzer استفاده می شود. برای استفاده از این، باید یک وابستگی برای این افزونه اعلام کنید که حاوی کد آنالیزور است. آنالایزر باید یک نام نقش Plexus اعلام شده داشته باشد و شما نام نقش را در اینجا مشخص کنید.
نوع :
java.lang.String
از زمان :
2.2
مورد نیاز :
No
ویژگی کاربر :
analyzer
پیشفرض :
default
ما میتوانیم یک تحلیلگر کلی ایجاد کنیم که از موارد بالا استفاده مجدد کند، اما یک آنالایزر خاص به Spring Boot اضافه کند.
وضعیت فعلی تحلیلگر Maven هیچ مزیتی برای پروژه های مدرن Spring Boot ندارد. کد موجود برای پیکربندی و حتی پسوند باز است. با این حال، ما باید بسیاری از منطق Spring Boot را تعبیه کنیم. برای پروژههای Quarkus و Micronaut، به کد اختصاصی نیز نیاز داریم.
نمی دانم ارزش وقت و تلاش را دارد یا نه. اگر فکر می کنید اینطور است، امیدوارم این پست وبلاگ بتواند به عنوان یک تجزیه و تحلیل در مراحل اولیه باشد.
برای رفتن بیشتر:
در ابتدا در A Java Geek در 9 مارس 2025 منتشر شد