سلام :) Maven یک ابزار مدیریت پروژه قدرتمند است که بر اساس POM (project object model) ساخته شده است. برای ساخت پروژه(build)، مدیریت dependencyها و مستندسازی(documentation) استفاده می شود. به طور خلاصه می توان گفت maven ابزاری است که می تواند برای ساخت و مدیریت هر پروژه مبتنی بر جاوا استفاده شود.
در این مقاله به برسی اجمالی هر بخش می پردازیم هرچند بحث گسترده تر است اما دراینجا بحث های کلی را مطرح میکنم.
امکانات Maven:
فایلهای Project Object Model (POM) فایلهای XML هستند که حاوی اطلاعات مربوط به پروژه و اطلاعات پیکربندی مانند وابستگیها(dependencies)(به زبان ساده تر کتابخانه ها)، source directory، پلاگین ها، پروفایل ها و غیره است که توسط Maven برای build پروژه استفاده میشود. Maven فایل pom.xml را برای انجام تنظیمات و عملیات آن نیاز دارد.
کتابخانه های خارجی جاوا هستند که برای پروژه مورد نیاز هستند. به عنوان مثال شما میخواهید در Spring با دیتابیس ارتباط برقرار کنید برای اینکار نیاز دارید تا از Spring Data Jpa در پروژه خود استفاده نمایید برای اینکار نیاز هست تا dependency مربوط به آن را که spring-boot-starter-data-jpa است در فایل pom پروژه اضافه نمایید تا بتوانید از کلاس ها، اینترفیس ها و انوتیشن های موجود در آن استفاده کنید.
برای مثال:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
با اضافه کردن این دپندنسی شما به انوتیشن های jpa که شامل Entity, Id, GeneratedValue, Table, Query و ... ،همچنین اینترفیس های JpaRepository, JpaSpecificationExecutor و ... و قابلیت های ORM هایبرنیت دسترسی پیدا میکنید
دایرکتوری هایی که شامل مجموع فایل های JAR که همان کتابخانه ها یا بهتر بگیم dependencyها هستند، مخازن محل نگهداری dependency ها هستن.
مخزن محلی یک دایرکتوری در هارد دیسک دستگاه شما است که معمولا در مسیر C:\Users\your_username\.m2\repository قرار دارد و دپندنسی ها در آنجا کش و نگهداری می شوند. اگر dependency مورد نظر در مخزن محلی Maven یافت نشد، Maven آنها را از یک مخزن مرکزی Maven دانلود کرده و در مخزن محلی شما قرار می دهد یکی ازین مخازن https://mvnrepository.com می باشد.
که بر اساس Maven architecture می باشد به چندین فاز تقسیم میشود و اگر هریک از فاز هارا به صورت اختصاصی مشخص نکنیم , Maven بر اساس پیش فرض خود عمل میکند.
فاز های پیش فرض Life cycle را میتوان به این صورت بیان کرد :
وقتی که یکی از فاز ها را به صورت اختصاصی میخواهیم اجرا کنیم, فاز های قبلی آن به صورت اتومات اجرا میشوند. برای مثال وقتی که میخواهید فاز Test پروژه را اجرا کنید فاز قبل تر از آن یعنی Validate و Compile نیز اجرا میشوند و یا اگر میخواهید پروژه را Package کنید, فاز های قبل آن یعنی Validate و Compile و Test نیز انجام میشوند.
جهت اجرای این فاز ها باید به پوشه ای که فایل POM وجود دارد برویم و دستور آن را در کنسول اجرا نمایید مثلا برای اجرای فاز Compile دستور زیر را اجرا میکنیم
mvn compile
پروفایل مجموعه ای از مقادیر پیکربندی است که به شما این امکان را می دهد پروژه خود را با استفاده از تنظیمات مختلف build کنید. برای مثال نیاز داریم پروژه را روی سیستم local با یکسری تنظیمات مخصوص build بگیریم جهت توسعه و تست اما برای انتشار نسخه ی product با استفاده از تنظیمات متفاوت پروژه build شود این تنظیمات می تواند شامل تنظیمات دیتابیس و ... باشد
برای فعال کردن buildهای مختلف، میتوانید پروفایلهای build مختلفی را به فایلهای POM خود اضافه کنید.
به مثال زیر توجه کنید:
<profiles> <profile> <id>dev</id> <activation> <!-- this profile is active by default --> <activeByDefault>true</activeByDefault> <!-- activate if system properties 'env=dev' --> <property> <name>env</name> <value>dev</value> </property> </activation> <properties> <db.driverClassName>com.mysql.jdbc.Driver</db.driverClassName> <db.url>jdbc:mysql://localhost:3306/dev</db.url> <db.username>mkyong</db.username> <db.password>8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92</db.password> </properties> </profile> <profile> <id>prod</id> <activation> <!-- activate if system properties 'env=prod' --> <property> <name>env</name> <value>prod</value> </property> </activation> <properties> <db.driverClassName>com.mysql.jdbc.Driver</db.driverClassName> <db.url>jdbc:mysql://live01:3306/prod</db.url> <db.username>mkyong</db.username> <db.password>8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92</db.password> </properties> </profile> </profiles>
به عنوان مثال ما در اینجا دو پروفایل داریم یکی dev که پروفایل پیشفرض است و دیگری prod که دو تنظیمات متفاوت برای دیتابیس را ارائه میکنند.
دستور زیر را برای اجرای فاز Compile روی پروفایل prod اجرا میکنیم
mvn compile -P prod
پلاگین بخش اجرایی maven است، پلاگین ها برای ایجاد فایل های jar، ایجاد فایل های war، کامپایل کد، unit test، ایجاد مستندات پروژه(documentation)، و غیره استفاده می شوند. تقریباً هر عملی که فکر میکنید روی یک پروژه انجام دهید، به عنوان یک پلاگین Maven پیادهسازی میشود. مثلا maven-jar-plugin برای تولید jar فایل پروژه یا پلاگین protobuf-maven-plugin برای تبدیل فایل های proto که برای grpc هستن به کلاس جاوا.
برای مثال در پروژه های SpringBoot ما به پلاگین spring-boot-maven-plugin جهت اجرای فاز های مختلف نیاز داریم که در مثال زیر پلاگین ما از lombok نیز پشتیبانی میکند.
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build>
دراینجا شما یک نمونه از فایل pom.xml را مشاهده می کنید
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId> com.project.loggerapi </groupId> <artifactId>LoggerApi</artifactId> <version>0.0.1-SNAPSHOT</version> <profiles> <profile> <!-- ... --> </profile> </profiles> <!-- Add typical dependencies for a web application --> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.11.0</version> </dependency> <!-- ... --> </dependencies> <build> <plugins> <!-- ... --> </plugins> </build> </project>