paint-brush
استفاده از تحلیلگر وابستگی Maven برای خلاص شدن از شر وابستگی های استفاده نشده توصیه خطرناکی است امروزتوسط@nfrankel
تاریخ جدید

استفاده از تحلیلگر وابستگی Maven برای خلاص شدن از شر وابستگی های استفاده نشده توصیه خطرناکی است امروز

توسط Nicolas Fränkel
Nicolas Fränkel HackerNoon profile picture

Nicolas Fränkel

@nfrankel

Developer Advocate, eternal learner, author

4 دقیقه read2025/03/13
Read on Terminal Reader
Read this story in a terminal
Print this story
tldt arrow
fa-AF-flagFA-AF
این داستان را به زبان دری بخوانید!
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!
cs-flagCS
Přečtěte si tento příběh v češtině!
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!
FA-AF

خیلی طولانی؛ خواندن

وضعیت فعلی تحلیلگر Maven هیچ مزیتی برای پروژه های مدرن Spring Boot ندارد.
featured image - استفاده از تحلیلگر وابستگی Maven برای خلاص شدن از شر وابستگی های استفاده نشده توصیه خطرناکی است امروز
Nicolas Fränkel HackerNoon profile picture
Nicolas Fränkel

Nicolas Fränkel

@nfrankel

Developer Advocate, eternal learner, author


اخیراً، دوست خوب من ریچارد فیختنر توصیه کرده است که از دستور mvn dependency:analyze برای خلاص شدن از شر وابستگی های اعلام شده اما استفاده نشده استفاده کنید:


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.

در حالی که سال ها پیش ایده خوبی بود، امروز توصیه خطرناکی است. در این پست، می‌خواهم توضیح دهم که این افزونه چه کاری انجام می‌دهد و چرا نباید از آن استفاده کنید، اما در ساده‌ترین پروژه‌ها.

دستور mvn dependency:analyze

Maven از معماری پلاگین استفاده می کند. در دستور بالا، افزونه maven-dependency-plugin است. یک افزونه میزبان چندین هدف مرتبط است. در اینجا، آن را analyze .


وابستگی های این پروژه را تجزیه و تحلیل می کند و تعیین می کند که کدام ها هستند: استفاده شده و اعلام شده; استفاده شده و اعلام نشده؛ استفاده نشده و اعلام شده این هدف برای استفاده مستقل در نظر گرفته شده است، بنابراین همیشه مرحله test-compile را اجرا می کند - به جای آن هنگام شرکت در چرخه عمر ساخت، از هدف dependency:analyze-only استفاده کنید.


به طور پیش فرض، maven-dependency-analyzer برای انجام تجزیه و تحلیل استفاده می شود، با محدودیت هایی به دلیل این واقعیت که در سطح بایت کد کار می کند، اما هر تحلیلگری را می توان از طریق پارامتر analyzer متصل کرد.


-- وابستگی: تجزیه و تحلیل


maven-dependency-analyzer یک جزء مشترک Maven است. توضیحات آن کاملاً توصیفی است:


وابستگی های یک پروژه را برای مصنوعات اعلام نشده یا استفاده نشده تجزیه و تحلیل می کند.

هشدار : از آنجایی که تجزیه و تحلیل به جای منبع روی بایت کد انجام می شود، برخی موارد از جمله ثابت ها، حاشیه نویسی با حفظ فقط منبع و پیوندها در جاوادوک شناسایی نمی شوند. این می تواند منجر به نتایج نادرست شود، زمانی که اینها تنها موارد استفاده از یک وابستگی هستند.


جزء اصلی ProjectDependencyAnalyzer است که از ClassAnalyzer و DependencyAnalyzer استفاده می کند.


- تحلیلگر وابستگی maven


هشدار به وضوح نشان می دهد که در سطح بایت کد کار می کند. به ویژه، به صراحت اشاره می کند که حاشیه نویسی در سطح منبع را در نظر نمی گیرد.

استارت بوت بهار

من مدتها پیش نحوه طراحی استارت بوت Spring خود را توضیح دادم و از آن زمان تغییر زیادی نکرده است. اگر در شروع کار بهار بوت تازه کار هستید، در اینجا خلاصه ای از آن آورده شده است.


SpringBoot به کلاس های AutoConfiguration متکی است. کلاس های AutoConfiguration کلاس های پیکربندی معمولی هستند، به عنوان مثال ، آنها به کلاس های برنامه کمک می کنند. می‌توانید معیارهای فعال‌سازی خاصی مانند وجود ویژگی Spring را تنظیم کنید، اما این معیارها مختص پیکربندی خودکار نیستند.


در اینجا یک جریان بسیار ساده آمده است:


نمودار توالی ساده شده از پیکربندی خودکار در Spring Boot

نمودار توالی ساده شده از پیکربندی خودکار در 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 }
  1. ترتیب کلاس های پیکربندی خودکار را تنظیم کنید
  2. اگر کلاس RestTemplate در مسیر کلاس قرار دارد، آن را فعال کنید
  3. اگر در زمینه برنامه وب واکنشی نیستیم، آن را فعال کنید


توجه داشته باشید که بارگذار کلاس، کلاس 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 منتشر شد

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

برچسب ها را آویزان کنید

این مقاله در ارائه شده است...

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