| javac(1) | Basic Tools | javac(1) |
نام (NAME)
javac - تعاریف کلاس و واسط جاوا را میخواند و آنها را به بایتکد و فایلهای کلاس کامپایل میکند.
خلاصه دستور (SYNOPSIS)
javac [ options ] [ sourcefiles ] [ classes] [ @argfiles ]
آرگومانها میتوانند به هر ترتیبی باشند:
- options
- گزینههای خط فرمان. بخش «گزینهها» را ببینید.
- sourcefiles
- یک یا چند فایل مبدأ برای کامپایل شدن (مانند MyClass.java).
- classes
- یک یا چند کلاس برای پردازش حاشیهنویسیها (مانند MyPackage.MyClass).
- @argfiles
- یک یا چند فایل که گزینهها و فایلهای مبدأ را فهرست میکنند. گزینههای -J در این فایلها مجاز نیستند. بخش «فایلهای آرگومان خط فرمان» را ببینید.
توضیحات (DESCRIPTION)
دستور javac تعاریف کلاس و واسط نوشتهشده به زبان برنامهنویسی جاوا را میخواند و آنها را به فایلهای کلاس بایتکد کامپایل میکند. همچنین دستور javac میتواند حاشیهنویسیها را در فایلها و کلاسهای مبدأ جاوا پردازش کند.
دو روش برای ارسال نام فایلهای کد مبدأ به javac وجود دارد.
- •
- برای تعداد کمی از فایلهای مبدأ، نام فایلها را در خط فرمان فهرست کنید.
- •
- برای تعداد زیادی از فایلهای مبدأ، نام فایلها را در فایلی فهرست کنید که با فاصلهها یا شکستهای خط از هم جدا شدهاند. از نام فایل فهرست به همراه یک علامت at (@) در ابتدای آن با دستور javac استفاده کنید.
نام فایلهای کد مبدأ باید دارای پسوند .java، نام فایلهای کلاس باید دارای پسوند .class و هر دو فایلهای مبدأ و کلاس باید نام ریشهای داشته باشند که کلاس را مشخص میکند. برای مثال، کلاسی به نام MyClass در یک فایل مبدأ به نام MyClass.java نوشته شده و به یک فایل کلاس بایتکد به نام MyClass.class کامپایل میشود.
تعاریف کلاسهای درونی فایلهای کلاس اضافی تولید میکنند. این فایلهای کلاس دارای نامهایی هستند که نامهای کلاسهای درونی و بیرونی را ترکیب میکند، مانند MyClass$MyInnerClass.class.
فایلهای مبدأ را در ساختار درختی دایرکتوریای مرتب کنید که منعکسکنندهٔ درخت بستهٔ (package) آنها باشد. برای مثال، اگر تمام فایلهای مبدأ شما در /workspace هستند، کد مبدأ com.mysoft.mypack.MyClass را در /workspace/com/mysoft/mypack/MyClass.java قرار دهید.
بهطور پیشفرض، کامپایلر هر فایل کلاس را در همان دایرکتوری فایل مبدأ آن قرار میدهد. شما میتوانید با استفاده از گزینهٔ -d یک دایرکتوری مقصد مجزا مشخص کنید..SH "گزینهها (OPTIONS)" کامپایلر مجموعهای از گزینههای استاندارد دارد که در محیط توسعه کنونی پشتیبانی میشوند. مجموعه دیگری از گزینههای غیراستاندارد وجود دارند که مختص پیادهسازیهای کنونی ماشین مجازی و کامپایلر هستند و ممکن است در آینده تغییر کنند. گزینههای غیراستاندارد با گزینه -X آغاز میشوند.
- •
- همچنین «گزینههای کامپایل متقاطع» (Cross-Compilation Options) را ببینید
- •
- همچنین «گزینههای غیراستاندارد» (Nonstandard Options) را ببینید
گزینههای استاندارد (STANDARD OPTIONS)
- -Akey[=value]
-
گزینههایی را برای ارسال به پردازندههای حاشیهنویسی مشخص میکند. این گزینهها مستقیماً توسط javac تفسیر نمیشوند، بلکه برای استفاده در دسترس تکتک پردازندهها قرار میگیرند. مقدار key باید یک یا چند شناسه باشد که با نقطه (.) از هم جدا شدهاند. - -cp path یا -classpath path
-
محل یافتن فایلهای کلاس کاربر و (به صورت اختیاری) پردازندههای حاشیهنویسی و فایلهای منبع را مشخص میکند. این مسیر کلاس، مسیر کلاس کاربر در متغیر محیطی CLASSPATH را لغو (override) میکند. اگر هیچیک از CLASSPATH، -cp یا -classpath مشخص نشده باشد، class path کاربر همان دایرکتوری فعلی خواهد بود. بخش Setting the Class Path را ببینید.اگر گزینه -sourcepath مشخص نشده باشد، مسیر کلاس کاربر برای یافتن فایلهای منبع نیز جستجو میشود.
اگر گزینه -processorpath مشخص نشده باشد، مسیر کلاس برای یافتن پردازندههای حاشیهنویسی نیز جستجو میشود.
- -Djava.ext.dirs=directories
-
محل افزونههای نصبشده را جایگزین میکند. - -Djava.endorsed.dirs=directories
-
محل مسیر استانداردهای تأییدشده را جایگزین میکند. - -d directory
-
دایرکتوری مقصد را برای فایلهای کلاس تعیین میکند. این دایرکتوری باید از قبل وجود داشته باشد زیرا javac آن را ایجاد نمیکند. اگر کلاسی بخشی از یک بسته باشد، javac فایل کلاس را در زیردایرکتوریای قرار میدهد که بازتابدهنده نام بسته است و دایرکتوریها را بر اساس نیاز ایجاد میکند.اگر -d /home/myclasses را مشخص کنید و نام کلاس com.mypackage.MyClass باشد، فایل کلاس در مسیر /home/myclasses/com/mypackage/MyClass.class قرار میگیرد.
اگر گزینه -d مشخص نشده باشد، javac هر فایل کلاس را در همان دایرکتوری فایل منبعی که از آن تولید شده است، قرار میدهد.
نکته: دایرکتوری مشخصشده توسط گزینه -d به طور خودکار به مسیر کلاس کاربر شما افزوده نمیشود.
- -deprecation
-
توضیحاتی درباره هر مورد استفاده یا بازنویسی (override) از یک عضو یا کلاس منسوخشده (deprecated) را نشان میدهد. بدون گزینه -deprecation، کامپایلر javac خلاصهای از فایلهای منبعی را نمایش میدهد که از اعضا یا کلاسهای منسوخشده استفاده یا آنها را بازنویسی میکنند. گزینه -deprecation شکل کوتاهشده -Xlint:deprecation است. - -encoding encoding
-
نام کدگذاری فایل منبع را تعیین میکند، مانند EUC-JP و UTF-8. اگر گزینه -encoding مشخص نشده باشد، از مبدل پیشفرض پلتفرم استفاده میشود. - -endorseddirs directories
-
محل مسیر استانداردهای تأییدشده را جایگزین میکند. - -extdirs directories
-
محل دایرکتوری ext را جایگزین میکند. متغیر directories فهرستی از دایرکتوریها است که با دونقطه (:) از هم جدا شدهاند. هر فایل JAR در دایرکتوریهای مشخصشده برای یافتن فایلهای کلاس جستجو میشود. تمام فایلهای JAR یافتشده بخشی از مسیر کلاس خواهند شد.اگر در حال کامپایل متقاطع هستید (کامپایل کلاسها بر اساس کلاسهای bootstrap و افزونههای یک پیادهسازی متفاوت از پلتفرم Java)، این گزینه دایرکتوریهای حاوی کلاسهای افزونه را مشخص میکند. برای اطلاعات بیشتر بخش Cross-Compilation Options را ببینید.
- -g
-
تمام اطلاعات اشکالزدایی، از جمله متغیرهای محلی را تولید میکند. به طور پیشفرض، تنها اطلاعات شماره خط و فایل منبع تولید میشود. - -g:none
-
هیچگونه اطلاعات اشکالزدایی تولید نمیکند. - -g:[keyword list]
-
تنها انواع خاصی از اطلاعات اشکالزدایی را که با فهرستی از کلیدواژههای جدا شده با ویرگول مشخص شدهاند، تولید میکند. کلیدواژههای معتبر عبارتند از:
- -help
-
خلاصهای از گزینههای استاندارد را چاپ میکند. - -implicit:[class, none]
-
تولید فایلهای کلاس را برای فایلهای منبعی که به طور ضمنی بارگذاری شدهاند، کنترل میکند. برای تولید خودکار فایلهای کلاس، از -implicit:class استفاده کنید. برای جلوگیری از تولید فایل کلاس، از -implicit:none استفاده کنید. اگر این گزینه مشخص نشده باشد، حالت پیشفرض تولید خودکار فایلهای کلاس است. در این حالت، اگر هنگام انجام پردازش حاشیهنویسی هر یک از چنین فایلهای کلاسی تولید شوند، کامپایلر هشداری صادر میکند. زمانی که گزینه -implicit به طور صریح تنظیم شده باشد، این هشدار صادر نمیشود. بخش Searching for Types را ببینید. - -Joption
-
گزینه option را به ماشین مجازی جاوا (JVM) ارسال میکند؛ که در آن option یکی از گزینههای شرح دادهشده در صفحه ارجاع اجراکننده جاوا است. برای نمونه، -J-Xms48m حافظه راهاندازی را روی ۴۸ مگابایت تنظیم میکند. راهنمای java(1) را ببینید.نکته: گزینههای CLASSPATH، -classpath، -bootclasspath و -extdirs کلاسهای استفادهشده برای اجرای javac را مشخص نمیکنند. تلاش برای سفارشیسازی پیادهسازی کامپایلر با استفاده از این گزینهها و متغیرها خطرناک است و اغلب به هدف مورد نظر شما منتهی نمیشود. اگر لازم است پیادهسازی کامپایلر را سفارشیسازی کنید، از گزینه -J برای ارسال گزینهها به اجراکننده زیرین Java استفاده کنید.
- -nowarn
-
پیامهای هشدار را غیرفعال میکند. این گزینه عملکردی مشابه با گزینه -Xlint:none دارد. - -parameters
-
نامهای رسمی پارامترهای سازندهها و متدها را در فایل کلاس تولیدشده ذخیره میکند تا متد java.lang.reflect.Executable.getParameters از Reflection API بتواند آنها را بازیابی کند. - -proc: [none, only]
-
انجام پردازش حاشیهنویسی و کامپایل را کنترل میکند. مقدار -proc:none به این معنی است که کامپایل بدون پردازش حاشیهنویسی انجام میشود. مقدار -proc:only به این معنی است که فقط پردازش حاشیهنویسی انجام میشود، بدون اینکه کامپایل بعدی صورت گیرد. - -processor class1 [,class2,class3...]
-
نامهای پردازندههای حاشیهنویسی برای اجرا را مشخص میکند. این گزینه فرآیند پیشفرض شناسایی خودکار را دور میزند. - -processorpath path
-
محل یافتن پردازندههای حاشیهنویسی را مشخص میکند. اگر از این گزینه استفاده نشود، مسیر کلاس برای یافتن پردازندهها جستجو میشود. - -s dir
-
دایرکتوری محل قرارگیری فایلهای منبع تولیدشده را مشخص میکند. این دایرکتوری باید از قبل وجود داشته باشد زیرا javac آن را ایجاد نمیکند. اگر کلاسی بخشی از یک بسته باشد، کامپایلر فایل منبع را در زیردایرکتوریای قرار میدهد که بازتابدهنده نام بسته است و دایرکتوریها را بر اساس نیاز ایجاد میکند.اگر -s /home/mysrc را مشخص کنید و نام کلاس com.mypackage.MyClass باشد، فایل منبع در /home/mysrc/com/mypackage/MyClass.java قرار میگیرد.
- -source release
-
نسخه کد منبع پذیرفتهشده را مشخص میکند. مقادیر زیر برای release مجاز هستند:
- 1.3
- کامپایلر از assertionها، genericها یا سایر قابلیتهای زبانی معرفیشده پس از Java SE 1.3 پشتیبانی نمیکند.
- 1.4
- کامپایلر کدهای حاوی assertion را که در Java SE 1.4 معرفی شدهاند، میپذیرد.
- 1.5
- کامپایلر کدهای حاوی genericها و سایر قابلیتهای زبانی معرفیشده در Java SE 5 را میپذیرد.
- 5
- مترادف با 1.5.
- 1.6
- هیچ تغییری در زبان در Java SE 6 معرفی نشد. با این حال، خطاهای کدگذاری در فایلهای منبع اکنون بر خلاف نسخههای پیشین Java Platform, Standard Edition، به عنوان خطا و نه هشدار گزارش میشوند.
- 6
- مترادف با 1.6.
- 1.7
- کامپایلر کدهای دارای قابلیتهای معرفیشده در Java SE 7 را میپذیرد.
- 7
- مترادف با 1.7.
- 1.8
- این مقدار پیشفرض است. کامپایلر کدهای دارای قابلیتهای معرفیشده در Java SE 8 را میپذیرد.
- 8
- مترادف با 1.8.
- -sourcepath sourcepath
-
مسیر کد منبع را برای جستجوی تعاریف کلاس یا رابط (interface) مشخص میکند. همانند مسیر کلاس کاربر، ورودیهای مسیر منبع در Oracle Solaris با دونقطه (:) و در Windows با نقطهویرگول (;) از هم جدا میشوند و میتوانند دایرکتوریها، آرشیوهای JAR یا آرشیوهای ZIP باشند. اگر از بستهها استفاده شود، نام مسیر محلی در دایرکتوری یا آرشیو باید بازتابدهنده نام بسته باشد.نکته: کلاسهای یافتشده از طریق مسیر کلاس ممکن است در صورتی که فایلهای منبع آنها نیز یافت شوند، مجدداً کامپایل شوند. بخش Searching for Types را ببینید.
- -verbose
-
خروجی پرگو ارائه میدهد که شامل اطلاعاتی درباره هر کلاس بارگذاریشده و هر فایل منبع کامپایلشده است. - -version
-
اطلاعات نگارش را چاپ میکند. - -werror
-
در صورت بروز هشدارها، فرآیند کامپایل را متوقف میکند. - -X
-
اطلاعات مربوط به گزینههای غیراستاندارد را نمایش داده و خارج میشود..SS "گزینههای کامپایل متقابل (CROSS-COMPILATION OPTIONS)" بهطور پیشفرض، کلاسها در برابر کلاسهای راهانداز (bootstrap) و افزونهٔ (extension) پلتفرمی که javac به همراه آن ارائه شده است کامپایل میشوند. اما javac از کامپایل متقابل نیز پشتیبانی میکند، که در آن کلاسها در برابر کلاسهای راهانداز و افزونهٔ یک پیادهسازی دیگر از پلتفرم Java کامپایل میشوند. هنگام کامپایل متقابل، استفاده از گزینههای -bootclasspath و -extdirs حائز اهمیت است. - -target version
-
فایلهای کلاسی تولید میکند که نسخهٔ مشخصی از ماشین مجازی را هدف قرار میدهند. فایلهای کلاس روی هدف مشخصشده و انتشارهای بعدی اجرا میشوند، اما روی نسخههای قبلی JVM اجرا نخواهند شد. هدفهای معتبر عبارتند از 1.1، 1.2، 1.3، 1.4، 1.5 (همچنین 5)، 1.6 (همچنین 6)، 1.7 (همچنین 7) و 1.8 (همچنین 8).مقدار پیشفرض گزینهٔ -target به مقدار گزینهٔ -source بستگی دارد:
- •
- اگر گزینهٔ -source مشخص نشده باشد، مقدار گزینهٔ -target برابر 1.8 خواهد بود
- •
- اگر گزینهٔ -source برابر 1.2 باشد، مقدار گزینهٔ -target برابر 1.4 است
- •
- اگر گزینهٔ -source برابر 1.3 باشد، مقدار گزینهٔ -target برابر 1.4 است
- •
- اگر گزینهٔ -source برابر 1.5 باشد، مقدار گزینهٔ -target برابر 1.8 است
- •
- اگر گزینهٔ -source برابر 1.6 باشد، مقدار گزینهٔ -target برابر 1.8 است
- •
- اگر گزینهٔ -source برابر 1.7 باشد، مقدار گزینهٔ -target برابر 1.8 است
- •
- برای تمام مقادیر دیگر گزینهٔ -source، مقدار گزینهٔ -target برابر با مقدار گزینهٔ -source خواهد بود.
- -bootclasspath bootclasspath
-
کامپایل متقابل را در برابر مجموعه کلاسهای راهانداز مشخصشده انجام میدهد. همانند مسیر کلاس کاربر، ورودیهای مسیر کلاس راهانداز با دونقطه (:) از هم جدا میشوند و میتوانند دایرکتوریها، آرشیوهای JAR یا آرشیوهای ZIP باشند.
گزینه پروفایل فشرده (COMPACT PROFILE OPTION)
از JDK 8 به بعد، کامپایلر javac از پروفایلهای فشرده (compact profiles) پشتیبانی میکند. با پروفایلهای فشرده، برنامههایی که به تمام پلتفرم Java نیاز ندارند میتوانند مستقر شده و با ردپای کوچکتری اجرا شوند. قابلیت پروفایلهای فشرده میتواند برای کاهش زمان بارگیری برنامهها از فروشگاههای برنامه استفاده شود. این ویژگی باعث استقرار فشردهتر برنامههای Java میشود که JRE را به همراه دارند. این ویژگی همچنین در دستگاههای کوچک مفید است.
مقادیر پروفایل پشتیبانیشده شامل compact1، compact2 و compact3 هستند. این لایهها افزایشی هستند. هر پروفایل فشرده با شماره بالاتر، شامل تمامی APIهای موجود در پروفایلهای با شماره کمتر است.
- -profile
-
هنگام استفاده از پروفایلهای فشرده، این گزینه نام پروفایل را در حین کامپایل مشخص میکند. برای مثال:javac -profile compact1 Hello.java
دستور javac کد منبعی را که از هرگونه API پلتفرم Java SE که در پروفایل مشخصشده موجود نیست استفاده کند، کامپایل نمیکند. در اینجا نمونهای از پیام خطایی آورده شده است که حاصل تلاش برای کامپایل چنین کد منبعی است:
cd jdk1.8.0/bin
./javac -profile compact1 Paint.java
Paint.java:5: error: Applet is not available in profile 'compact1'
import java.applet.Applet;
در این مثال، میتوانید با تغییر کد منبع بهگونهای که از کلاس Applet استفاده نکند، خطا را رفع کنید. همچنین میتوانید خطا را با کامپایل بدون گزینهٔ -profile برطرف سازید. در این صورت، کامپایل در برابر مجموعهٔ کامل APIهای Java SE انجام خواهد شد. (هیچیک از پروفایلهای فشرده شامل کلاس Applet نیستند.)
روش جایگزین برای کامپایل با پروفایلهای فشرده، استفاده از گزینهٔ -bootclasspath برای مشخص کردن مسیر یک فایل rt.jar است که ایمیج یک پروفایل را تعیین میکند. در مقابل، استفاده از گزینهٔ -profile نیازی به وجود ایمیج پروفایل در سیستم در زمان کامپایل ندارد. این ویژگی هنگام کامپایل متقابل مفید است.
گزینههای غیراستاندارد (NONSTANDARD OPTIONS)
- -Xbootclasspath/p:path
-
یک پسوند به مسیر کلاس راهانداز (bootstrap class path) اضافه میکند. - -Xbootclasspath/a:path
-
یک پیشوند به مسیر کلاس راهانداز اضافه میکند. - -Xbootclasspath/:path
-
مکان فایلهای کلاس راهانداز را بازنویسی میکند. - -Xdoclint:[-]group [/access]
-
گروههای خاصی از بررسیها را فعال یا غیرفعال میکند، که در آن group یکی از مقادیر زیر است: accessibility، syntax، reference، html یا missing. برای اطلاعات بیشتر دربارهٔ این گروههای بررسی، به گزینهٔ -Xdoclint در دستور javadoc مراجعه کنید. گزینهٔ -Xdoclint بهطور پیشفرض در دستور javac غیرفعال است.متغیر access حداقل سطح دید کلاسها و اعضایی را که گزینهٔ -Xdoclint بررسی میکند مشخص میسازد. این متغیر میتواند یکی از مقادیر زیر را داشته باشد (به ترتیب از بیشترین به کمترین میزان دید): public، protected، package و private. برای مثال، گزینهٔ زیر کلاسها و اعضایی را بررسی میکند (با تمامی گروههای بررسی) که دارای سطح دسترسی protected و بالاتر هستند (که شامل protected، package و public میشود):
-Xdoclint:all/protected
گزینهٔ زیر تمامی گروههای بررسی را برای همه سطوح دسترسی فعال میکند، بهجز اینکه خطاهای HTML را برای کلاسها و اعضایی که سطح دسترسی package و بالاتر دارند (شامل package و public) بررسی نخواهد کرد:
-Xdoclint:all,-html/package
- -Xdoclint:none
-
تمامی گروههای بررسی را غیرفعال میکند. - -Xdoclint:all[/access]
-
تمامی گروههای بررسی را فعال میکند. - -Xlint
-
تمامی هشدارهای توصیهشده را فعال میکند. در این انتشار، فعالسازی تمام هشدارهای موجود توصیه میشود. - -Xlint:all
-
تمامی هشدارهای توصیهشده را فعال میکند. در این انتشار، فعالسازی تمام هشدارهای موجود توصیه میشود. - -Xlint:none
-
تمامی هشدارها را غیرفعال میکند. - -Xlint:name
-
هشدار name را غیرفعال میکند. برای مشاهده فهرستی از هشدارهایی که میتوانید با این گزینه غیرفعال کنید، به بخش Enable or Disable Warnings with the -Xlint Option مراجعه کنید. - -Xlint:-name
-
هشدار name را غیرفعال میکند. برای دریافت فهرستی از هشدارهایی که میتوانید با این گزینه غیرفعال کنید، به بخش Enable or Disable Warnings with the -Xlint Option با گزینهٔ -Xlint مراجعه کنید. - -Xmaxerrs number
-
حداکثر تعداد خطاهایی را که باید چاپ شوند تعیین میکند. - -Xmaxwarns number
-
حداکثر تعداد هشدارهایی را که باید چاپ شوند تعیین میکند. - -Xstdout filename
-
پیامهای کامپایلر را به فایل نامبرده ارسال میکند. بهطور پیشفرض، پیامهای کامپایلر به System.err فرستاده میشوند. - -Xprefer:[newer,source]
-
مشخص میکند هنگامی که هم فایل منبع و هم فایل کلاس برای یک نوع یافت میشوند، کدام فایل خوانده شود. (به Searching for Types مراجعه کنید). اگر از گزینهٔ -Xprefer:newer استفاده شود، فایل جدیدتر میان منبع یا کلاس را برای نوع میخواند (پیشفرض). اگر از گزینهٔ -Xprefer:source استفاده شود، فایل منبع را میخواند. هنگامی که میخواهید مطمئن شوید پردازندههای حاشیهنویسی میتوانند به حاشیهنویسیهای اعلانشده با سیاست ماندگاری SOURCE دسترسی داشته باشند، از -Xprefer:source استفاده کنید. - -Xpkginfo:[always,legacy,nonempty]
-
کنترل میکند که آیا javac فایلهای package-info.class را از روی فایلهای package-info.java تولید کند یا خیر. آرگومانهای حالت ممکن برای این گزینه شامل موارد زیر است.
- always
- همیشه برای هر فایل package-info.java یک فایل package-info.class تولید کند. این گزینه ممکن است زمانی مفید باشد که از سامانه ساختی مانند Ant استفاده میکنید که بررسی میکند هر فایل .java دارای یک فایل .class متناظر باشد.
- legacy
- تنها در
صورتی فایل
package-info.class را
تولید
میکند که
package-info.java حاوی
حاشیهنویسی
باشد. اگر
package-info.java فقط
شامل
توضیحات
باشد، فایل
package-info.class تولید
نکن.
نکته: اگر تمام حاشیهنویسیها در فایل package-info.java دارای RetentionPolicy.SOURCE باشند، ممکن است یک فایل package-info.class تولید شود اما خالی باشد.
- nonempty
- تنها در صورتی فایل package-info.class را تولید میکند که package-info.java شامل حاشیهنویسیهایی با RetentionPolicy.CLASS یا RetentionPolicy.RUNTIME باشد.
- -Xprint
-
نمایشی متنی از انواع مشخصشده را برای اهداف اشکالزدایی چاپ میکند. نه پردازش حاشیهنویسی را انجام میدهد و نه کامپایل را. قالب خروجی ممکن است تغییر کند..TP -XprintProcessorInfo
اطلاعات مربوط به یادداشتهایی (annotations) که از یک پردازشگر خواسته شده پردازش کند را چاپ میکند. - -XprintRounds
-
اطلاعات مربوط به دورهای اولیه و بعدی پردازش یادداشتها (annotation processing rounds) را چاپ میکند.
فعال یا غیرفعالسازی هشدارها با گزینه -XLINT (ENABLE OR DISABLE WARNINGS WITH THE -XLINT OPTION)
هشدار name را با گزینه -Xlint:name فعال کنید، که در آن name یکی از نامهای هشدار زیر است. توجه داشته باشید که میتوانید یک هشدار را با گزینه -Xlint:-name: غیرفعال کنید.
- cast
- درباره
تبدیل
نوعهای (casts)
غیرضروری و
زائد هشدار
میدهد،
برای مثال:
String s = (String) "Hello!"
- classfile
- درباره مسائل مربوط به محتویات فایل کلاس (class file) هشدار میدهد.
- deprecation
- درباره
استفاده از
موارد
منسوخشده
(deprecated) هشدار
میدهد،
برای مثال:
java.util.Date myDate = new java.util.Date();
int currentDay = myDate.getDay();
متد java.util.Date.getDay از زمان JDK 1.1 منسوخ شده است.
- dep-ann
- درباره
مواردی که
با یک توضیح
Javadoc از نوع @deprecated
مستند
شدهاند،
اما فاقد
یادداشت
@Deprecated هستند،
هشدار
میدهد؛
برای مثال:
/**
* @deprecated As of Java SE 7, replaced by {@link #newMethod()}*/
public static void deprecatedMethood() { }public static void newMethod() { } - divzero
- درباره
تقسیم بر
عدد صحیح
ثابت ۰
هشدار
میدهد،
برای مثال:
int divideByZero = 42 / 0;
- empty
- درباره
عبارتهای
خالی پس از
دستورهای if
هشدار
میدهد،
برای مثال:
class E {void m() {if (true) ;
}
}
- fallthrough
- بلوکهای switch
را برای
موارد
انتقال
خودکار (fall-through)
بررسی
میکند و
برای هر
موردی که
یافت شود
پیام
هشداری
صادر
مینماید.
موارد fall-through
مواردی در
یک بلوک switch
(بهجز
آخرین case در
بلوک) هستند
که کد آنها
فاقد دستور
break است و
اجازه
میدهد
اجرای کد از
آن case به case
بعدی سرریز
شود. برای
مثال، کد پس
از برچسب case 1
در این بلوک
switch با دستور break
پایان
نیافته است:
switch (x) {case 1:
System.out.println("1");// No break statement here.
case 2:
System.out.println("2");}
اگر هنگام کامپایل این کد از گزینه -Xlint:fallthrough استفاده شده باشد، کامپایلر هشداری درباره امکان fall-through به case، همراه با شماره خط case مورد نظر صادر میکند.
- finally
- درباره
بندهای finally
که
نمیتوانند
بهطور
عادی خاتمه
یابند
هشدار
میدهد،
برای مثال:
public static int m() {try {throw new NullPointerException();
} catch (NullPointerException(); {System.err.println("Caught NullPointerException.");return 1;
} finally {return 0;
}
}
کامپایلر برای بلوک finally در این مثال هشداری تولید میکند. هنگامی که متد int فراخوانی میشود، مقدار 0 را برمیگرداند. یک بلوک finally هنگام خروج از بلوک try اجرا میشود. در این مثال، هنگامی که کنترل به بلوک catch منتقل میشود، متد int خارج میشود. با این حال، بلوک finally باید اجرا شود، بنابراین حتی اگر کنترل به خارج از متد منتقل شده باشد، باز هم اجرا میشود.
- options
- درباره مسائل مربوط به استفاده از گزینههای خط فرمان هشدار میدهد. بخش Cross-Compilation Options را ببینید.
- overrides
- درباره
مسائل
مربوط به
بازنویسی
متدها (method overrides)
هشدار
میدهد.
برای مثال،
دو کلاس زیر
را در نظر
بگیرید:.sp
public class ClassWithVarargsMethod {void varargsMethod(String... s) { }}
public class ClassWithOverridingMethod extends ClassWithVarargsMethod {@Override
void varargsMethod(String[] s) { }}
کامپایلر هشداری شبیه به مورد زیر صادر میکند:.
warning: [override] varargsMethod(String[]) in ClassWithOverridingMethod
overrides varargsMethod(String...) in ClassWithVarargsMethod; overriding
method is missing '...'
هنگامی که کامپایلر با یک متد varargs مواجه میشود، پارامتر صوری varargs را به یک آرایه تبدیل میکند. در متد ClassWithVarargsMethod.varargsMethod، کامپایلر پارامتر صوری varargs به صورت String... s را به پارامتر صوری String[] s، یعنی یک آرایه ترجمه میکند که با پارامتر صوری متد ClassWithOverridingMethod.varargsMethod مطابقت دارد. در نتیجه، این مثال کامپایل میشود.
- path
- درباره
مؤلفههای
نامعتبر
مسیر و
دایرکتوریهای
ناموجود
مسیر در خط
فرمان (با
توجه به
مسیر کلاس (class
path)، مسیر
مبدا (source path) و
سایر
مسیرها)
هشدار
میدهد.
چنین
هشدارهایی
را
نمیتوان
با استفاده
از یادداشت
@SuppressWarnings نادیده
گرفت، برای
مثال:
javac -Xlint:path -classpath /nonexistentpath Example.java
- processing
- درباره
مسائل
مربوط به
پردازش
یادداشتها
(annotation processing) هشدار
میدهد.
کامپایلر
این هشدار
را زمانی
صادر
میکند که
کلاسی
دارای یک
یادداشت
باشد و از
پردازشگر
یادداشتی
استفاده
کنید که
نمیتواند
آن نوع
استثنا را
پردازش کند.
برای مثال،
کد زیر یک
پردازشگر
یادداشت
ساده است:
فایل مبدا AnnocProc.java:
import java.util.*;
import javax.annotation.processing.*;
import javax.lang.model.*;
import.javaz.lang.model.element.*;
@SupportedAnnotationTypes("NotAnno")public class AnnoProc extends AbstractProcessor {public boolean process(Set<? extends TypeElement> elems, RoundEnvironment renv){return true;
}
public SourceVersion getSupportedSourceVersion() {return SourceVersion.latest();
}
}
فایل مبدا AnnosWithoutProcessors.java:
@interface Anno { }@Anno
class AnnosWithoutProcessors { }دستورهای زیر پردازشگر یادداشت AnnoProc را کامپایل کرده، سپس این پردازشگر یادداشت را روی فایل مبدا AnnosWithoutProcessors.java اجرا میکنند:
javac AnnoProc.java
javac -cp . -Xlint:processing -processor AnnoProc -proc:only AnnosWithoutProcessors.java
هنگامی که کامپایلر پردازشگر یادداشت را روی فایل مبدا AnnosWithoutProcessors.java اجرا میکند، هشدار زیر را صادر مینماید:
warning: [processing] No processor claimed any of these annotations: Anno
برای رفع این مشکل، میتوانید نام یادداشت تعریفشده و استفادهشده در کلاس AnnosWithoutProcessors را از Anno به NotAnno تغییر دهید.
- rawtypes
- درباره
عملیاتهای
بررسینشده
روی انواع
خام (raw types)
هشدار
میدهد.
عبارت زیر
یک هشدار rawtypes
ایجاد
میکند:
void countElements(List l) { ... }مثال زیر هشدار rawtypes ایجاد نمیکند
void countElements(List<?> l) { ... }نوع List یک نوع خام (raw type) است. با این حال، List<?> یک نوع پارامتریشده با نویسه عام نامحدود (unbounded wildcard parameterized type) است. از آنجا که List یک رابط (interface) پارامتریشده است، همیشه آرگومان نوع آن را مشخص کنید. در این مثال، آرگومان صوری List با یک نویسه عام نامحدود (?) به عنوان پارامتر نوع صوری آن مشخص شده است، بدین معنا که متد countElements میتواند هر نمونهسازی از رابط List را بپذیرد.
- Serial
- در مورد
تعاریف
ناموجود
serialVersionUID در
کلاسهای
قابل
سریالسازی
(serializable) هشدار
میدهد،
برای مثال:
public class PersistentTime implements Serializable
{private Date time;
public PersistentTime() {time = Calendar.getInstance().getTime();
}
public Date getTime() {return time;
}
}
کامپایلر هشدار زیر را تولید میکند:
warning: [serial] serializable class PersistentTime has no definition of
serialVersionUID
اگر یک کلاس قابل سریالسازی صراحتاً فیلدی به نام serialVersionUID را اعلان نکند، محیط زمان اجرای سریالسازی یک مقدار پیشفرض serialVersionUID را بر اساس جنبههای مختلف کلاس، همانطور که در Java Object Serialization Specification شرح داده شده است، برای آن کلاس محاسبه میکند. با این حال، اکیداً توصیه میشود که همه کلاسهای قابل سریالسازی مقادیر serialVersionUID را به طور صریح اعلان کنند، زیرا فرایند پیشفرض محاسبه مقادیر serialVersionUID به شدت به جزئیات کلاس وابسته است که میتواند بسته به پیادهسازیهای کامپایلر متفاوت باشد، و در نتیجه ممکن است باعث ایجاد یک InvalidClassExceptions غیرمنتظره در حین دیسریالسازی شود. برای تضمین یک مقدار serialVersionUID سازگار در بین پیادهسازیهای مختلف کامپایلر Java، یک کلاس قابل سریالسازی باید یک مقدار صریح برای serialVersionUID اعلان کند.
- static
- در مورد
مسائل
مربوط به
استفاده از
موارد
ایستا (statics)
هشدار
میدهد،
برای مثال:
class XLintStatic {static void m1() { }void m2() { this.m1(); }}
کامپایلر هشدار زیر را تولید میکند:
warning: [static] static method should be qualified by type name,
XLintStatic, instead of by an expression
برای حل این مشکل، میتوانید متد static با نام m1 را به صورت زیر فراخوانی کنید:
XLintStatic.m1();
همچنین، میتوانید کلمه کلیدی static را از اعلان متد m1 حذف کنید.
- try
- در مورد
مسائل
مربوط به
استفاده از
بلوکهای
try، از جمله
دستورهای
try-with-resources هشدار
میدهد.
برای مثال،
برای دستور
زیر هشداری
تولید
میشود
زیرا منبع
ac
اعلانشده
در بلوک try
استفاده
نشده است:
try ( AutoCloseable ac = getResource() ) { // do nothing} - unchecked
- جزئیات
بیشتری
درباره
هشدارهای
تبدیل
بررسینشده
(unchecked conversion warnings) که
توسط Java Language Specification
الزامی
شدهاند
ارائه
میدهد،
برای مثال:
List l = new ArrayList<Number>();
List<String> ls = l; // unchecked warning
در طول پاکسازی نوع (type erasure)، انواع ArrayList<Number> و List<String> به ترتیب به ArrayList و List تبدیل میشوند.
دستور ls دارای نوع پارامتریشده List<String> است. هنگامی که List ارجاعشده توسط l به ls منتسب میشود، کامپایلر یک هشدار بررسینشده (unchecked warning) تولید میکند. در زمان کامپایل، کامپایلر و JVM نمیتوانند تشخیص دهند که آیا l به نوع List<String> ارجاع دارد یا خیر. در این حالت، l به نوع List<String> ارجاع ندارد. در نتیجه، آلودگی هیپ (heap pollution) رخ میدهد.
وضعیت آلودگی هیپ زمانی رخ میدهد که شیء List با نام l، که نوع ایستای آن List<Number> است، به شیء List دیگری با نام ls که نوع ایستای متفاوتی یعنی List<String> دارد، منتسب شود. با این حال، کامپایلر همچنان این انتساب را مجاز میداند. برای حفظ سازگاری عقبرو با نسخههایی از Java SE که از جنریکها (generics) پشتیبانی نمیکنند، کامپایلر باید این انتساب را مجاز بداند. به دلیل پاکسازی نوع، List<Number> و List<String> هر دو به List تبدیل میشوند. در نتیجه، کامپایلر انتساب شیء l, را که دارای نوع خام List است، به شیء ls مجاز میداند.
- varargs
- در مورد
استفادههای
ناامن از
متدهای
دارای
آرگومانهای
متغیر (varargs)،
بهویژه
آنهایی که
حاوی
آرگومانهای
غیرقابل
بازنمایی
(non-reifiable) هستند،
هشدار
میدهد،
برای مثال:
public class ArrayBuilder {public static <T> void addToList (List<T> listArg, T... elements) {for (T x : elements) {listArg.add(x);
}
}
نکته: یک نوع غیرقابل بازنمایی (non-reifiable)، نوعی است که اطلاعات نوع آن در زمان اجرا به طور کامل در دسترس نیست.
کامپایلر هشدار زیر را برای تعریف متد ArrayBuilder.addToList تولید میکند.sp
warning: [varargs] Possible heap pollution from parameterized vararg type T
هنگامی که کامپایلر با یک متد varargs مواجه میشود، پارامتر رسمی varargs را به یک آرایه ترجمه میکند. با این حال، زبان برنامهنویسی Java ساخت آرایههایی از نوعهای پارامتری (parameterized types) را مجاز نمیداند. در متد ArrayBuilder.addToList، کامپایلر پارامتر رسمی varargs با عنوان T... elements را به پارامتر رسمی T[] elements، که یک آرایه است، ترجمه میکند. با این وجود، به دلیل پاکسازی نوع (type erasure)، کامپایلر پارامتر رسمی varargs را به Object[] elements تبدیل مینماید. در نتیجه، امکان آلودگی هیپ (heap pollution) وجود دارد.
فایلهای آرگومان خط فرمان (COMMAND-LINE ARGUMENT FILES)
برای کوتاهتر کردن یا سادهسازی دستور javac، میتوانید یک یا چند فایل حاوی آرگومانهای دستور javac (بهجز گزینههای -J) را مشخص کنید. این قابلیت به شما امکان میدهد تا دستورهای javac با هر طولی را در هر سیستمعاملی ایجاد کنید.
یک فایل آرگومان میتواند شامل گزینههای javac و نام فایلهای سورس در هر ترکیبی باشد. آرگومانهای درون یک فایل میتوانند با فاصله یا نویسههای خط جدید (newline) از یکدیگر جدا شوند. اگر نام یک فایل حاوی فاصلههای درونی است، کل نام فایل را درون علامت نقلقول دوتایی (double quotation marks) قرار دهید.
نام فایلها درون یک فایل آرگومان نسبت به دایرکتوری جاری سنجیده میشوند، نه نسبت به مکان قرارگیری فایل آرگومان. نویسههای عام یا جانشین (*) در این فهرستها مجاز نیستند (مانند تعیین *.java). استفاده از علامت اتساین (@) برای تفسیر بازگشتی فایلها پشتیبانی نمیشود. گزینههای -J پشتیبانی نمیشوند زیرا به اجراکننده (launcher) ارسال میشوند که از فایلهای آرگومان پشتیبانی نمیکند.
هنگام اجرای دستور javac، مسیر و نام هر فایل آرگومان را با پیشوند علامت اتساین (@) مشخص کنید. هنگامی که دستور javac با آرگومانی مواجه میشود که با علامت اتساین (@) آغاز شده است، محتویات آن فایل را به درون فهرست آرگومانها بسط میدهد.
مثال ۱: تکفایل آرگومان (Example 1 Single Argument File)
میتوانید از یک فایل آرگومان تکی به نام argfile برای نگهداری تمام آرگومانهای javac استفاده کنید:
javac @argfile
این فایل آرگومان میتواند حاوی محتویات هر دو فایلی باشد که در مثال ۲ نشان داده شده است.
مثال ۲: دو فایل آرگومان (Example 2 Two Argument Files)
میتوانید دو فایل آرگومان بسازید: یکی برای گزینههای javac و دیگری برای نامهای فایلهای سورس. توجه داشته باشید که فهرستهای زیر نویسهٔ ادامهخط ندارند.
فایلی به نام options بسازید که حاوی موارد زیر باشد:
-d classes
-g
-sourcepath /java/pubs/ws/1.3/src/share/classes
فایلی به نام classes بسازید که حاوی موارد زیر باشد:
MyClass1.java
MyClass2.java
MyClass3.java
سپس، دستور javac را به صورت زیر اجرا کنید:
javac @options @classes
مثال ۳: فایلهای آرگومان دارای مسیر (Example 3 Argument Files with Paths)
فایلهای آرگومان میتوانند دارای مسیر باشند، اما هر نام فایلی درون این فایلها نسبت به دایرکتوری کاری جاری سنجیده میشود (نه نسبت به path1 یا path2):
javac @path1/options @path2/classes
دستور javac پشتیبانی مستقیمی از پردازش حاشیهنویسیها فراهم میکند و جایگزین نیاز به دستور جداگانه پردازش حاشیهنویسی، یعنی apt، میشود.
رابط برنامهنویسی (API) برای پردازندههای حاشیهنویسی در بستهها و زیربستههای javax.annotation.processing و javax.lang.model تعریف شده است.
نحوه کارکرد پردازش حاشیهنویسیها (HOW ANNOTATION PROCESSING WORKS)
مگر در حالتی که پردازش حاشیهنویسی با گزینه -proc:none غیرفعال شده باشد، کامپایلر برای یافتن پردازندههای حاشیهنویسی موجود جستجو میکند. مسیر جستجو را میتوان با گزینه -processorpath مشخص کرد. اگر مسیری تعیین نشده باشد، از مسیر کلاس کاربر (user class path) استفاده میشود. پردازندهها از طریق فایلهای پیکربندی ارائهدهنده سرویس به نام META-INF/services/javax.annotation.processing.Processor در مسیر جستجو تعیین موقعیت میشوند. چنین فایلهایی باید حاوی نامهای پردازندههای حاشیهنویسی مورد استفاده باشند که در هر خط یک مورد درج شده است. روش دیگر این است که پردازندهها به صورت صریح با استفاده از گزینه -processor مشخص شوند.
پس از بررسی فایلهای مبدأ و کلاسهای خط فرمان جهت تعیین اینکه چه حاشیهنویسیهایی وجود دارند، کامپایلر از پردازندهها پرسوجو میکند تا مشخص شود چه حاشیهنویسیهایی را پردازش میکنند. هنگام یافتن تطابق، پردازنده فراخوانی میشود. یک پردازنده میتواند حاشیهنویسیهایی را که پردازش میکند به خود اختصاص دهد؛ در این صورت، هیچ تلاش دیگری برای یافتن پردازندهای برای آن حاشیهنویسیها انجام نمیشود. پس از اینکه همه حاشیهنویسیها اختصاص داده شدند، کامپایلر به دنبال پردازندههای اضافی نمیگردد.
اگر پردازندهای فایلهای مبدأ جدیدی تولید کند، دور دیگری از پردازش حاشیهنویسی انجام میشود: هر فایل مبدأ تازهتولیدشده بررسی میشود و حاشیهنویسیها مانند قبل پردازش میگردند. هر پردازندهای که در دورهای پیشین فراخوانی شده بود، در تمامی دورهای بعدی نیز فراخوانی میشود. این روند تا زمانی ادامه مییابد که هیچ فایل مبدأ جدیدی تولید نشود.
پس از وقوع دوری که در آن هیچ فایل مبدأ جدیدی تولید نشده است، پردازندههای حاشیهنویسی برای آخرین بار فراخوانی میشوند تا فرصت تکمیل کارهای باقیمانده را داشته باشند. در نهایت، مگر اینکه از گزینه -proc:only استفاده شده باشد، کامپایلر فایلهای مبدأ اصلی و تمام فایلهای مبدأ تولیدشده را کامپایل میکند.
فایلهای مبدأ بارگذاریشده به صورت ضمنی (IMPLICITLY LOADED SOURCE FILES)
برای کامپایل مجموعهای از فایلهای مبدأ، ممکن است کامپایلر نیاز داشته باشد که فایلهای مبدأ اضافی را به صورت ضمنی بارگذاری کند. به بخش «جستجو برای نوعها» مراجعه کنید. چنین فایلهایی در حال حاضر مشمول پردازش حاشیهنویسی نمیشوند. به طور پیشفرض، اگر پردازش حاشیهنویسی رخ داده باشد و هر فایل مبدأ بارگذاریشده به صورت ضمنی کامپایل شود، کامپایلر هشدار میدهد. گزینه -implicit راهکاری برای نادیده گرفتن و جلوگیری از نمایش این هشدار فراهم میکند.
جستجو برای نوعها (SEARCHING FOR TYPES)
برای کامپایل یک فایل مبدأ، کامپایلر اغلب به اطلاعاتی درباره یک نوع (type) نیاز دارد، اما تعریف آن نوع در فایلهای مبدأ مشخصشده در خط فرمان وجود ندارد. کامپایلر به اطلاعات نوع برای هر کلاس یا واسطی (interface) که در فایل مبدأ استفاده، ارثبری یا پیادهسازی شده باشد نیاز دارد. این شامل کلاسها و واسطهایی نیز میشود که صراحتاً در فایل مبدأ ذکر نشدهاند اما اطلاعات را از طریق توارث ارائه میدهند.
برای مثال، هنگامی که زیرکلاسی از java.applet.Applet ایجاد میکنید، شما همچنین از کلاسهای اجدادی Applet استفاده میکنید: java.awt.Panel، java.awt.Container، java.awt.Component و java.lang.Object.
هنگامی که کامپایلر به اطلاعات نوع نیاز دارد، به دنبال فایل مبدأ یا فایل کلاسی میگردد که نوع را تعریف کرده است. کامپایلر برای فایلهای کلاس ابتدا در کلاسهای راهاندازی (bootstrap) و کلاسهای الحاقی (extension)، و سپس در مسیر کلاس کاربر (که به طور پیشفرض دایرکتوری جاری است) جستجو میکند. مسیر کلاس کاربر با تنظیم متغیر محیطی CLASSPATH یا با استفاده از گزینه -classpath تعریف میشود.
اگر گزینه -sourcepath را تنظیم کنید، کامپایلر مسیر مشخصشده را برای یافتن فایلهای مبدأ جستجو میکند. در غیر این صورت، کامپایلر مسیر کلاس کاربر را هم برای فایلهای کلاس و هم برای فایلهای مبدأ بررسی میکند.
میتوانید کلاسهای راهاندازی یا الحاقی متفاوتی را با گزینههای -bootclasspath و -extdirs تعیین کنید. به «گزینههای همگردانی متقابل (Cross-Compilation Options)» مراجعه کنید.
یک جستجوی موفق نوع ممکن است به یک فایل کلاس، یک فایل مبدأ، یا هر دو منجر شود. اگر هر دو پیدا شوند، میتوانید از گزینه -Xprefer استفاده کنید تا به کامپایلر دستور دهید از کدامیک استفاده کند. اگر newer مشخص شده باشد، کامپایلر از فایلی که جدیدتر است استفاده میکند. اگر source مشخص شده باشد، کامپایلر فایل مبدأ را به کار میبرد. حالت پیشفرض newer است.
اگر جستجوی نوع، فایلی مبدأ را برای یک نوع مورد نیاز پیدا کند (چه بهتنهایی و چه در نتیجه تنظیمات گزینه -Xprefer)، کامپایلر فایل مبدأ را برای دریافت اطلاعات مورد نیازش میخواند. به طور پیشفرض، کامپایلر فایل مبدأ را نیز کامپایل میکند. میتوانید از گزینه -implicit برای مشخص کردن این رفتار استفاده کنید. اگر none تعیین شود، هیچ فایل کلاسی برای آن فایل مبدأ تولید نمیشود. اگر class تعیین شود، فایلهای کلاس برای آن فایل مبدأ تولید خواهند شد.
ممکن است کامپایلر تا پیش از اتمام پردازش حاشیهنویسی، متوجه نیاز به برخی از اطلاعات نوع نشود. هنگامی که اطلاعات نوع در یک فایل مبدأ یافت شود و گزینه -implicit مشخص نشده باشد، کامپایلر هشدار میدهد که این فایل بدون قرار گرفتن تحت پردازش حاشیهنویسی در حال کامپایل شدن است. برای غیرفعال کردن این هشدار، یا فایل را در خط فرمان مشخص کنید (تا مشمول پردازش حاشیهنویسی شود) یا از گزینه -implicit برای مشخص کردن این استفاده کنید که آیا فایلهای کلاس برای چنین فایلهای مبدأیی باید تولید شوند یا خیر.
رابط برنامهنویسی (PROGRAMMATIC INTERFACE)
دستور javac از رابط برنامهنویسی جدید کامپایلر جاوا (Java Compiler API) که توسط کلاسها و واسطهای بسته javax.tools تعریف شده است، پشتیبانی میکند.
مثال (EXAMPLE)
برای کامپایل به گونهای که گویی آرگومانهای خط فرمان ارائه میشوند، از نحو زیر استفاده کنید:
JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
این مثال خروجیهای تشخیصی را در جریان خروجی استاندارد مینویسد و کد خروجیای را بازمیگرداند که javac در صورت فراخوانی از خط فرمان ارائه میداد.
میتوانید از متدهای دیگر در واسط javax.tools.JavaCompiler برای مدیریت پیامهای تشخیصی، کنترل محل خواندن و نوشتن فایلها و موارد دیگر استفاده کنید.
رابط قدیمی (OLD INTERFACE)
نکته: این API صرفاً برای سازگاری با گذشته حفظ شده است. تمام کدهای جدید باید از رابط برنامهنویسی جدید کامپایلر جاوا (Java Compiler API) استفاده کنند.
کلاس com.sun.tools.javac.Main دو متد ایستا برای فراخوانی کامپایلر از درون یک برنامه ارائه میدهد:
public static int compile(String[] args);
public static int compile(String[] args, PrintWriter out);
پارامتر args بیانگر هر یک از آرگومانهای خط فرمان است که معمولاً به کامپایلر ارسال میشوند.
پارامتر out مشخص میکند که خروجی تشخیصی کامپایلر به کجا هدایت شود.
مقدار بازگشتی (return) معادل مقدار خروج (exit) از javac است.
نکته: تمام کلاسها و متدهای دیگر که در بستهای با نامهای آغازشونده با com.sun.tools.javac (زیربستههای com.sun.tools.javac) یافت میشوند کاملاً داخلی هستند و در هر زمان ممکن است تغییر کنند.
مثالها (EXAMPLES)
مثال ۱: کامپایل یک برنامه ساده
این مثال نحوه کامپایل فایل مبدأ Hello.java در دایرکتوری greetings را نشان میدهد. کلاس تعریفشده در Hello.java به نام greetings.Hello نامگذاری شده است. دایرکتوری greetings هم برای فایل مبدأ و هم برای فایل کلاس، دایرکتوری بسته به شمار میرود و زیر دایرکتوری جاری قرار دارد. این امر استفاده از مسیر پیشفرض کلاس کاربر را ممکن میسازد. همچنین تعیین دایرکتوری مقصد جداگانه با گزینه -d را غیرضروری میکند.
کد منبع در Hello.java:
package greetings;
public class Hello {
public static void main(String[] args) {
for (int i=0; i < args.length; i++) {
System.out.println("Hello " + args[i]);
}
}
}
کامپایل greetings.Hello:
javac greetings/Hello.java
اجرای greetings.Hello:
java greetings.Hello World Universe Everyone
Hello World
Hello Universe
Hello Everyone
مثال ۲: کامپایل چندین فایل مبدأ
این مثال فایلهای مبدأ Aloha.java، GutenTag.java، Hello.java و Hi.java را در بسته greetings کامپایل میکند.
% javac greetings/*.java
% ls greetings
Aloha.class GutenTag.class Hello.class Hi.class
Aloha.java GutenTag.java Hello.java Hi.java
مثال ۳: مشخص کردن مسیر کلاس کاربر
پس از تغییر دادن یکی از فایلهای مبدأ در مثال قبلی، آن را مجدداً کامپایل کنید:
pwd
/examples
javac greetings/Hi.java
از آنجا که greetings.Hi به کلاسهای دیگر در بسته greetings ارجاع میدهد، کامپایلر نیاز دارد تا این کلاسهای دیگر را پیدا کند. مثال قبلی کار میکند زیرا مسیر پیشفرض کلاس کاربر همان دایرکتوریای است که شامل دایرکتوری بسته میباشد. اگر میخواهید این فایل را بدون نگرانی درباره اینکه در کدام دایرکتوری قرار دارید دوباره کامپایل کنید، دایرکتوری examples را با تنظیم CLASSPATH به مسیر کلاس کاربر اضافه نمایید. این مثال از گزینه -classpath استفاده میکند.
javac -classpath /examples /examples/greetings/Hi.java
اگر greetings.Hi را
تغییر دهید
تا از یک
ابزار
اعلان (banner utility)
استفاده
کند، آنگاه
آن ابزار
نیز باید از
طریق مسیر
کلاس کاربر
قابل
دسترسی
باشد. javac -classpath
/examples:/lib/Banners.jar \
/examples/greetings/Hi.java
برای اجرای یک کلاس در بستهٔ greetings، برنامه نیاز به دسترسی به بستهٔ greetings و کلاسهایی دارد که کلاسهای greetings از آنها استفاده میکنند.
java -classpath /examples:/lib/Banners.jar greetings.Hi
مثال ۴ تفکیک فایلهای منبع و فایلهای کلاس
مثال زیر از javac برای کامپایل کدی استفاده میکند که روی JVM 1.7 اجرا میشود.
javac -source 1.7 -target 1.7 -bootclasspath jdk1.7.0/lib/rt.jar \
-extdirs "" OldCode.java
گزینهٔ -source 1.7 مشخص میکند که برای کامپایل OldCode.java از نگارش 1.7 (یا 7) زبان برنامهنویسی جاوا استفاده شود. گزینهٔ -target 1.7 تضمین میکند که فایلهای کلاس تولیدشده با JVM 1.7 سازگار هستند. توجه داشته باشید که در بیشتر موارد، مقدار گزینهٔ -target همان مقدار گزینهٔ -source است؛ در این مثال، میتوانید گزینهٔ -target را حذف کنید.
باید گزینهٔ -bootclasspath را جهت مشخص کردن نسخهٔ صحیح کلاسهای راهانداز (کتابخانهٔ rt.jar) تعیین کنید. در غیر این صورت، کامپایلر یک هشدار تولید میکند:
javac -source 1.7 OldCode.java
warning: [options] bootstrap class path not set in conjunction with
-source 1.7
اگر نسخهٔ صحیح کلاسهای راهانداز را مشخص نکنید، کامپایلر قواعد زبان قدیمیتر را (در این مثال، نسخهٔ 1.7 زبان برنامهنویسی جاوا) در ترکیب با کلاسهای راهانداز جدید استفاده میکند که میتواند منجر به تولید فایلهای کلاسی شود که روی پلتفرم قدیمیتر (در این مورد، Java SE 7) کار نمیکنند، زیرا ممکن است ارجاع به متدهای ناموجود در آنها گنجانده شود.
مثال ۵ کامپایل متقاطع
این مثال از javac برای کامپایل کدی استفاده میکند که روی JVM 1.7 اجرا میشود.
javac -source 1.7 -target 1.7 -bootclasspath jdk1.7.0/lib/rt.jar \
-extdirs "" OldCode.java
گزینهٔ -source 1.7 مشخص میکند که برای کامپایل OldCode.java از نگارش 1.7 (یا 7) زبان برنامهنویسی جاوا استفاده شود. گزینهٔ -target 1.7 تضمین میکند که فایلهای کلاس تولیدشده با JVM 1.7 سازگار هستند.
باید گزینهٔ -bootclasspath را جهت مشخص کردن نسخهٔ صحیح کلاسهای راهانداز (کتابخانهٔ rt.jar) تعیین کنید. در غیر این صورت، کامپایلر یک هشدار تولید میکند:
javac -source 1.7 OldCode.java
warning: [options] bootstrap class path not set in conjunction with -source 1.7
اگر نسخهٔ صحیح کلاسهای راهانداز را مشخص نکنید، کامپایلر قواعد زبان قدیمی را در ترکیب با کلاسهای راهانداز جدید استفاده میکند. این ترکیب میتواند منجر به تولید فایلهای کلاسی شود که روی پلتفرم قدیمیتر (در این مورد، Java SE 7) کار نمیکنند، زیرا ممکن است ارجاع به متدهای ناموجود در آنها گنجانده شود. در این مثال، کامپایلر از نگارش 1.7 زبان برنامهنویسی جاوا استفاده میکند..SH "همچنین ببینید (SEE ALSO)"
- •
- java(1)
- •
- jdb(1)
- •
- javah(1)
- •
- javadoc(1)
- •
- jar(1)
- •
- jdb(1)
| 03 March 2015 | JDK 8 |