زمانی در reddit.com ، در مبحث کامپایل و اجرای جاوا بدون IDE ، این سوال پرسیده شد: آیا دستوری وجود دارد که گروهی از فایل های جاوا را که داخل یک بسته هستند در یک پوشه جداگانه (بیایید آن را bin بنامیم ) کامپایل کند. و چگونه می توانم فایل های کلاس جدید را شروع کنم؟ کامپایل و اجرای جاوا بدون IDE - 1نویسنده تاپیک، kylolink ، توضیح می‌دهد: «وقتی شروع به استفاده از جاوا کردم، برای انجام تمام کامپایل‌ها برای من به Eclipse اعتماد کردم و فقط نگران نوشتن کد بودم.» من این سؤال را بارها دیده‌ام، و در واقع، این چیزی است که مرا بر آن داشت تا سیستم‌ها و IDE‌های GPS را در وبلاگ پست کنم: خوب یا بد؟ این پست در مورد نحوه انجام این کار است. در وبلاگ خود در مورد یادگیری جاوا با تست های ساده، در مورد اینکه چگونه گاهی اوقات دوست دارم از یک ویرایشگر متن ساده و ابزارهای خط فرمان برای نوشتن، ساخت و اجرای برنامه های کاربردی ساده استفاده کنم، نوشتم. اکنون یک ایده بسیار خوب در مورد اینکه IDE های جاوا مورد علاقه من به چه مقدار "سربار" نیاز دارند و تصمیم گیری اولیه در مورد اینکه آیا مزایای به دست آمده با استفاده از چارچوب برای توجیه "سربار" کافی است یا خیر، می گیرم. در اکثر برنامه های واقعی، شکی نیست که VL IDE ارزش زیادی دارد. با این حال، برای ساده ترین برنامه های کاربردی، همیشه اینطور نیست. ادامه این پست نحوه ساخت و اجرای کد جاوا را بدون IDE برای این مواقع نشان می دهد.

نوشتن و اجرای کد جاوا

برای واضح تر شدن مثال، از چند کلاس جاوا بسیار ساده استفاده می کنم که از طریق ترکیب یا ارث به یکدیگر مرتبط هستند و در یک بسته به نام dustin.examples قرار دارند . دو کلاس فاقد یک تابع هستند main؛ کلاس سوم، Main.java، تابعی دارد mainکه به شما امکان می دهد نحوه اجرای کلاس را بدون IDE نشان دهید. در زیر کد این سه کلاس آمده است: Parent.java
package dustin.examples;

public class Parent
{
   @Override
   public String toString()
   {
      return "I'm the Parent.";
   }
}
Child.java
package dustin.examples;

public class Child extends Parent
{
   @Override
   public String toString()
   {
      return "I'm the Child.";
   }
}
Main.java
package dustin.examples;

import static java.lang.System.out;

public class Main
{
   private final Parent parent = new Parent();
   private final Child child = new Child();

   public static void main(final String[] arguments)
   {
      final Main instance = new Main();
      out.println(instance.parent);
      out.println(instance.child);
   }
}
تصویر زیر ساختار دایرکتوری را با این کلاس‌های جاوا نشان می‌دهد . تصویر نشان می‌دهد که فایل‌های منبع در سلسله مراتب دایرکتوری هستند که نشان دهنده نام بسته هستند ( dustin/examples زیرا اطلاعات بسته dustin.examples است ) و این بسته سلسله مراتب دایرکتوری را منعکس می‌کند. در زیر شاخه SRC قرار دارد. من همچنین یک زیرشاخه کلاس ها (که در حال حاضر خالی است) ایجاد کردم تا فایل های .class کامپایل شده را در خود جای دهد تا جاواک این دایرکتوری را زمانی که وجود ندارد ایجاد نکند.

ساخت با JAVAC و اجرا با جاوا

