Skip to content

3. ابزارهای مورد استفاده در این سند

مثال‌های این سند با استفاده از ابزارهای زیر آزمایش شده‌اند:

  • نسخه‌های NetBeans از ۶.۸ تا ۷.۱.۲. نصب NetBeans در [ref3] در بخش ۱.۳.۱ توضیح داده شده است.
  • Wampserver نسخهٔ ۲.۲. نصب WampServer در [ref3]، بخش ۱.۳.۳ توضیح داده شده است؛
  • Maven در NetBeans یکپارچه شده است. اکنون این ابزار را شرح خواهیم داد.

3.1. Maven

3.1.1. مقدمه

Maven در URL [http://maven.apache.org/index.html ] در دسترس است. به گفتهٔ سازندگان آن:

هدف اصلی Maven این است که به یک توسعه‌دهنده امکان دهد تا در کوتاه‌ترین زمان ممکن وضعیت کامل یک پروژه توسعه را درک کند. برای دستیابی به این هدف، چندین حوزه کلیدی وجود دارد که Maven قصد دارد به آن‌ها بپردازد:

  • ساده کردن فرآیند ساخت
  • ارائه یک سیستم ساخت استاندارد
  • ارائه اطلاعات پروژه با کیفیت بالا
  • ارائه دستورالعمل‌هایی برای بهترین شیوه‌های توسعه
  • فراهم کردن گذار یکپارچه به ویژگی‌های جدید

Maven در NetBeans ادغام شده است و ما قصد داریم از آن تنها برای یکی از قابلیت‌هایش استفاده کنیم: مدیریت کتابخانه‌های پروژه. این کتابخانه‌ها شامل تمامی آرشیوهای jars هستند که باید در دایرکتوری Classpath پروژه قرار گیرند. ممکن است تعداد زیادی از آن‌ها وجود داشته باشد. برای مثال، پروژه‌های آیندهٔ ما از Hibernate ORM (نقشه‌بردار شیء–رابطه‌ای) استفاده خواهند کرد. این ORM شامل ده‌ها آرشیو jar است. مزیت Maven این است که ما را از دانستن همه آنها بی‌نیاز می‌کند. ما فقط باید در پروژه خود مشخص کنیم که به Hibernate نیاز داریم و تمام اطلاعات لازم برای یافتن آرشیو اصلی این ORM را فراهم کنیم. سپس Maven تمام کتابخانه‌های مورد نیاز Hibernate را نیز دانلود می‌کند. این‌ها به عنوان وابستگی‌های Hibernate شناخته می‌شوند. یک کتابخانه مورد نیاز Hibernate ممکن است خود به آرشیوهای دیگری وابسته باشد. این‌ها نیز دانلود خواهند شد. تمام این کتابخانه‌ها در پوشه‌ای به نام مخزن محلی Maven قرار می‌گیرند.

یک پروژه Maven به راحتی قابل اشتراک‌گذاری است. اگر آن را از یک کامپیوتر به کامپیوتر دیگر منتقل کنید و وابستگی‌های پروژه در مخزن محلی کامپیوتر جدید موجود نباشند، دانلود خواهند شد.

Maven می‌تواند به تنهایی یا در یک محیط توسعه یکپارچه (IDE) مانند NetBeans یا Eclipse ادغام شود.

بیایید یک پروژه Maven در NetBeans ایجاد کنیم:

  • در [1]، یک پروژه جدید ایجاد کنید،
  • در [2]، دسته‌بندی [Maven] و نوع پروژه [Java Application] را انتخاب کنید،
  • در [3]، پوشهٔ والد برای پوشهٔ پروژهٔ جدید را مشخص کنید،
  • در [4]، نام پروژه را وارد کنید،
  • در [5]، پروژهٔ تولیدشده.

اجزای پروژه را بررسی کرده و نقش هر یک را توضیح دهید.

  • در [1]: شاخه‌های مختلف پروژه:
    • [Source packages]: کلاس‌های جاوا پروژه؛
    • [Test packages]: کلاس‌های تست پروژه؛
    • [Dependencies]: آرشیوهای .jar مورد نیاز برای پروژه که توسط Maven مدیریت می‌شوند؛
    • [Test Dependencies]: آرشیوهای .jar مورد نیاز برای تست‌های پروژه که توسط Maven مدیریت می‌شوند؛
    • [Java Dependencies]: آرشیوهای .jar مورد نیاز پروژه که توسط Maven مدیریت نمی‌شوند؛
    • [Project Files]: فایل‌های پیکربندی Maven و NetBeans؛
  • در [3]، شاخه [Source Packages

این شاخه حاوی کد منبع کلاس‌های جاوا پروژه است. NetBeans یک کلاس پیش‌فرض ایجاد کرده است:


package istia.st.mvexemple;

/**
 * Hello world!
 * 
 */
public class App {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
  • در [4]، شاخه [Test Packages]، که حاوی کد منبع کلاس‌های تست پروژه است،
  • در [5]، کتابخانه ۳.۸ JUnit که برای اجرای تست‌ها مورد نیاز است،

NetBeans یک کلاس پیش‌فرض ایجاد کرده است:


package istia.st.mvexemple;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

/**
 * Unit test for simple App.
 */
public class AppTest extends TestCase {
    /**
     * Create the test case
     * 
     * @param testName
     *          name of the test case
     */
    public AppTest(String testName) {
        super(testName);
    }

    /**
     * @return the suite of tests being tested
     */
    public static Test suite() {
        return new TestSuite(AppTest.class);
    }

    /**
     * Rigourous Test :-)
     */
    public void testApp() {
        assertTrue(true);
    }
}

این یک تست JUnit نسخه ۳.۸ است. ما بعداً از تست‌های JUnit نسخه ۴.x استفاده خواهیم کرد.

  • در [6]، شاخه [Dependencies] در اینجا خالی است،

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

  • در [7]، کتابخانه‌هایی که پروژه به آنها نیاز دارد اما توسط Maven مدیریت نمی‌شوند،
  • در [7]، فایل پیکربندی پروژه Maven [pom.xml]. POM مخفف مدل شیء پروژه است. ما باید مستقیماً این فایل را ویرایش کنیم.

فایل تولیدشده [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>istia.st</groupId>
  <artifactId>mv-exemple</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>mv-exemple</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>
  • خطوط ۵ تا ۸، شیء جاوا (محصول) را که توسط پروژه Maven ایجاد می‌شود، تعریف می‌کنند. این اطلاعات از جادوگری که هنگام ایجاد پروژه استفاده می‌شود، به دست می‌آید:

یک شیء Maven با چهار ویژگی تعریف می‌شود:

  • [groupId]: اطلاعاتی که شبیه نام یک بسته است. بنابراین، کتابخانه‌های فریم‌ورک Spring دارای groupId=org.springframework هستند، در حالی که کتابخانه‌های فریم‌ورک QZXW2HTML دارای JSF=groupId=javax.faces هستند،
  • [artifactId]: نام شیء Maven. در گروه [org.springframework]، بنابراین موارد زیر را در artifactId می‌یابیم: spring-context، spring-core، spring-beans، ... در گروه [javax.faces]، ما artifactId و jsf-api, را می‌یابیم
  • [version]: شماره نسخهٔ آرتیفکت Maven. بنابراین، آرتیفکت org.springframework.spring-core نسخه‌های زیر را دارد: 2.5.4، 2.5.5، 2.5.6، 2.5.6.SECO1، ...
  • [packaging]: قالب آرتفکت، که معمولاً war یا jar است.

پروژه Maven ما یک [jar] (خط ۸) را در گروه [istia.st] (خط ۵) تولید خواهد کرد، با نام [mv-exemple] (خط ۶) و با نسخه [1.0-SNAPSHOT] (خط ۷). این چهار مورد اطلاعات باید به‌طور یکتا یک آرتیفکت Maven را شناسایی کنند.

خطوط 17–24 وابستگی‌های Maven پروژه را فهرست می‌کنند، یعنی فهرست کتابخانه‌های مورد نیاز پروژه. هر کتابخانه با چهار مورد اطلاعات تعریف می‌شود (groupId، artifactId، نسخه، بسته‌بندی). وقتی ورودی packaging وجود ندارد، مانند اینجا، از JAR packaging استفاده می‌شود. یک اطلاعات دیگر اضافه شده است: «scope» که مشخص می‌کند در کدام مراحل چرخهٔ عمر پروژه به کتابخانه نیاز است. مقدار پیش‌فرض «compile» است که نشان می‌دهد کتابخانه هم برای کامپایل و هم برای اجرا لازم است. مقدار «test» به این معنی است که کتابخانه در حین تست پروژه مورد نیاز است. این مورد در اینجا برای کتابخانه JUnit نسخه ۳.۸.۱ صدق می‌کند. اگر این کتابخانه در مخزن محلی ایستگاه کاری موجود نباشد، دانلود می‌شود.

3.1.2. اجرای پروژه

ما پروژه را اجرا می‌کنیم:

در [1]، پروژه Maven ساخته شده و سپس به‌عنوان [1] اجرا می‌شود. لاگ‌های کنسول NetBeans به شرح زیر است:

Scanning for projects...
...

------------------------------------------------------------------------
Building mv-exemple 1.0-SNAPSHOT
------------------------------------------------------------------------

[resources:resources]
[debug] execute contextualize
Using 'UTF-8' encoding to copy filtered resources.
skip non existing resourceDirectory D:\data\istia-1112\netbeans\glassfish\mv-pam\00\mv-exemple\src\main\resources

[compiler:compile]
Compiling 1 source file to D:\data\istia-1112\netbeans\glassfish\mv-pam\00\mv-exemple\target\classes

[exec:exec]
Downloading: http://repo.maven.apache.org/maven2/org/apache/commons/commons-exec/1.0.1/QZXW2HTMLCY29tbW9ucy-leGVjLTEuMC4xLnBvbQZQX

Downloaded: http://repo.maven.apache.org/maven2/org/apache/commons/commons-exec/1.0.1/commons-exec-1.0.1.pom (8 KB در 113.5 KB/ثانیه)
Downloading: http://repo.maven.apache.org/maven2/org/apache/commons/commons-exec/1.0.1/QZXW2HTMLCY29tbW9ucy-leGVjLTEuMC4xLmphcgZQX

Downloaded: http://repo.maven.apache.org/maven2/org/apache/commons/commons-exec/1.0.1/QZXW2HTMLCY29tbW9ucy-leGVjLTEuMC4xLmphcgZQX (49 KB در 763.6 KB/ثانیه)
Hello World!
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 4.040s
Finished at: Thu Jun 21 10:10:40 CEST 2012
Final Memory: 13M/122M

نتیجه در خط ۲۳ است. می‌بینیم که حتی در این مورد ساده، Maven برخی وابستگی‌ها را دانلود کرده است (خطوط ۱۷ و ۲۰).

3.1.3. سیستم فایل یک پروژه Maven

  • [1]: سیستم فایل پروژه در زبانه [Files] قرار دارد،
  • [2]: کد منبع جاوا در پوشه [src / main / java] قرار دارد،
  • [3]: منابع تست جاوا در پوشه [src / test / java] قرار دارند،
  • [4]: پوشه [target] توسط ساخت پروژه ایجاد شده است،
  • [5]: در اینجا، ساخت پروژه یک آرشیو به نام [mv-exemple-1.0-SNAPSHOT.jar] ایجاد کرده است.

3.1.4. انبار محلی Maven

ما اشاره کردیم که Maven وابستگی‌های مورد نیاز پروژه را دانلود کرده و آن‌ها را به‌صورت محلی ذخیره می‌کند. شما می‌توانید این مخزن محلی را بررسی کنید:

  • در [1]، گزینه [Window / Other / Maven Repository Browser] را انتخاب کنید،
  • در [2]، یک برگه با برچسب [Maven Repositories] باز می‌شود،
  • در [3]، دو شاخه وجود دارد، یکی برای مخزن محلی و دیگری برای مخزن مرکزی. شاخه دوم بسیار بزرگ است. برای مشاهده محتویات آن، باید نمایه آن [4] را به‌روزرسانی کنید. این به‌روزرسانی چندین ده دقیقه طول می‌کشد.
  • در [5]، کتابخانه‌های مخزن محلی،
  • در [6]، شاخه‌ای به نام [istia.st] خواهید یافت که با [groupId] در پروژه ما مطابقت دارد،
  • در [7]، می‌توانید به ویژگی‌های مخزن محلی دسترسی پیدا کنید،
  • در [8]، ما مسیر مخزن محلی را داریم. دانستن این موضوع مفید است زیرا گاهی اوقات (به ندرت) Maven دیگر از آخرین نسخه پروژه استفاده نمی‌کند. شما تغییراتی ایجاد می‌کنید و می‌بینید که این تغییرات منعکس نمی‌شوند. سپس می‌توانید به‌صورت دستی شاخه‌ای را که در مخزن محلی مربوط به [groupId] ما است، حذف کنید. این کار Maven را مجبور می‌کند تا شاخه را از آخرین نسخه پروژه دوباره ایجاد کند.

3.1.5. جستجوی یک آرتیفکت با Maven

حال بیاموزیم چگونه با استفاده از Maven یک آرتیفکت را جستجو کنیم. بیایید با لیست وابستگی‌های فعلی برای فایل [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>istia.st</groupId>
  <artifactId>mv-exemple</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>mv-exemple</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

خطوط 17 تا 23 وابستگی‌ها را تعریف می‌کنند که قرار است برای استفاده از جدیدترین نسخه‌های کتابخانه‌ها آن‌ها را تغییر دهیم.

ابتدا وابستگی‌های فعلی [1] را حذف می‌کنیم. سپس فایل [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>istia.st</groupId>
  <artifactId>mv-exemple</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>mv-exemple</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies></dependencies>
</project>

در خط ۱۷، وابستگی حذف‌شده دیگر در [pom.xml] دیده نمی‌شود. اکنون بیایید آن را در مخازن Maven جستجو کنیم.

  • در [1]، یک وابستگی به پروژه اضافه می‌شود؛
  • در [2]، باید جزئیات مربوط به آرتیفکت مورد جستجو (groupId، artifactId، نسخه، بسته‌بندی (نوع) و دامنه) را مشخص کنیم. ما با مشخص کردن [groupId] [3] شروع می‌کنیم،
  • در [4]، ما [espace] را تایپ می‌کنیم تا فهرست آثار ممکن را نمایش دهیم. در اینجا، [junit] و [jnit-dep]. ما [junit] را انتخاب می‌کنیم،
  • سپس [5]؛ با دنبال کردن همان رویه، جدیدترین نسخه را انتخاب می‌کنیم. نوع بسته‌بندی jar, است
  • و [6]؛ ما دامنه «test» را انتخاب می‌کنیم تا نشان دهیم وابستگی تنها برای تست مورد نیاز است.

در [6] وابستگی‌های افزوده شده در پروژه ظاهر می‌شوند. فایل [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>istia.st</groupId>
  <artifactId>mv-exemple</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>mv-exemple</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
      <type>jar</type>
    </dependency>
  </dependencies>
</project>

توجه کنید که فایل [pom.xml] وابستگی [hamcrest-core-1.1] را که در [6] می‌بینیم، ذکر نمی‌کند. این به این دلیل است که این وابستگی به JUnit نسخه ۴.۱۰ است و نه خود پروژه. این موضوع با آیکون متفاوتی در شاخه [Dependencies] نشان داده شده است. این فایل به طور خودکار دانلود شده است.

حال فرض کنیم که ما [groupId] را برای آرتیفکت مورد نظرمان نمی‌دانیم. برای مثال، می‌خواهیم از Hibernate به عنوان ORM (نقشه‌بردار شیء-رابطه‌ای) استفاده کنیم و همین تنها چیزی است که می‌دانیم. در این صورت، می‌توانید به وب‌سایت [http://mvnrepository.com/] مراجعه کنید:

در [1] می‌توانید کلمات کلیدی را وارد کنید. بیایید hibernate را تایپ کرده و جستجو را اجرا کنیم.

  • در [2]، بیایید [groupIdorg.hibernate و [artifactIdhibernate-core را انتخاب کنیم،
  • از [3]، بیایید نسخه 4.1.2-Final را انتخاب کنیم،
  • برای [4]، کد Maven را برای چسباندن در فایل [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>istia.st</groupId>
  <artifactId>mv-exemple</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>mv-exemple</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.1.2.Final</version>
    </dependency>
  </dependencies>
</project>

ما فایل [pom.xml] را ذخیره می‌کنیم. سپس Maven دانلود وابستگی‌های جدید را آغاز می‌کند. پروژه به شرح زیر تغییر می‌کند:

  • به [5]، وابستگی [hibernate-core-4.1.2-Final]. در مخزنی که در آن یافت شده است، این [artifactId] خود توسط فایلی به نام [pom.xml] توصیف می‌شود. این فایل خوانده شد و Maven متوجه شد که [artifactId] وابستگی‌هایی دارد. این وابستگی‌ها نیز دانلود می‌شوند. این کار برای هر [artifactId] دانلود شده انجام خواهد شد. در نهایت، فایل [6] شامل وابستگی‌هایی است که ما مستقیماً درخواست نکرده‌ایم. این موارد با آیکونی نشان داده می‌شوند که با آیکون فایل اصلی [artifactId] متفاوت است.

در این سند، ما عمدتاً از Maven برای این قابلیت استفاده می‌کنیم. این کار ما را از نیاز به دانستن تمام وابستگی‌های کتابخانه‌ای که می‌خواهیم استفاده کنیم، بی‌نیاز می‌سازد. ما اجازه می‌دهیم Maven آن‌ها را مدیریت کند. علاوه بر این، با به اشتراک گذاشتن یک فایل [pom.xml] در میان توسعه‌دهندگان، می‌توانیم مطمئن شویم که هر توسعه‌دهنده از همان کتابخانه‌ها استفاده می‌کند.

در مثال‌های زیر، ما به سادگی فایل [pom.xml] مورد استفاده را ارائه خواهیم داد. خوانندگان تنها با استفاده از این فایل می‌توانند شرایط توصیف‌شده در این سند را بازتولید کنند. علاوه بر این، پروژه‌های Maven توسط اصلی‌ترین محیط‌های توسعه یکپارچه جاوا (IDEها) مانند اکلیپس، نت‌بینز، IntelliJ و JDeveloper پشتیبانی می‌شوند. بنابراین خوانندگان قادر خواهند بود از IDE مورد علاقه خود برای آزمایش مثال‌ها استفاده کنند.