مهم نیست که از چه رویکردی برای ایجاد کد جاوا استفاده می کنید (Ant، Maven، Gradle یا IDE)، در نهایت به JAVAC کاهش می یابد. گزینه های استاندارد در ابزار خط فرمان JAVAC Oracle/Sun را می توان با اجرای JAVAC -help و گزینه های افزونه اضافی را با اجرای JAVAC -help -X مشاهده کرد. جزئیات بیشتر در مورد نحوه استفاده از این گزینه ها را می توان در مستندات ابزار JAVAC برای ویندوز یا یونیکس/لینوکس یافت. همانطور که اسناد جاواک می گوید، گزینه -sourcepath را می توان برای بیان دایرکتوری که فایل های منبع در آن وجود دارد استفاده کرد. در ساختار دایرکتوری من که در تصویر بالا نشان داده شده است، این بدان معنی است که، با فرض اینکه من دستور JAVAC را از دایرکتوری C:\Java\examples\javacAndJava\ اجرا می کنم ، باید چیزی شبیه به این در دستور خود داشته باشم: Javac -sourcepath src SRC\Dustin\examples\*. جاوا . اسکرین شات زیر نتایج این کار را نشان می دهد. از آنجایی که ما یک دایرکتوری برای فایل‌های .classکامپایل و اجرای جاوا بدون IDE - 2 مشخص نکرده‌ایم ، آنها به‌طور پیش‌فرض در همان فهرستی که فایل‌های java. منبع از آن تشکیل شده‌اند، قرار می‌گیرند. ما می توانیم از گزینه برای رفع این وضعیت استفاده کنیم. دستور ما را می توان اکنون اجرا کرد، برای مثال، به عنوان Javac -sourcepath src -d classes src\Dustin\examples\*. من تو . همانطور که قبلا ذکر شد، پوشه (کلاس ها) انتخاب شده باید از قبل وجود داشته باشد. هنگامی که این اتفاق می افتد، دستور فایل های .class را در پوشه مشخص شده قرار می دهد، همانطور که در تصویر زیر نشان داده شده است ، با فایل های منبع جاوا که در فایل های . ابزار خط فرمان جاوا. این کار به سادگی با پیروی از دستورالعمل های ارائه شده در صفحات Java -help یا Java tools و مشخص کردن محل فایل های .class با گزینه ( یا ) انجام می شود. استفاده از هر دو روش برای تعیین دایرکتوری کلاس ها که در آن به دنبال فایل های .class هستند در تصویر زیر نشان داده شده است. آخرین آرگومان نام کامل (کل بسته جاوا) کلاسی است که تابع اصلی را دارد که باید اجرا شود. دستورات نشان داده شده در اسکرین شات زیر کلاس های جاوا -cp dustin.examples.Main و کلاس های جاوا -classpath dustin.examples.Main هستند. -dکامپایل و اجرای جاوا بدون IDE - 3-classpath-cpکامپایل و اجرای جاوا بدون IDE - 4

ساختن و دویدن با مورچه

برای ساده ترین برنامه های جاوا، همانطور که نشان داده شد، استفاده از JAVAC و Java به ترتیب برای ایجاد و اجرای برنامه بسیار آسان است. از آنجایی که برنامه‌ها کمی پیچیده‌تر می‌شوند (به عنوان مثال، کد موجود در بیش از یک بسته/دایرکتوری یا کلاس‌های وابستگی پیچیده‌تر در کتابخانه‌ها و چارچوب‌های شخص ثالث)، این رویکرد می‌تواند دشوار شود. Apache Ant قدیمی‌ترین ابزار ساخت «سه بزرگ» جاوا است و در هزاران برنامه کاربردی و استقرار استفاده شده است. همانطور که در یک پست وبلاگ قبلی گفتم، یک فایل ساخت Ant بسیار ساده به راحتی ایجاد می شود، به خصوص اگر با قالبی مانند آنچه در این پست توضیح دادم شروع شود. لیست کد زیر مربوط به فایل Ant's build.xml است که می تواند برای نوشتن فایل های .java در فایل های .class استفاده شود و سپس کلاس dustin.examples.Main را همانطور که در بالا با JAVAC و جاوا انجام شد اجرا کنید. build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="BuildingSansIDE" default="run" basedir=".">
   <description>Building Simple Java Applications Without An IDE</description>

   <target name="compile"
           description="Compile the Java code.">
      <javac srcdir="src"
             destdir="classes"
             debug="true"
      includeantruntime="false" />
   </target>

   <target name="run" depends="compile"
           description="Run the Java application.">
      <java classname="dustin.examples.Main" fork="true">
         <classpath>
           <pathelement path="classes"/>
         </classpath>
      </java>
   </target>
</project>
من از ویژگی‌های Ant استفاده نکردم و اهداف مشترکی را که معمولاً شامل می‌کنم (مانند "خالص" و "Javadoc") برای ساده نگه داشتن این مثال و نزدیک نگه داشتن آن به مثال قبلی با استفاده از JAVAC و Java درج نکردم. . همچنین توجه داشته باشید که من مجموعه "debug" را روی "true" برای کار JAVAC Ant فعال کرده ام زیرا در صورت خرابی Ant این درست نیست، اما در مورد پیش فرض JAVAC صادق است. جای تعجب نیست که Javac task و Java Ant شبیه ابزارهای دستوری JAVAC و جاوا هستند. از آنجا که من از نام پیش‌فرض استفاده کردم Ant انتظار یک فایل ساخت را دارد زمانی که به طور صریح مشخص نشده باشد (build.xml) و به این دلیل که هدف "Run" را به عنوان "پیش‌فرض" برای این بیلد ارائه کرده‌ام و به دلیل اینکه "کامپایل" را به عنوان اجرای وابستگی درج کرده‌ام. هدف "Run" و به دلیل اینکه Ant در مسیر محیط من قرار داشت، تنها کاری که باید در خط فرمان انجام می‌دادم این بود که Ant را وادار کنم تا نمونه ant را در دایرکتوری با فایل build.xml کامپایل و اجرا کند . این در تصویر زیر نشان داده شده است. کامپایل و اجرای جاوا بدون IDE - 5اگرچه من کامپایل و اجرای یک برنامه ساده جاوا را با Ant نشان داده‌ام، اما تمایل دارم فقط با Ant کامپایل کنم و با جاوا اجرا کنم (یا اسکریپتی که جاوا را فراخوانی می‌کند اگر مسیر کلاس سنگین باشد).

ساختن و دویدن با Maven

اگرچه Ant اولین ابزار اصلی ساخت جاوا بود، Apache Maven در نهایت شهرت خود را عمدتاً به دلیل پذیرش پیکربندی مبتنی بر کنوانسیون و پشتیبانی از مخازن کتابخانه های مشترک به دست آورد. استفاده از Maven زمانی آسان است که کد و اشیاء تولید شده از طرح دایرکتوری استاندارد آن پیروی کنند. متأسفانه، مثال من از این ساختار دایرکتوری پیروی نمی کند، اما Maven به ما اجازه می دهد که ساختار دایرکتوری پیش فرض مورد انتظار را نادیده بگیریم. در زیر لیستی از کدهای یک فایل Maven POM است که به جای دایرکتوری های منبع و هدف استفاده می شود و حداقل عناصر مورد نیاز دیگر را برای ساخت Maven با استفاده از Maven 3.2.1 فراهم می کند. pom.xml
<project>
   <modelVersion>4.0.0</modelVersion>
   <groupId>dustin.examples</groupId>
   <artifactId>CompilingAndRunningWithoutIDE</artifactId>
   <version>1</version>

   <build>
      <defaultGoal>compile</defaultGoal>
      <sourceDirectory>src</sourceDirectory>
      <outputDirectory>classes</outputDirectory>
      <finalName>${project.artifactId}-${project.version}</finalName>
   </build>
</project>
از آنجایی که فایل pom.xml بالا "defaultGoal" "کامپایل" را تعریف می کند و از آنجا که فایل های pom.xml سفارشی POM پیش فرض هستند که فایل اجرایی Maven (MVN) به دنبال آن است و به دلیل اینکه پوشه نصب Maven در مسیر من است، فقط من باید "MVN" را برای کامپایل کردن فایل های .class همانطور که در تصویر زیر ذکر شده است اجرا کنم. کامپایل و اجرای جاوا بدون IDE - 6همچنین می توانم برنامه کامپایل شده را از Maven با استفاده از دستور Mvn Exec اجرا کنم: Java -Dexec.mainClass = dustin.examples.Main که در تصویر زیر مشاهده می شود. کامپایل و اجرای جاوا بدون IDE - 7مانند Ant، ​​من تمایل دارم از Maven برای اجرای برنامه ساده جاوا خود استفاده نکنم، بلکه در عوض از جاوا روی کدهای کامپایل شده استفاده کنم (یا از اسکریپتی استفاده کنم که جاوا را مستقیماً در کلاس های طولانی فراخوانی می کند).

ساخت و اجرا با Gradle

Gradle جدیدترین، مد روز و شیک ترین از سه ابزار اصلی ساخت جاوا است. من گاهی اوقات در مورد ماهیت چیزهای مد روز شک دارم، اما چیزهای زیادی در مورد Gradle پیدا کرده ام که دوست دارم (به جای XML در Groovy نوشته شده است، پشتیبانی داخلی مورچه، پشتیبانی داخلی Ivy، پیکربندی بر اساس قرارداد که آسان است. برای پیکربندی مجدد، پشتیبانی از مخزن Maven و غیره). مثال زیر یک بیلد Gradle را نشان می دهد که می توان از آن برای کامپایل و اجرای یک برنامه ساده استفاده کرد که نمونه کد اصلی این پست است. من این مثال تطبیقی ​​را در وبلاگ سفارشی سازی پلاگین جاوا Simple Gradle ارائه کردم. build.gradle
apply plugin: 'java'
apply plugin: 'application'

// Redefine where Gradle should expect Java source files (*.java)
sourceSets {
    main {
        java {
            srcDirs 'src'
        }
    }
}

// Redefine where .class files are written
sourceSets.main.output.classesDir = file("classes")

// Specify main class to be executed
mainClassName = "dustin.examples.Main"

defaultTasks 'compileJava', 'run'
دو خط اول از فایل build.gradle استفاده از افزونه جاوا و افزونه Application را نشان می‌دهد که در نتیجه مجموعه‌ای از قابلیت‌ها به طور خودکار در این بیلد تعبیه می‌شوند. تعریف «sourceSets» و «sourceSets.main.output.classesDir» به شما این امکان را می‌دهد که فهرست‌های جاوای پیش‌فرض پلاگین Gradle را برای کد منبع جاوا و کلاس‌های باینری کامپایل‌شده، به ترتیب لغو کنید. پلاگین برنامه خط "defaultTasks" وظایفی را که به سادگی با تایپ کردن "Gradle" در خط فرمان اجرا می شوند را مشخص می کند: 'compileJava' وظیفه پیش فرض ارائه شده توسط افزونه جاوا و 'Run' وظیفه پیش فرض ارائه شده توسط افزونه Application است. از آنجایی که اسم اسمبلی ها را build.gradle گذاشتم و به همین دلیل وظایف پیش فرض را به صورت 'compileJava' و 'Run' مشخص کردم و چون پوشه نصب Gradle را در مسیر خود دارم، برای ساخت و اجرای نمونه ها تنها کاری که باید انجام می دادم تایپ بود. 'Gradle' و این در تصویر زیر نشان داده شده است. کامپایل و اجرای جاوا بدون IDE - 8حتی بزرگ‌ترین شکاک نیز باید بپذیرد که ساخت‌های Gradle برای این مثال ساده بسیار لغزنده هستند. این اختصار تکیه بر قراردادها و مفروضات خاص را با یک مکانیسم بسیار آسان برای نادیده گرفتن پیش فرض ها در صورت لزوم ترکیب می کند. اینکه به جای XML در Groovy هستش هم خیلی جذابه! مانند Ant و Maven، من تمایل دارم که فقط با این ابزارها بسازم و تمایل دارم فایل های کامپایل شده .class را مستقیماً از جاوا یا اسکریپتی که جاوا را فراخوانی می کند، اجرا کنم. به هر حال، من تمایل دارم این کلاس‌ها را برای راه‌اندازی در یک شیشه بایگانی کنم، اما این خارج از محدوده این مقاله است.

نتیجه

یک IDE اغلب برای ساختن برنامه‌ها و مثال‌های ساده ضروری نیست و حتی می‌تواند گران‌تر از هزینه ساخت نمونه‌های ساده باشد. در چنین حالتی، استفاده از JAVAC و Java برای ساخت و اجرای مستقیم نمونه ها بسیار آسان است. به عنوان نمونه هایی از مشارکت بیشتر، ابزار ساخت مانند Ant، ​​Maven یا Gradle جذاب تر می شود. این واقعیت که بسیاری از محیط‌های توسعه از این ابزارهای ساخت پشتیبانی می‌کنند به این معنی است که یک توسعه‌دهنده می‌تواند با استفاده از ابزار داخلی ایجاد شده در مراحل اولیه به IDE مهاجرت کند، اگر مشخص شود که پشتیبانی IDE به عنوان یک برنامه ساده به یک پروژه تمام عیار تبدیل شده است. .