'\" t .\" Copyright (c) 1994, 2015, Oracle and/or its affiliates. All rights reserved. .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. .\" .\" This code is free software; you can redistribute it and/or modify it .\" under the terms of the GNU General Public License version 2 only, as .\" published by the Free Software Foundation. .\" .\" This code is distributed in the hope that it will be useful, but WITHOUT .\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or .\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License .\" version 2 for more details (a copy is included in the LICENSE file that .\" accompanied this code). .\" .\" You should have received a copy of the GNU General Public License version .\" 2 along with this work; if not, write to the Free Software Foundation, .\" Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. .\" .\" Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA .\" or visit www.oracle.com if you need additional information or have any .\" questions. .\" .\" Arch: generic .\" Software: JDK 8 .\" Date: 03 March 2015 .\" SectDesc: Basic Tools .\" Title: javac.1 .\" .if n .pl 99999 .TH javac 1 "03 March 2015" "JDK 8" "Basic Tools" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "نام (NAME)" javac \- تعاریف کلاس و واسط جاوا را می‌خواند و آن‌ها را به بایت‌کد و فایل‌های کلاس کامپایل می‌کند\&. .SH "خلاصه دستور (SYNOPSIS)" .sp .nf \fBjavac\fR [ \fIoptions\fR ] [ \fIsourcefiles\fR ] [ \fIclasses\fR] [ \fI@argfiles\fR ] .fi .sp آرگومان‌ها می‌توانند به هر ترتیبی باشند: .TP \fIoptions\fR گزینه‌های خط فرمان\&. بخش «گزینه‌ها» را ببینید\&. .TP \fIsourcefiles\fR یک یا چند فایل مبدأ برای کامپایل شدن (مانند \f3MyClass\&.java\fR)\&. .TP \fIclasses\fR یک یا چند کلاس برای پردازش حاشیه‌نویسی‌ها (مانند \f3MyPackage\&.MyClass\fR)\&. .TP \fI@argfiles\fR یک یا چند فایل که گزینه‌ها و فایل‌های مبدأ را فهرست می‌کنند\&. گزینه‌های \f3-J\fR در این فایل‌ها مجاز نیستند\&. بخش «فایل‌های آرگومان خط فرمان» را ببینید\&. .SH "توضیحات (DESCRIPTION)" دستور \f3javac\fR تعاریف کلاس و واسط نوشته‌شده به زبان برنامه‌نویسی جاوا را می‌خواند و آن‌ها را به فایل‌های کلاس بایت‌کد کامپایل می‌کند\&. همچنین دستور \f3javac\fR می‌تواند حاشیه‌نویسی‌ها را در فایل‌ها و کلاس‌های مبدأ جاوا پردازش کند\&. .PP دو روش برای ارسال نام فایل‌های کد مبدأ به \f3javac\fR وجود دارد\&. .TP 0.2i \(bu برای تعداد کمی از فایل‌های مبدأ، نام فایل‌ها را در خط فرمان فهرست کنید\&. .TP 0.2i \(bu برای تعداد زیادی از فایل‌های مبدأ، نام فایل‌ها را در فایلی فهرست کنید که با فاصله‌ها یا شکست‌های خط از هم جدا شده‌اند\&. از نام فایل فهرست به همراه یک علامت at (@) در ابتدای آن با دستور \f3javac\fR استفاده کنید\&. .PP نام فایل‌های کد مبدأ باید دارای پسوند \&.java، نام فایل‌های کلاس باید دارای پسوند \&.class و هر دو فایل‌های مبدأ و کلاس باید نام ریشه‌ای داشته باشند که کلاس را مشخص می‌کند\&. برای مثال، کلاسی به نام \f3MyClass\fR در یک فایل مبدأ به نام \f3MyClass\&.java\fR نوشته شده و به یک فایل کلاس بایت‌کد به نام \f3MyClass\&.class\fR کامپایل می‌شود\&. .PP تعاریف کلاس‌های درونی فایل‌های کلاس اضافی تولید می‌کنند\&. این فایل‌های کلاس دارای نام‌هایی هستند که نام‌های کلاس‌های درونی و بیرونی را ترکیب می‌کند، مانند \f3MyClass$MyInnerClass\&.class\fR\&. .PP فایل‌های مبدأ را در ساختار درختی دایرکتوری‌ای مرتب کنید که منعکس‌کنندهٔ درخت بستهٔ (package) آن‌ها باشد\&. برای مثال، اگر تمام فایل‌های مبدأ شما در \f3/workspace\fR هستند، کد مبدأ \f3com\&.mysoft\&.mypack\&.MyClass\fR را در \f3/workspace/com/mysoft/mypack/MyClass\&.java\fR قرار دهید\&. .PP به‌طور پیش‌فرض، کامپایلر هر فایل کلاس را در همان دایرکتوری فایل مبدأ آن قرار می‌دهد\&. شما می‌توانید با استفاده از گزینهٔ \f3-d\fR یک دایرکتوری مقصد مجزا مشخص کنید\&..SH "گزینه‌ها (OPTIONS)" کامپایلر مجموعه‌ای از گزینه‌های استاندارد دارد که در محیط توسعه کنونی پشتیبانی می‌شوند\&. مجموعه دیگری از گزینه‌های غیراستاندارد وجود دارند که مختص پیاده‌سازی‌های کنونی ماشین مجازی و کامپایلر هستند و ممکن است در آینده تغییر کنند\&. گزینه‌های غیراستاندارد با گزینه \f3-X\fR آغاز می‌شوند\&. .TP 0.2i \(bu همچنین «گزینه‌های کامپایل متقاطع» (Cross-Compilation Options) را ببینید .TP 0.2i \(bu همچنین «گزینه‌های غیراستاندارد» (Nonstandard Options) را ببینید .SS "گزینه‌های استاندارد (STANDARD OPTIONS)" .TP -A\fIkey\fR[\fI=value\fR] .br گزینه‌هایی را برای ارسال به پردازنده‌های حاشیه‌نویسی مشخص می‌کند\&. این گزینه‌ها مستقیماً توسط \f3javac\fR تفسیر نمی‌شوند، بلکه برای استفاده در دسترس تک‌تک پردازنده‌ها قرار می‌گیرند\&. مقدار \f3key\fR باید یک یا چند شناسه باشد که با نقطه (\&.) از هم جدا شده‌اند\&. .TP -cp \fIpath\fR یا -classpath \fIpath\fR .br محل یافتن فایل‌های کلاس کاربر و (به صورت اختیاری) پردازنده‌های حاشیه‌نویسی و فایل‌های منبع را مشخص می‌کند\&. این مسیر کلاس، مسیر کلاس کاربر در متغیر محیطی \f3CLASSPATH\fR را لغو (override) می‌کند\&. اگر هیچ‌یک از \f3CLASSPATH\fR، \f3-cp\fR یا \f3-classpath\fR مشخص نشده باشد، \fIclass path\fR کاربر همان دایرکتوری فعلی خواهد بود\&. بخش Setting the Class Path را ببینید\&. اگر گزینه \f3-sourcepath\fR مشخص نشده باشد، مسیر کلاس کاربر برای یافتن فایل‌های منبع نیز جستجو می‌شود\&. اگر گزینه \f3-processorpath\fR مشخص نشده باشد، مسیر کلاس برای یافتن پردازنده‌های حاشیه‌نویسی نیز جستجو می‌شود\&. .TP -Djava\&.ext\&.dirs=\fIdirectories\fR .br محل افزونه‌های نصب‌شده را جایگزین می‌کند\&. .TP -Djava\&.endorsed\&.dirs=\fIdirectories\fR .br محل مسیر استانداردهای تأییدشده را جایگزین می‌کند\&. .TP -d \fIdirectory\fR .br دایرکتوری مقصد را برای فایل‌های کلاس تعیین می‌کند\&. این دایرکتوری باید از قبل وجود داشته باشد زیرا \f3javac\fR آن را ایجاد نمی‌کند\&. اگر کلاسی بخشی از یک بسته باشد، \f3javac\fR فایل کلاس را در زیردایرکتوری‌ای قرار می‌دهد که بازتاب‌دهنده نام بسته است و دایرکتوری‌ها را بر اساس نیاز ایجاد می‌کند\&. اگر \f3-d\fR \f3/home/myclasses\fR را مشخص کنید و نام کلاس \f3com\&.mypackage\&.MyClass\fR باشد، فایل کلاس در مسیر \f3/home/myclasses/com/mypackage/MyClass\&.class\fR قرار می‌گیرد\&. اگر گزینه \fI-d\fR مشخص نشده باشد، \f3javac\fR هر فایل کلاس را در همان دایرکتوری فایل منبعی که از آن تولید شده است، قرار می‌دهد\&. \fIنکته:\fR دایرکتوری مشخص‌شده توسط گزینه \fI-d\fR به طور خودکار به مسیر کلاس کاربر شما افزوده نمی‌شود\&. .TP -deprecation .br توضیحاتی درباره هر مورد استفاده یا بازنویسی (override) از یک عضو یا کلاس منسوخ‌شده (deprecated) را نشان می‌دهد\&. بدون گزینه \f3-deprecation\fR، کامپایلر \f3javac\fR خلاصه‌ای از فایل‌های منبعی را نمایش می‌دهد که از اعضا یا کلاس‌های منسوخ‌شده استفاده یا آن‌ها را بازنویسی می‌کنند\&. گزینه \f3-deprecation\fR شکل کوتاه‌شده \f3-Xlint:deprecation\fR است\&. .TP -encoding \fIencoding\fR .br نام کدگذاری فایل منبع را تعیین می‌کند، مانند EUC-JP و UTF-8\&. اگر گزینه \f3-encoding\fR مشخص نشده باشد، از مبدل پیش‌فرض پلتفرم استفاده می‌شود\&. .TP -endorseddirs \fIdirectories\fR .br محل مسیر استانداردهای تأییدشده را جایگزین می‌کند\&. .TP -extdirs \fIdirectories\fR .br محل دایرکتوری \f3ext\fR را جایگزین می‌کند\&. متغیر directories فهرستی از دایرکتوری‌ها است که با دو‌نقطه (:) از هم جدا شده‌اند\&. هر فایل JAR در دایرکتوری‌های مشخص‌شده برای یافتن فایل‌های کلاس جستجو می‌شود\&. تمام فایل‌های JAR یافت‌شده بخشی از مسیر کلاس خواهند شد\&. اگر در حال کامپایل متقاطع هستید (کامپایل کلاس‌ها بر اساس کلاس‌های bootstrap و افزونه‌های یک پیاده‌سازی متفاوت از پلتفرم Java)، این گزینه دایرکتوری‌های حاوی کلاس‌های افزونه را مشخص می‌کند\&. برای اطلاعات بیشتر بخش Cross-Compilation Options را ببینید\&. .TP -g .br تمام اطلاعات اشکال‌زدایی، از جمله متغیرهای محلی را تولید می‌کند\&. به طور پیش‌فرض، تنها اطلاعات شماره خط و فایل منبع تولید می‌شود\&. .TP -g:none .br هیچ‌گونه اطلاعات اشکال‌زدایی تولید نمی‌کند\&. .TP -g:[\fIkeyword list\fR] .br تنها انواع خاصی از اطلاعات اشکال‌زدایی را که با فهرستی از کلیدواژه‌های جدا شده با ویرگول مشخص شده‌اند، تولید می‌کند\&. کلیدواژه‌های معتبر عبارتند از: .RS .TP source اطلاعات اشکال‌زدایی فایل منبع\&. .TP lines اطلاعات اشکال‌زدایی شماره خطوط\&. .TP vars اطلاعات اشکال‌زدایی متغیرهای محلی\&. .RE .TP -help .br خلاصه‌ای از گزینه‌های استاندارد را چاپ می‌کند\&. .TP -implicit:[\fIclass, none\fR] .br تولید فایل‌های کلاس را برای فایل‌های منبعی که به طور ضمنی بارگذاری شده‌اند، کنترل می‌کند\&. برای تولید خودکار فایل‌های کلاس، از \f3-implicit:class\fR استفاده کنید\&. برای جلوگیری از تولید فایل کلاس، از \f3-implicit:none\fR استفاده کنید\&. اگر این گزینه مشخص نشده باشد، حالت پیش‌فرض تولید خودکار فایل‌های کلاس است\&. در این حالت، اگر هنگام انجام پردازش حاشیه‌نویسی هر یک از چنین فایل‌های کلاسی تولید شوند، کامپایلر هشداری صادر می‌کند\&. زمانی که گزینه \f3-implicit\fR به طور صریح تنظیم شده باشد، این هشدار صادر نمی‌شود\&. بخش Searching for Types را ببینید\&. .TP -J\fIoption\fR .br گزینه \f3option\fR را به ماشین مجازی جاوا (JVM) ارسال می‌کند؛ که در آن option یکی از گزینه‌های شرح داده‌شده در صفحه ارجاع اجراکننده جاوا است\&. برای نمونه، \f3-J-Xms48m\fR حافظه راه‌اندازی را روی ۴۸ مگابایت تنظیم می‌کند\&. راهنمای java(1) را ببینید\&. \fIنکته:\fR گزینه‌های \fICLASSPATH\fR، \f3-classpath\fR، \f3-bootclasspath\fR و \f3-extdirs\fR کلاس‌های استفاده‌شده برای اجرای \f3javac\fR را مشخص نمی‌کنند\&. تلاش برای سفارشی‌سازی پیاده‌سازی کامپایلر با استفاده از این گزینه‌ها و متغیرها خطرناک است و اغلب به هدف مورد نظر شما منتهی نمی‌شود\&. اگر لازم است پیاده‌سازی کامپایلر را سفارشی‌سازی کنید، از گزینه \f3-J\fR برای ارسال گزینه‌ها به اجراکننده زیرین Java استفاده کنید\&. .TP -nowarn .br پیام‌های هشدار را غیرفعال می‌کند\&. این گزینه عملکردی مشابه با گزینه \f3-Xlint:none\fR دارد\&. .TP -parameters .br نام‌های رسمی پارامترهای سازنده‌ها و متدها را در فایل کلاس تولیدشده ذخیره می‌کند تا متد \f3java\&.lang\&.reflect\&.Executable\&.getParameters\fR از Reflection API بتواند آن‌ها را بازیابی کند\&. .TP -proc: [\fInone\fR, \fIonly\fR] .br انجام پردازش حاشیه‌نویسی و کامپایل را کنترل می‌کند\&. مقدار \f3-proc:none\fR به این معنی است که کامپایل بدون پردازش حاشیه‌نویسی انجام می‌شود\&. مقدار \f3-proc:only\fR به این معنی است که فقط پردازش حاشیه‌نویسی انجام می‌شود، بدون اینکه کامپایل بعدی صورت گیرد\&. .TP -processor \fIclass1\fR [,\fIclass2\fR,\fIclass3\fR\&.\&.\&.] .br نام‌های پردازنده‌های حاشیه‌نویسی برای اجرا را مشخص می‌کند\&. این گزینه فرآیند پیش‌فرض شناسایی خودکار را دور می‌زند\&. .TP -processorpath \fIpath\fR .br محل یافتن پردازنده‌های حاشیه‌نویسی را مشخص می‌کند\&. اگر از این گزینه استفاده نشود، مسیر کلاس برای یافتن پردازنده‌ها جستجو می‌شود\&. .TP -s \fIdir\fR .br دایرکتوری محل قرارگیری فایل‌های منبع تولیدشده را مشخص می‌کند\&. این دایرکتوری باید از قبل وجود داشته باشد زیرا \f3javac\fR آن را ایجاد نمی‌کند\&. اگر کلاسی بخشی از یک بسته باشد، کامپایلر فایل منبع را در زیردایرکتوری‌ای قرار می‌دهد که بازتاب‌دهنده نام بسته است و دایرکتوری‌ها را بر اساس نیاز ایجاد می‌کند\&. اگر \f3-s /home/mysrc\fR را مشخص کنید و نام کلاس \f3com\&.mypackage\&.MyClass\fR باشد، فایل منبع در \f3/home/mysrc/com/mypackage/MyClass\&.java\fR قرار می‌گیرد\&. .TP -source \fIrelease\fR .br نسخه کد منبع پذیرفته‌شده را مشخص می‌کند\&. مقادیر زیر برای \f3release\fR مجاز هستند: .RS .TP 1\&.3 کامپایلر از assertionها، genericها یا سایر قابلیت‌های زبانی معرفی‌شده پس از Java SE 1\&.3 پشتیبانی نمی‌کند\&. .TP 1\&.4 کامپایلر کدهای حاوی assertion را که در Java SE 1\&.4 معرفی شده‌اند، می‌پذیرد\&. .TP 1\&.5 کامپایلر کدهای حاوی genericها و سایر قابلیت‌های زبانی معرفی‌شده در Java SE 5 را می‌پذیرد\&. .TP 5 مترادف با 1\&.5\&. .TP 1\&.6 هیچ تغییری در زبان در Java SE 6 معرفی نشد\&. با این حال، خطاهای کدگذاری در فایل‌های منبع اکنون بر خلاف نسخه‌های پیشین Java Platform, Standard Edition، به عنوان خطا و نه هشدار گزارش می‌شوند\&. .TP 6 مترادف با 1\&.6\&. .TP 1\&.7 کامپایلر کدهای دارای قابلیت‌های معرفی‌شده در Java SE 7 را می‌پذیرد\&. .TP 7 مترادف با 1\&.7\&. .TP 1\&.8 این مقدار پیش‌فرض است\&. کامپایلر کدهای دارای قابلیت‌های معرفی‌شده در Java SE 8 را می‌پذیرد\&. .TP 8 مترادف با 1\&.8\&. .RE .TP -sourcepath \fIsourcepath\fR .br مسیر کد منبع را برای جستجوی تعاریف کلاس یا رابط (interface) مشخص می‌کند\&. همانند مسیر کلاس کاربر، ورودی‌های مسیر منبع در Oracle Solaris با دونقطه (:) و در Windows با نقطه‌ویرگول (;) از هم جدا می‌شوند و می‌توانند دایرکتوری‌ها، آرشیوهای JAR یا آرشیوهای ZIP باشند\&. اگر از بسته‌ها استفاده شود، نام مسیر محلی در دایرکتوری یا آرشیو باید بازتاب‌دهنده نام بسته باشد\&. \fIنکته:\fR کلاس‌های یافت‌شده از طریق مسیر کلاس ممکن است در صورتی که فایل‌های منبع آن‌ها نیز یافت شوند، مجدداً کامپایل شوند\&. بخش Searching for Types را ببینید\&. .TP -verbose .br خروجی پرگو ارائه می‌دهد که شامل اطلاعاتی درباره هر کلاس بارگذاری‌شده و هر فایل منبع کامپایل‌شده است\&. .TP -version .br اطلاعات نگارش را چاپ می‌کند\&. .TP -werror .br در صورت بروز هشدارها، فرآیند کامپایل را متوقف می‌کند\&. .TP -X .br اطلاعات مربوط به گزینه‌های غیراستاندارد را نمایش داده و خارج می‌شود\&..SS "گزینه‌های کامپایل متقابل (CROSS-COMPILATION OPTIONS)" به‌طور پیش‌فرض، کلاس‌ها در برابر کلاس‌های راه‌انداز (bootstrap) و افزونهٔ (extension) پلتفرمی که \f3javac\fR به همراه آن ارائه شده است کامپایل می‌شوند\&. اما \f3javac\fR از کامپایل متقابل نیز پشتیبانی می‌کند، که در آن کلاس‌ها در برابر کلاس‌های راه‌انداز و افزونهٔ یک پیاده‌سازی دیگر از پلتفرم Java کامپایل می‌شوند\&. هنگام کامپایل متقابل، استفاده از گزینه‌های \f3-bootclasspath\fR و \f3-extdirs\fR حائز اهمیت است\&. .TP -target \fIversion\fR .br فایل‌های کلاسی تولید می‌کند که نسخهٔ مشخصی از ماشین مجازی را هدف قرار می‌دهند\&. فایل‌های کلاس روی هدف مشخص‌شده و انتشار‌های بعدی اجرا می‌شوند، اما روی نسخه‌های قبلی JVM اجرا نخواهند شد\&. هدف‌های معتبر عبارتند از 1\&.1، 1\&.2، 1\&.3، 1\&.4، 1\&.5 (همچنین 5)، 1\&.6 (همچنین 6)، 1\&.7 (همچنین 7) و 1\&.8 (همچنین 8)\&. مقدار پیش‌فرض گزینهٔ \f3-target\fR به مقدار گزینهٔ \f3-source\fR بستگی دارد: .RS .TP 0.2i \(bu اگر گزینهٔ \f3-source\fR مشخص نشده باشد، مقدار گزینهٔ \f3-target\fR برابر 1\&.8 خواهد بود .TP 0.2i \(bu اگر گزینهٔ \f3-source\fR برابر 1\&.2 باشد، مقدار گزینهٔ \f3-target\fR برابر 1\&.4 است .TP 0.2i \(bu اگر گزینهٔ \f3-source\fR برابر 1\&.3 باشد، مقدار گزینهٔ \f3-target\fR برابر 1\&.4 است .TP 0.2i \(bu اگر گزینهٔ \f3-source\fR برابر 1\&.5 باشد، مقدار گزینهٔ \f3-target\fR برابر 1\&.8 است .TP 0.2i \(bu اگر گزینهٔ \f3-source\fR برابر 1\&.6 باشد، مقدار گزینهٔ \f3-target\fR برابر 1\&.8 است .TP 0.2i \(bu اگر گزینهٔ \f3-source\fR برابر 1\&.7 باشد، مقدار گزینهٔ \f3-target\fR برابر 1\&.8 است .TP 0.2i \(bu برای تمام مقادیر دیگر گزینهٔ \f3-source\fR، مقدار گزینهٔ \f3-target\fR برابر با مقدار گزینهٔ \f3-source\fR خواهد بود\&. .RE .TP -bootclasspath \fIbootclasspath\fR .br کامپایل متقابل را در برابر مجموعه کلاس‌های راه‌انداز مشخص‌شده انجام می‌دهد\&. همانند مسیر کلاس کاربر، ورودی‌های مسیر کلاس راه‌انداز با دونقطه (:) از هم جدا می‌شوند و می‌توانند دایرکتوری‌ها، آرشیوهای JAR یا آرشیوهای ZIP باشند\&. .SS "گزینه پروفایل فشرده (COMPACT PROFILE OPTION)" از JDK 8 به بعد، کامپایلر \f3javac\fR از پروفایل‌های فشرده (compact profiles) پشتیبانی می‌کند\&. با پروفایل‌های فشرده، برنامه‌هایی که به تمام پلتفرم Java نیاز ندارند می‌توانند مستقر شده و با ردپای کوچک‌تری اجرا شوند\&. قابلیت پروفایل‌های فشرده می‌تواند برای کاهش زمان بارگیری برنامه‌ها از فروشگاه‌های برنامه استفاده شود\&. این ویژگی باعث استقرار فشرده‌تر برنامه‌های Java می‌شود که JRE را به همراه دارند\&. این ویژگی همچنین در دستگاه‌های کوچک مفید است\&. .PP مقادیر پروفایل پشتیبانی‌شده شامل \f3compact1\fR، \f3compact2\fR و \f3compact3\fR هستند\&. این لایه‌ها افزایشی هستند\&. هر پروفایل فشرده با شماره بالاتر، شامل تمامی APIهای موجود در پروفایل‌های با شماره کمتر است\&. .TP -profile .br هنگام استفاده از پروفایل‌های فشرده، این گزینه نام پروفایل را در حین کامپایل مشخص می‌کند\&. برای مثال: .sp .nf \f3javac \-profile compact1 Hello\&.java\fP .fi .nf \f3\fP .fi .sp دستور javac کد منبعی را که از هرگونه API پلتفرم Java SE که در پروفایل مشخص‌شده موجود نیست استفاده کند، کامپایل نمی‌کند\&. در اینجا نمونه‌ای از پیام خطایی آورده شده است که حاصل تلاش برای کامپایل چنین کد منبعی است: .sp .nf \f3cd jdk1\&.8\&.0/bin\fP .fi .nf \f3\&./javac \-profile compact1 Paint\&.java\fP .fi .nf \f3Paint\&.java:5: error: Applet is not available in profile \&'compact1\&'\fP .fi .nf \f3import java\&.applet\&.Applet;\fP .fi .nf \f3\fP .fi .sp در این مثال، می‌توانید با تغییر کد منبع به‌گونه‌ای که از کلاس \f3Applet\fR استفاده نکند، خطا را رفع کنید\&. همچنین می‌توانید خطا را با کامپایل بدون گزینهٔ -profile برطرف سازید\&. در این صورت، کامپایل در برابر مجموعهٔ کامل APIهای Java SE انجام خواهد شد\&. (هیچ‌یک از پروفایل‌های فشرده شامل کلاس \f3Applet\fR نیستند\&.) روش جایگزین برای کامپایل با پروفایل‌های فشرده، استفاده از گزینهٔ \f3-bootclasspath\fR برای مشخص کردن مسیر یک فایل \f3rt\&.jar\fR است که ایمیج یک پروفایل را تعیین می‌کند\&. در مقابل، استفاده از گزینهٔ \f3-profile\fR نیازی به وجود ایمیج پروفایل در سیستم در زمان کامپایل ندارد\&. این ویژگی هنگام کامپایل متقابل مفید است\&. .SS "گزینه‌های غیراستاندارد (NONSTANDARD OPTIONS)" .TP -Xbootclasspath/p:\fIpath\fR .br یک پسوند به مسیر کلاس راه‌انداز (bootstrap class path) اضافه می‌کند\&. .TP -Xbootclasspath/a:\fIpath\fR .br یک پیشوند به مسیر کلاس راه‌انداز اضافه می‌کند\&. .TP -Xbootclasspath/:\fIpath\fR .br مکان فایل‌های کلاس راه‌انداز را بازنویسی می‌کند\&. .TP -Xdoclint:[-]\fIgroup\fR [\fI/access\fR] .br گروه‌های خاصی از بررسی‌ها را فعال یا غیرفعال می‌کند، که در آن \fIgroup\fR یکی از مقادیر زیر است: \f3accessibility\fR، \f3syntax\fR، \f3reference\fR، \f3html\fR یا \f3missing\fR\&. برای اطلاعات بیشتر دربارهٔ این گروه‌های بررسی، به گزینهٔ \f3-Xdoclint\fR در دستور \f3javadoc\fR مراجعه کنید\&. گزینهٔ \f3-Xdoclint\fR به‌طور پیش‌فرض در دستور \f3javac\fR غیرفعال است\&. متغیر \fIaccess\fR حداقل سطح دید کلاس‌ها و اعضایی را که گزینهٔ \f3-Xdoclint\fR بررسی می‌کند مشخص می‌سازد\&. این متغیر می‌تواند یکی از مقادیر زیر را داشته باشد (به ترتیب از بیشترین به کمترین میزان دید): \f3public\fR، \f3protected\fR، \f3package\fR و \f3private\fR\&. برای مثال، گزینهٔ زیر کلاس‌ها و اعضایی را بررسی می‌کند (با تمامی گروه‌های بررسی) که دارای سطح دسترسی protected و بالاتر هستند (که شامل protected، package و public می‌شود): .sp .nf \f3\-Xdoclint:all/protected\fP .fi .nf \f3\fP .fi .sp گزینهٔ زیر تمامی گروه‌های بررسی را برای همه سطوح دسترسی فعال می‌کند، به‌جز اینکه خطاهای HTML را برای کلاس‌ها و اعضایی که سطح دسترسی package و بالاتر دارند (شامل package و public) بررسی نخواهد کرد: .sp .nf \f3\-Xdoclint:all,\-html/package\fP .fi .nf \f3\fP .fi .sp .TP -Xdoclint:none .br تمامی گروه‌های بررسی را غیرفعال می‌کند\&. .TP -Xdoclint:all[\fI/access\fR] .br تمامی گروه‌های بررسی را فعال می‌کند\&. .TP -Xlint .br \fI\fRتمامی هشدارهای توصیه‌شده را فعال می‌کند\&. در این انتشار، فعال‌سازی تمام هشدارهای موجود توصیه می‌شود\&. .TP -Xlint:all .br \fI\fRتمامی هشدارهای توصیه‌شده را فعال می‌کند\&. در این انتشار، فعال‌سازی تمام هشدارهای موجود توصیه می‌شود\&. .TP -Xlint:none .br تمامی هشدارها را غیرفعال می‌کند\&. .TP -Xlint:\fIname\fR .br هشدار name را غیرفعال می‌کند\&. برای مشاهده فهرستی از هشدارهایی که می‌توانید با این گزینه غیرفعال کنید، به بخش Enable or Disable Warnings with the -Xlint Option مراجعه کنید\&. .TP -Xlint:\fI-name\fR .br هشدار name را غیرفعال می‌کند\&. برای دریافت فهرستی از هشدارهایی که می‌توانید با این گزینه غیرفعال کنید، به بخش Enable or Disable Warnings with the -Xlint Option با گزینهٔ \f3-Xlint\fR مراجعه کنید\&. .TP -Xmaxerrs \fInumber\fR .br حداکثر تعداد خطاهایی را که باید چاپ شوند تعیین می‌کند\&. .TP -Xmaxwarns \fInumber\fR .br حداکثر تعداد هشدارهایی را که باید چاپ شوند تعیین می‌کند\&. .TP -Xstdout \fIfilename\fR .br پیام‌های کامپایلر را به فایل نام‌برده ارسال می‌کند\&. به‌طور پیش‌فرض، پیام‌های کامپایلر به \f3System\&.err\fR فرستاده می‌شوند\&. .TP -Xprefer:[\fInewer,source\fR] .br مشخص می‌کند هنگامی که هم فایل منبع و هم فایل کلاس برای یک نوع یافت می‌شوند، کدام فایل خوانده شود\&. (به Searching for Types مراجعه کنید)\&. اگر از گزینهٔ \f3-Xprefer:newer\fR استفاده شود، فایل جدیدتر میان منبع یا کلاس را برای نوع می‌خواند (پیش‌فرض)\&. اگر از گزینهٔ \f3-Xprefer:source\fR استفاده شود، فایل منبع را می‌خواند\&. هنگامی که می‌خواهید مطمئن شوید پردازنده‌های حاشیه‌نویسی می‌توانند به حاشیه‌نویسی‌های اعلان‌شده با سیاست ماندگاری \f3SOURCE\fR دسترسی داشته باشند، از -\f3Xprefer:source\fR استفاده کنید\&. .TP -Xpkginfo:[\fIalways\fR,\fIlegacy\fR,\fInonempty\fR] .br کنترل می‌کند که آیا javac فایل‌های \f3package-info\&.class\fR را از روی فایل‌های package-info\&.java تولید کند یا خیر\&. آرگومان‌های حالت ممکن برای این گزینه شامل موارد زیر است\&. .RS .TP always همیشه برای هر فایل \f3package-info\&.java\fR یک فایل \f3package-info\&.class\fR تولید کند\&. این گزینه ممکن است زمانی مفید باشد که از سامانه ساختی مانند Ant استفاده می‌کنید که بررسی می‌کند هر فایل \f3\&.java\fR دارای یک فایل \f3\&.class\fR متناظر باشد\&. .TP legacy تنها در صورتی فایل \f3package-info\&.class\fR را تولید می‌کند که package-info\&.java حاوی حاشیه‌نویسی باشد\&. اگر package-info\&.java فقط شامل توضیحات باشد، فایل \f3package-info\&.class\fR تولید نکن\&. \fIنکته:\fR اگر تمام حاشیه‌نویسی‌ها در فایل package-info\&.java دارای \f3RetentionPolicy\&.SOURCE\fR باشند، ممکن است یک فایل \f3package-info\&.class\fR تولید شود اما خالی باشد\&. .TP nonempty تنها در صورتی فایل \f3package-info\&.class\fR را تولید می‌کند که package-info\&.java شامل حاشیه‌نویسی‌هایی با \f3RetentionPolicy\&.CLASS\fR یا \f3RetentionPolicy\&.RUNTIME\fR باشد\&. .RE .TP -Xprint .br نمایشی متنی از انواع مشخص‌شده را برای اهداف اشکال‌زدایی چاپ می‌کند\&. نه پردازش حاشیه‌نویسی را انجام می‌دهد و نه کامپایل را\&. قالب خروجی ممکن است تغییر کند\&..TP -XprintProcessorInfo .br اطلاعات مربوط به یادداشت‌هایی (annotations) که از یک پردازشگر خواسته شده پردازش کند را چاپ می‌کند\&. .TP -XprintRounds .br اطلاعات مربوط به دورهای اولیه و بعدی پردازش یادداشت‌ها (annotation processing rounds) را چاپ می‌کند\&. .SH "فعال یا غیرفعال‌سازی هشدارها با گزینه -XLINT (ENABLE OR DISABLE WARNINGS WITH THE -XLINT OPTION)" هشدار \fIname\fR را با گزینه \f3-Xlint:name\fR فعال کنید، که در آن \f3name\fR یکی از نام‌های هشدار زیر است\&. توجه داشته باشید که می‌توانید یک هشدار را با گزینه \f3-Xlint:-name:\fR غیرفعال کنید\&. .TP cast درباره تبدیل نوع‌های (casts) غیرضروری و زائد هشدار می‌دهد، برای مثال: .sp .nf \f3String s = (String) "Hello!"\fP .fi .nf \f3\fP .fi .sp .TP classfile درباره مسائل مربوط به محتویات فایل کلاس (class file) هشدار می‌دهد\&. .TP deprecation درباره استفاده از موارد منسوخ‌شده (deprecated) هشدار می‌دهد، برای مثال: .sp .nf \f3java\&.util\&.Date myDate = new java\&.util\&.Date();\fP .fi .nf \f3int currentDay = myDate\&.getDay();\fP .fi .nf \f3\fP .fi .sp متد \f3java\&.util\&.Date\&.getDay\fR از زمان JDK 1\&.1 منسوخ شده است\&. .TP dep-ann درباره مواردی که با یک توضیح Javadoc از نوع \f3@deprecated\fR مستند شده‌اند، اما فاقد یادداشت \f3@Deprecated\fR هستند، هشدار می‌دهد؛ برای مثال: .sp .nf \f3/**\fP .fi .nf \f3 * @deprecated As of Java SE 7, replaced by {@link #newMethod()}\fP .fi .nf \f3 */\fP .fi .nf \f3public static void deprecatedMethood() { }\fP .fi .nf \f3public static void newMethod() { }\fP .fi .nf \f3\fP .fi .sp .TP divzero درباره تقسیم بر عدد صحیح ثابت ۰ هشدار می‌دهد، برای مثال: .sp .nf \f3int divideByZero = 42 / 0;\fP .fi .nf \f3\fP .fi .sp .TP empty درباره عبارت‌های خالی پس از دستورهای \f3if\fR هشدار می‌دهد، برای مثال: .sp .nf \f3class E {\fP .fi .nf \f3 void m() {\fP .fi .nf \f3 if (true) ;\fP .fi .nf \f3 }\fP .fi .nf \f3}\fP .fi .nf \f3\fP .fi .sp .TP fallthrough بلوک‌های switch را برای موارد انتقال خودکار (fall-through) بررسی می‌کند و برای هر موردی که یافت شود پیام هشداری صادر می‌نماید\&. موارد fall-through مواردی در یک بلوک switch (به‌جز آخرین case در بلوک) هستند که کد آن‌ها فاقد دستور break است و اجازه می‌دهد اجرای کد از آن case به case بعدی سرریز شود\&. برای مثال، کد پس از برچسب case 1 در این بلوک switch با دستور break پایان نیافته است: .sp .nf \f3switch (x) {\fP .fi .nf \f3case 1:\fP .fi .nf \f3 System\&.out\&.println("1");\fP .fi .nf \f3 // No break statement here\&.\fP .fi .nf \f3case 2:\fP .fi .nf \f3 System\&.out\&.println("2");\fP .fi .nf \f3}\fP .fi .nf \f3\fP .fi .sp اگر هنگام کامپایل این کد از گزینه \f3-Xlint:fallthrough\fR استفاده شده باشد، کامپایلر هشداری درباره امکان fall-through به case، همراه با شماره خط case مورد نظر صادر می‌کند\&. .TP finally درباره بندهای \f3finally\fR که نمی‌توانند به‌طور عادی خاتمه یابند هشدار می‌دهد، برای مثال: .sp .nf \f3public static int m() {\fP .fi .nf \f3 try {\fP .fi .nf \f3 throw new NullPointerException();\fP .fi .nf \f3 } catch (NullPointerException(); {\fP .fi .nf \f3 System\&.err\&.println("Caught NullPointerException\&.");\fP .fi .nf \f3 return 1;\fP .fi .nf \f3 } finally {\fP .fi .nf \f3 return 0;\fP .fi .nf \f3 }\fP .fi .nf \f3 }\fP .fi .nf \f3\fP .fi .sp کامپایلر برای بلوک \f3finally\fR در این مثال هشداری تولید می‌کند\&. هنگامی که متد \f3int\fR فراخوانی می‌شود، مقدار 0 را برمی‌گرداند\&. یک بلوک \f3finally\fR هنگام خروج از بلوک \f3try\fR اجرا می‌شود\&. در این مثال، هنگامی که کنترل به بلوک \f3catch\fR منتقل می‌شود، متد \f3int\fR خارج می‌شود\&. با این حال، بلوک \f3finally\fR باید اجرا شود، بنابراین حتی اگر کنترل به خارج از متد منتقل شده باشد، باز هم اجرا می‌شود\&. .TP options درباره مسائل مربوط به استفاده از گزینه‌های خط فرمان هشدار می‌دهد\&. بخش Cross-Compilation Options را ببینید\&. .TP overrides درباره مسائل مربوط به بازنویسی متدها (method overrides) هشدار می‌دهد\&. برای مثال، دو کلاس زیر را در نظر بگیرید:.sp .nf \f3public class ClassWithVarargsMethod {\fP .fi .nf \f3 void varargsMethod(String\&.\&.\&. s) { }\fP .fi .nf \f3}\fP .fi .nf \f3\fP .fi .nf \f3public class ClassWithOverridingMethod extends ClassWithVarargsMethod {\fP .fi .nf \f3 @Override\fP .fi .nf \f3 void varargsMethod(String[] s) { }\fP .fi .nf \f3}\fP .fi .nf \f3\fP .fi .sp کامپایلر هشداری شبیه به مورد زیر صادر می‌کند:\&. .sp .nf \f3warning: [override] varargsMethod(String[]) in ClassWithOverridingMethod \fP .fi .nf \f3overrides varargsMethod(String\&.\&.\&.) in ClassWithVarargsMethod; overriding\fP .fi .nf \f3method is missing \&'\&.\&.\&.\&'\fP .fi .nf \f3\fP .fi .sp هنگامی که کامپایلر با یک متد \f3varargs\fR مواجه می‌شود، پارامتر صوری \f3varargs\fR را به یک آرایه تبدیل می‌کند\&. در متد \f3ClassWithVarargsMethod\&.varargsMethod\fR، کامپایلر پارامتر صوری \f3varargs\fR به صورت \f3String\&.\&.\&. s\fR را به پارامتر صوری \f3String[] s\fR، یعنی یک آرایه ترجمه می‌کند که با پارامتر صوری متد \f3ClassWithOverridingMethod\&.varargsMethod\fR مطابقت دارد\&. در نتیجه، این مثال کامپایل می‌شود\&. .TP path درباره مؤلفه‌های نامعتبر مسیر و دایرکتوری‌های ناموجود مسیر در خط فرمان (با توجه به مسیر کلاس (class path)، مسیر مبدا (source path) و سایر مسیرها) هشدار می‌دهد\&. چنین هشدارهایی را نمی‌توان با استفاده از یادداشت \f3@SuppressWarnings\fR نادیده گرفت، برای مثال: .sp .nf \f3javac \-Xlint:path \-classpath /nonexistentpath Example\&.java\fP .fi .nf \f3\fP .fi .sp .TP processing درباره مسائل مربوط به پردازش یادداشت‌ها (annotation processing) هشدار می‌دهد\&. کامپایلر این هشدار را زمانی صادر می‌کند که کلاسی دارای یک یادداشت باشد و از پردازشگر یادداشتی استفاده کنید که نمی‌تواند آن نوع استثنا را پردازش کند\&. برای مثال، کد زیر یک پردازشگر یادداشت ساده است: \fIفایل مبدا AnnocProc\&.java\fR: .sp .nf \f3import java\&.util\&.*;\fP .fi .nf \f3import javax\&.annotation\&.processing\&.*;\fP .fi .nf \f3import javax\&.lang\&.model\&.*;\fP .fi .nf \f3import\&.javaz\&.lang\&.model\&.element\&.*;\fP .fi .nf \f3\fP .fi .nf \f3@SupportedAnnotationTypes("NotAnno")\fP .fi .nf \f3public class AnnoProc extends AbstractProcessor {\fP .fi .nf \f3 public boolean process(Set elems, RoundEnvironment renv){\fP .fi .nf \f3 return true;\fP .fi .nf \f3 }\fP .fi .nf \f3\fP .fi .nf \f3 public SourceVersion getSupportedSourceVersion() {\fP .fi .nf \f3 return SourceVersion\&.latest();\fP .fi .nf \f3 }\fP .fi .nf \f3}\fP .fi .nf \f3\fP .fi .sp \fIفایل مبدا AnnosWithoutProcessors\&.java\fR: .sp .nf \f3@interface Anno { }\fP .fi .nf \f3\fP .fi .nf \f3@Anno\fP .fi .nf \f3class AnnosWithoutProcessors { }\fP .fi .nf \f3\fP .fi .sp دستورهای زیر پردازشگر یادداشت \f3AnnoProc\fR را کامپایل کرده، سپس این پردازشگر یادداشت را روی فایل مبدا \f3AnnosWithoutProcessors\&.java\fR اجرا می‌کنند: .sp .nf \f3javac AnnoProc\&.java\fP .fi .nf \f3javac \-cp \&. \-Xlint:processing \-processor AnnoProc \-proc:only AnnosWithoutProcessors\&.java\fP .fi .nf \f3\fP .fi .sp هنگامی که کامپایلر پردازشگر یادداشت را روی فایل مبدا \f3AnnosWithoutProcessors\&.java\fR اجرا می‌کند، هشدار زیر را صادر می‌نماید: .sp .nf \f3warning: [processing] No processor claimed any of these annotations: Anno\fP .fi .nf \f3\fP .fi .sp برای رفع این مشکل، می‌توانید نام یادداشت تعریف‌شده و استفاده‌شده در کلاس \f3AnnosWithoutProcessors\fR را از \f3Anno\fR به \f3NotAnno\fR تغییر دهید\&. .TP rawtypes درباره عملیات‌های بررسی‌نشده روی انواع خام (raw types) هشدار می‌دهد\&. عبارت زیر یک هشدار \f3rawtypes\fR ایجاد می‌کند: .sp .nf \f3void countElements(List l) { \&.\&.\&. }\fP .fi .nf \f3\fP .fi .sp مثال زیر هشدار \f3rawtypes\fR ایجاد نمی‌کند .sp .nf \f3void countElements(List l) { \&.\&.\&. }\fP .fi.nf \f3\fP .fi .sp نوع \f3List\fR یک نوع خام (raw type) است\&. با این حال، \f3List\fR یک نوع پارامتری‌شده با نویسه عام نامحدود (unbounded wildcard parameterized type) است\&. از آنجا که \f3List\fR یک رابط (interface) پارامتری‌شده است، همیشه آرگومان نوع آن را مشخص کنید\&. در این مثال، آرگومان صوری \f3List\fR با یک نویسه عام نامحدود (\f3?\fR) به عنوان پارامتر نوع صوری آن مشخص شده است، بدین معنا که متد \f3countElements\fR می‌تواند هر نمونه‌سازی از رابط \f3List\fR را بپذیرد\&. .TP Serial در مورد تعاریف ناموجود \f3serialVersionUID\fR در کلاس‌های قابل سریال‌سازی (serializable) هشدار می‌دهد، برای مثال: .sp .nf \f3public class PersistentTime implements Serializable\fP .fi .nf \f3{\fP .fi .nf \f3 private Date time;\fP .fi .nf \f3\fP .fi .nf \f3 public PersistentTime() {\fP .fi .nf \f3 time = Calendar\&.getInstance()\&.getTime();\fP .fi .nf \f3 }\fP .fi .nf \f3\fP .fi .nf \f3 public Date getTime() {\fP .fi .nf \f3 return time;\fP .fi .nf \f3 }\fP .fi .nf \f3}\fP .fi .nf \f3\fP .fi .sp کامپایلر هشدار زیر را تولید می‌کند: .sp .nf \f3warning: [serial] serializable class PersistentTime has no definition of\fP .fi .nf \f3serialVersionUID\fP .fi .nf \f3\fP .fi .sp اگر یک کلاس قابل سریال‌سازی صراحتاً فیلدی به نام \f3serialVersionUID\fR را اعلان نکند، محیط زمان اجرای سریال‌سازی یک مقدار پیش‌فرض \f3serialVersionUID\fR را بر اساس جنبه‌های مختلف کلاس، همان‌طور که در Java Object Serialization Specification شرح داده شده است، برای آن کلاس محاسبه می‌کند\&. با این حال، اکیداً توصیه می‌شود که همه کلاس‌های قابل سریال‌سازی مقادیر \f3serialVersionUID\fR را به طور صریح اعلان کنند، زیرا فرایند پیش‌فرض محاسبه مقادیر \f3serialVersionUID\fR به شدت به جزئیات کلاس وابسته است که می‌تواند بسته به پیاده‌سازی‌های کامپایلر متفاوت باشد، و در نتیجه ممکن است باعث ایجاد یک \f3InvalidClassExceptions\fR غیرمنتظره در حین دیسریال‌سازی شود\&. برای تضمین یک مقدار \f3serialVersionUID\fR سازگار در بین پیاده‌سازی‌های مختلف کامپایلر Java، یک کلاس قابل سریال‌سازی باید یک مقدار صریح برای \f3serialVersionUID\fR اعلان کند\&. .TP static در مورد مسائل مربوط به استفاده از موارد ایستا (statics) هشدار می‌دهد، برای مثال: .sp .nf \f3class XLintStatic {\fP .fi .nf \f3 static void m1() { }\fP .fi .nf \f3 void m2() { this\&.m1(); }\fP .fi .nf \f3}\fP .fi .nf \f3\fP .fi .sp کامپایلر هشدار زیر را تولید می‌کند: .sp .nf \f3warning: [static] static method should be qualified by type name, \fP .fi .nf \f3XLintStatic, instead of by an expression\fP .fi .nf \f3\fP .fi .sp برای حل این مشکل، می‌توانید متد \f3static\fR با نام \f3m1\fR را به صورت زیر فراخوانی کنید: .sp .nf \f3XLintStatic\&.m1();\fP .fi .nf \f3\fP .fi .sp همچنین، می‌توانید کلمه کلیدی \f3static\fR را از اعلان متد \f3m1\fR حذف کنید\&. .TP try در مورد مسائل مربوط به استفاده از بلوک‌های \f3try\fR، از جمله دستورهای try-with-resources هشدار می‌دهد\&. برای مثال، برای دستور زیر هشداری تولید می‌شود زیرا منبع \f3ac\fR اعلان‌شده در بلوک \f3try\fR استفاده نشده است: .sp .nf \f3try ( AutoCloseable ac = getResource() ) { // do nothing}\fP .fi .nf \f3\fP .fi .sp .TP unchecked جزئیات بیشتری درباره هشدارهای تبدیل بررسی‌نشده (unchecked conversion warnings) که توسط Java Language Specification الزامی شده‌اند ارائه می‌دهد، برای مثال: .sp .nf \f3List l = new ArrayList();\fP .fi .nf \f3List ls = l; // unchecked warning\fP .fi .nf \f3\fP .fi .sp در طول پاک‌سازی نوع (type erasure)، انواع \f3ArrayList\fR و \f3List\fR به ترتیب به \f3ArrayList\fR و \f3List\fR تبدیل می‌شوند\&. دستور \f3ls\fR دارای نوع پارامتری‌شده \f3List\fR است\&. هنگامی که \f3List\fR ارجاع‌شده توسط \f3l\fR به \f3ls\fR منتسب می‌شود، کامپایلر یک هشدار بررسی‌نشده (unchecked warning) تولید می‌کند\&. در زمان کامپایل، کامپایلر و JVM نمی‌توانند تشخیص دهند که آیا \f3l\fR به نوع \f3List\fR ارجاع دارد یا خیر\&. در این حالت، \f3l\fR به نوع \f3List\fR ارجاع ندارد\&. در نتیجه، آلودگی هیپ (heap pollution) رخ می‌دهد\&. وضعیت آلودگی هیپ زمانی رخ می‌دهد که شیء \f3List\fR با نام \f3l\fR، که نوع ایستای آن \f3List\fR است، به شیء \f3List\fR دیگری با نام \f3ls\fR که نوع ایستای متفاوتی یعنی \f3List\fR دارد، منتسب شود\&. با این حال، کامپایلر همچنان این انتساب را مجاز می‌داند\&. برای حفظ سازگاری عقبرو با نسخه‌هایی از Java SE که از جنریک‌ها (generics) پشتیبانی نمی‌کنند، کامپایلر باید این انتساب را مجاز بداند\&. به دلیل پاک‌سازی نوع، \f3List\fR و \f3List\fR هر دو به \f3List\fR تبدیل می‌شوند\&. در نتیجه، کامپایلر انتساب شیء \f3l\fR\f3,\fR را که دارای نوع خام \f3List\fR است، به شیء \f3ls\fR مجاز می‌داند\&. .TP varargs در مورد استفاده‌های ناامن از متدهای دارای آرگومان‌های متغیر (\f3varargs\fR)، به‌ویژه آن‌هایی که حاوی آرگومان‌های غیرقابل بازنمایی (non-reifiable) هستند، هشدار می‌دهد، برای مثال: .sp .nf \f3public class ArrayBuilder {\fP .fi .nf \f3 public static void addToList (List listArg, T\&.\&.\&. elements) {\fP .fi .nf \f3 for (T x : elements) {\fP .fi .nf \f3 listArg\&.add(x);\fP .fi .nf \f3 }\fP .fi .nf \f3}\fP .fi .nf \f3\fP .fi .sp \fIنکته:\fR یک نوع غیرقابل بازنمایی (non-reifiable)، نوعی است که اطلاعات نوع آن در زمان اجرا به طور کامل در دسترس نیست\&. کامپایلر هشدار زیر را برای تعریف متد \f3ArrayBuilder\&.addToList\fR تولید می‌کند.sp .nf \f3warning: [varargs] Possible heap pollution from parameterized vararg type T\fP .fi .nf \f3\fP .fi .sp هنگامی که کامپایلر با یک متد \f3varargs\fR مواجه می‌شود، پارامتر رسمی \f3varargs\fR را به یک آرایه ترجمه می‌کند\&. با این حال، زبان برنامه‌نویسی Java ساخت آرایه‌هایی از نوع‌های پارامتری (parameterized types) را مجاز نمی‌داند\&. در متد \f3ArrayBuilder\&.addToList\fR، کامپایلر پارامتر رسمی \f3varargs\fR با عنوان \f3T\&.\&.\&.\fR elements را به پارامتر رسمی \f3T[]\fR elements، که یک آرایه است، ترجمه می‌کند\&. با این وجود، به دلیل پاک‌سازی نوع (type erasure)، کامپایلر پارامتر رسمی \f3varargs\fR را به \f3Object[]\fR elements تبدیل می‌نماید\&. در نتیجه، امکان آلودگی هیپ (heap pollution) وجود دارد\&. .SH "فایل‌های آرگومان خط فرمان (COMMAND-LINE ARGUMENT FILES)" برای کوتاه‌تر کردن یا ساده‌سازی دستور \f3javac\fR، می‌توانید یک یا چند فایل حاوی آرگومان‌های دستور \f3javac\fR (به‌جز گزینه‌های \f3-J\fR) را مشخص کنید\&. این قابلیت به شما امکان می‌دهد تا دستورهای \f3javac\fR با هر طولی را در هر سیستم‌عاملی ایجاد کنید\&. .PP یک فایل آرگومان می‌تواند شامل گزینه‌های \f3javac\fR و نام فایل‌های سورس در هر ترکیبی باشد\&. آرگومان‌های درون یک فایل می‌توانند با فاصله یا نویسه‌های خط جدید (newline) از یکدیگر جدا شوند\&. اگر نام یک فایل حاوی فاصله‌های درونی است، کل نام فایل را درون علامت نقل‌قول دوتایی (double quotation marks) قرار دهید\&. .PP نام فایل‌ها درون یک فایل آرگومان نسبت به دایرکتوری جاری سنجیده می‌شوند، نه نسبت به مکان قرارگیری فایل آرگومان\&. نویسه‌های عام یا جانشین (*) در این فهرست‌ها مجاز نیستند (مانند تعیین \f3*\&.java\fR)\&. استفاده از علامت اتساین (@) برای تفسیر بازگشتی فایل‌ها پشتیبانی نمی‌شود\&. گزینه‌های \f3-J\fR پشتیبانی نمی‌شوند زیرا به اجراکننده (launcher) ارسال می‌شوند که از فایل‌های آرگومان پشتیبانی نمی‌کند\&. .PP هنگام اجرای دستور \f3javac\fR، مسیر و نام هر فایل آرگومان را با پیشوند علامت اتساین (@) مشخص کنید\&. هنگامی که دستور \f3javac\fR با آرگومانی مواجه می‌شود که با علامت اتساین (@) آغاز شده است، محتویات آن فایل را به درون فهرست آرگومان‌ها بسط می‌دهد\&. .PP \f3مثال ۱: تک‌فایل آرگومان (Example 1 Single Argument File)\fR .PP می‌توانید از یک فایل آرگومان تکی به نام \f3argfile\fR برای نگهداری تمام آرگومان‌های \f3javac\fR استفاده کنید: .sp .nf \f3javac @argfile\fP .fi .nf \f3\fP .fi .sp این فایل آرگومان می‌تواند حاوی محتویات هر دو فایلی باشد که در مثال ۲ نشان داده شده است\&. .PP \f3مثال ۲: دو فایل آرگومان (Example 2 Two Argument Files)\fR .PP می‌توانید دو فایل آرگومان بسازید: یکی برای گزینه‌های \f3javac\fR و دیگری برای نام‌های فایل‌های سورس\&. توجه داشته باشید که فهرست‌های زیر نویسهٔ ادامه‌خط ندارند\&. .PP فایلی به نام options بسازید که حاوی موارد زیر باشد: .sp .nf \f3\-d classes\fP .fi .nf \f3\-g\fP .fi .nf \f3\-sourcepath /java/pubs/ws/1\&.3/src/share/classes\fP .fi .nf \f3\fP .fi .sp فایلی به نام classes بسازید که حاوی موارد زیر باشد: .sp .nf \f3MyClass1\&.java\fP .fi .nf \f3MyClass2\&.java\fP .fi .nf \f3MyClass3\&.java\fP .fi .nf \f3\fP .fi .sp سپس، دستور \f3javac\fR را به صورت زیر اجرا کنید: .sp .nf \f3javac @options @classes\fP .fi .nf \f3\fP .fi .sp \f3مثال ۳: فایل‌های آرگومان دارای مسیر (Example 3 Argument Files with Paths)\fR .PP فایل‌های آرگومان می‌توانند دارای مسیر باشند، اما هر نام فایلی درون این فایل‌ها نسبت به دایرکتوری کاری جاری سنجیده می‌شود (نه نسبت به \f3path1\fR یا \f3path2\fR): .sp .nf \f3javac @path1/options @path2/classes\fP .fi .nf \f3\fP .fi .sp.SH "پردازش حاشیه‌نویسی‌ها (ANNOTATION PROCESSING)" دستور \f3javac\fR پشتیبانی مستقیمی از پردازش حاشیه‌نویسی‌ها فراهم می‌کند و جایگزین نیاز به دستور جداگانه پردازش حاشیه‌نویسی، یعنی \f3apt\fR، می‌شود\&. .PP رابط برنامه‌نویسی (API) برای پردازنده‌های حاشیه‌نویسی در بسته‌ها و زیربسته‌های \f3javax\&.annotation\&.processing\fR و \f3javax\&.lang\&.model\fR تعریف شده است\&. .SS "نحوه کارکرد پردازش حاشیه‌نویسی‌ها (HOW ANNOTATION PROCESSING WORKS)" مگر در حالتی که پردازش حاشیه‌نویسی با گزینه \f3-proc:none\fR غیرفعال شده باشد، کامپایلر برای یافتن پردازنده‌های حاشیه‌نویسی موجود جستجو می‌کند\&. مسیر جستجو را می‌توان با گزینه \f3-processorpath\fR مشخص کرد\&. اگر مسیری تعیین نشده باشد، از مسیر کلاس کاربر (user class path) استفاده می‌شود\&. پردازنده‌ها از طریق فایل‌های پیکربندی ارائه‌دهنده سرویس به نام \f3META-INF/services/javax\&.annotation\&.processing\fR\&.Processor در مسیر جستجو تعیین موقعیت می‌شوند\&. چنین فایل‌هایی باید حاوی نام‌های پردازنده‌های حاشیه‌نویسی مورد استفاده باشند که در هر خط یک مورد درج شده است\&. روش دیگر این است که پردازنده‌ها به صورت صریح با استفاده از گزینه \f3-processor\fR مشخص شوند\&. .PP پس از بررسی فایل‌های مبدأ و کلاس‌های خط فرمان جهت تعیین اینکه چه حاشیه‌نویسی‌هایی وجود دارند، کامپایلر از پردازنده‌ها پرس‌وجو می‌کند تا مشخص شود چه حاشیه‌نویسی‌هایی را پردازش می‌کنند\&. هنگام یافتن تطابق، پردازنده فراخوانی می‌شود\&. یک پردازنده می‌تواند حاشیه‌نویسی‌هایی را که پردازش می‌کند به خود اختصاص دهد؛ در این صورت، هیچ تلاش دیگری برای یافتن پردازنده‌ای برای آن حاشیه‌نویسی‌ها انجام نمی‌شود\&. پس از اینکه همه حاشیه‌نویسی‌ها اختصاص داده شدند، کامپایلر به دنبال پردازنده‌های اضافی نمی‌گردد\&. .PP اگر پردازنده‌ای فایل‌های مبدأ جدیدی تولید کند، دور دیگری از پردازش حاشیه‌نویسی انجام می‌شود: هر فایل مبدأ تازه‌تولیدشده بررسی می‌شود و حاشیه‌نویسی‌ها مانند قبل پردازش می‌گردند\&. هر پردازنده‌ای که در دورهای پیشین فراخوانی شده بود، در تمامی دورهای بعدی نیز فراخوانی می‌شود\&. این روند تا زمانی ادامه می‌یابد که هیچ فایل مبدأ جدیدی تولید نشود\&. .PP پس از وقوع دوری که در آن هیچ فایل مبدأ جدیدی تولید نشده است، پردازنده‌های حاشیه‌نویسی برای آخرین بار فراخوانی می‌شوند تا فرصت تکمیل کارهای باقی‌مانده را داشته باشند\&. در نهایت، مگر اینکه از گزینه \f3-proc:only\fR استفاده شده باشد، کامپایلر فایل‌های مبدأ اصلی و تمام فایل‌های مبدأ تولیدشده را کامپایل می‌کند\&. .SS "فایل‌های مبدأ بارگذاری‌شده به صورت ضمنی (IMPLICITLY LOADED SOURCE FILES)" برای کامپایل مجموعه‌ای از فایل‌های مبدأ، ممکن است کامپایلر نیاز داشته باشد که فایل‌های مبدأ اضافی را به صورت ضمنی بارگذاری کند\&. به بخش «جستجو برای نوع‌ها» مراجعه کنید\&. چنین فایل‌هایی در حال حاضر مشمول پردازش حاشیه‌نویسی نمی‌شوند\&. به طور پیش‌فرض، اگر پردازش حاشیه‌نویسی رخ داده باشد و هر فایل مبدأ بارگذاری‌شده به صورت ضمنی کامپایل شود، کامپایلر هشدار می‌دهد\&. گزینه \f3-implicit\fR راهکاری برای نادیده گرفتن و جلوگیری از نمایش این هشدار فراهم می‌کند\&. .SH "جستجو برای نوع‌ها (SEARCHING FOR TYPES)" برای کامپایل یک فایل مبدأ، کامپایلر اغلب به اطلاعاتی درباره یک نوع (type) نیاز دارد، اما تعریف آن نوع در فایل‌های مبدأ مشخص‌شده در خط فرمان وجود ندارد\&. کامپایلر به اطلاعات نوع برای هر کلاس یا واسطی (interface) که در فایل مبدأ استفاده، ارث‌بری یا پیاده‌سازی شده باشد نیاز دارد\&. این شامل کلاس‌ها و واسط‌هایی نیز می‌شود که صراحتاً در فایل مبدأ ذکر نشده‌اند اما اطلاعات را از طریق توارث ارائه می‌دهند\&. .PP برای مثال، هنگامی که زیرکلاسی از \f3java\&.applet\&.Applet\fR ایجاد می‌کنید، شما همچنین از کلاس‌های اجدادی \f3Applet\fR استفاده می‌کنید: \f3java\&.awt\&.Panel\fR، \f3java\&.awt\&.Container\fR، \f3java\&.awt\&.Component\fR و \f3java\&.lang\&.Object\fR\&. .PP هنگامی که کامپایلر به اطلاعات نوع نیاز دارد، به دنبال فایل مبدأ یا فایل کلاسی می‌گردد که نوع را تعریف کرده است\&. کامپایلر برای فایل‌های کلاس ابتدا در کلاس‌های راه‌اندازی (bootstrap) و کلاس‌های الحاقی (extension)، و سپس در مسیر کلاس کاربر (که به طور پیش‌فرض دایرکتوری جاری است) جستجو می‌کند\&. مسیر کلاس کاربر با تنظیم متغیر محیطی \f3CLASSPATH\fR یا با استفاده از گزینه \f3-classpath\fR تعریف می‌شود\&. .PP اگر گزینه \f3-sourcepath\fR را تنظیم کنید، کامپایلر مسیر مشخص‌شده را برای یافتن فایل‌های مبدأ جستجو می‌کند\&. در غیر این صورت، کامپایلر مسیر کلاس کاربر را هم برای فایل‌های کلاس و هم برای فایل‌های مبدأ بررسی می‌کند\&. .PP می‌توانید کلاس‌های راه‌اندازی یا الحاقی متفاوتی را با گزینه‌های \f3-bootclasspath\fR و \f3-extdirs\fR تعیین کنید\&. به «گزینه‌های همگردانی متقابل (Cross-Compilation Options)» مراجعه کنید\&. .PP یک جستجوی موفق نوع ممکن است به یک فایل کلاس، یک فایل مبدأ، یا هر دو منجر شود\&. اگر هر دو پیدا شوند، می‌توانید از گزینه \f3-Xprefer\fR استفاده کنید تا به کامپایلر دستور دهید از کدام‌یک استفاده کند\&. اگر \f3newer\fR مشخص شده باشد، کامپایلر از فایلی که جدیدتر است استفاده می‌کند\&. اگر \f3source\fR مشخص شده باشد، کامپایلر فایل مبدأ را به کار می‌برد\&. حالت پیش‌فرض \f3newer\fR است\&. .PP اگر جستجوی نوع، فایلی مبدأ را برای یک نوع مورد نیاز پیدا کند (چه به‌تنهایی و چه در نتیجه تنظیمات گزینه \f3-Xprefer\fR)، کامپایلر فایل مبدأ را برای دریافت اطلاعات مورد نیازش می‌خواند\&. به طور پیش‌فرض، کامپایلر فایل مبدأ را نیز کامپایل می‌کند\&. می‌توانید از گزینه \f3-implicit\fR برای مشخص کردن این رفتار استفاده کنید\&. اگر \f3none\fR تعیین شود، هیچ فایل کلاسی برای آن فایل مبدأ تولید نمی‌شود\&. اگر \f3class\fR تعیین شود، فایل‌های کلاس برای آن فایل مبدأ تولید خواهند شد\&. .PP ممکن است کامپایلر تا پیش از اتمام پردازش حاشیه‌نویسی، متوجه نیاز به برخی از اطلاعات نوع نشود\&. هنگامی که اطلاعات نوع در یک فایل مبدأ یافت شود و گزینه \f3-implicit\fR مشخص نشده باشد، کامپایلر هشدار می‌دهد که این فایل بدون قرار گرفتن تحت پردازش حاشیه‌نویسی در حال کامپایل شدن است\&. برای غیرفعال کردن این هشدار، یا فایل را در خط فرمان مشخص کنید (تا مشمول پردازش حاشیه‌نویسی شود) یا از گزینه \f3-implicit\fR برای مشخص کردن این استفاده کنید که آیا فایل‌های کلاس برای چنین فایل‌های مبدأیی باید تولید شوند یا خیر\&. .SH "رابط برنامه‌نویسی (PROGRAMMATIC INTERFACE)" دستور \f3javac\fR از رابط برنامه‌نویسی جدید کامپایلر جاوا (Java Compiler API) که توسط کلاس‌ها و واسط‌های بسته \f3javax\&.tools\fR تعریف شده است، پشتیبانی می‌کند\&. .SS "مثال (EXAMPLE)" برای کامپایل به گونه‌ای که گویی آرگومان‌های خط فرمان ارائه می‌شوند، از نحو زیر استفاده کنید: .sp .nf \f3JavaCompiler javac = ToolProvider\&.getSystemJavaCompiler();\fP .fi .nf \f3\fP .fi .sp این مثال خروجی‌های تشخیصی را در جریان خروجی استاندارد می‌نویسد و کد خروجی‌ای را بازمی‌گرداند که \f3javac\fR در صورت فراخوانی از خط فرمان ارائه می‌داد\&. .PP می‌توانید از متدهای دیگر در واسط \f3javax\&.tools\&.JavaCompiler\fR برای مدیریت پیام‌های تشخیصی، کنترل محل خواندن و نوشتن فایل‌ها و موارد دیگر استفاده کنید\&. .SS "رابط قدیمی (OLD INTERFACE)" \fIنکته:\fR این API صرفاً برای سازگاری با گذشته حفظ شده است\&. تمام کدهای جدید باید از رابط برنامه‌نویسی جدید کامپایلر جاوا (Java Compiler API) استفاده کنند\&. .PP کلاس \f3com\&.sun\&.tools\&.javac\&.Main\fR دو متد ایستا برای فراخوانی کامپایلر از درون یک برنامه ارائه می‌دهد: .sp .nf \f3public static int compile(String[] args);\fP .fi .nf \f3public static int compile(String[] args, PrintWriter out);\fP .fi .nf \f3\fP .fi .sp پارامتر \f3args\fR بیانگر هر یک از آرگومان‌های خط فرمان است که معمولاً به کامپایلر ارسال می‌شوند\&. .PP پارامتر \f3out\fR مشخص می‌کند که خروجی تشخیصی کامپایلر به کجا هدایت شود\&. .PP مقدار بازگشتی (\f3return\fR) معادل مقدار خروج (\f3exit\fR) از \f3javac\fR است\&. .PP \fIنکته:\fR تمام کلاس‌ها و متدهای دیگر که در بسته‌ای با نام‌های آغازشونده با \f3com\&.sun\&.tools\&.javac\fR (زیربسته‌های \f3com\&.sun\&.tools\&.javac\fR) یافت می‌شوند کاملاً داخلی هستند و در هر زمان ممکن است تغییر کنند\&. .SH "مثال‌ها (EXAMPLES)" \f3مثال ۱: کامپایل یک برنامه ساده\fR .PP این مثال نحوه کامپایل فایل مبدأ \f3Hello\&.java\fR در دایرکتوری greetings را نشان می‌دهد\&. کلاس تعریف‌شده در \f3Hello\&.java\fR به نام \f3greetings\&.Hello\fR نام‌گذاری شده است\&. دایرکتوری greetings هم برای فایل مبدأ و هم برای فایل کلاس، دایرکتوری بسته به شمار می‌رود و زیر دایرکتوری جاری قرار دارد\&. این امر استفاده از مسیر پیش‌فرض کلاس کاربر را ممکن می‌سازد\&. همچنین تعیین دایرکتوری مقصد جداگانه با گزینه \f3-d\fR را غیرضروری می‌کند\&. .PP کد منبع در \f3Hello\&.java\fR: .sp .nf \f3package greetings;\fP .fi .nf \f3\fP .fi .nf \f3public class Hello {\fP .fi .nf \f3 public static void main(String[] args) {\fP .fi .nf \f3 for (int i=0; i < args\&.length; i++) {\fP .fi .nf \f3 System\&.out\&.println("Hello " + args[i]);\fP .fi .nf \f3 }\fP .fi .nf \f3 }\fP .fi .nf \f3}\fP .fi .nf \f3\fP .fi .sp کامپایل greetings\&.Hello: .sp .nf \f3javac greetings/Hello\&.java\fP .fi .nf \f3\fP .fi .sp اجرای \f3greetings\&.Hello\fR: .sp .nf \f3java greetings\&.Hello World Universe Everyone\fP .fi .nf \f3Hello World\fP .fi .nf \f3Hello Universe\fP .fi .nf \f3Hello Everyone\fP .fi .nf \f3\fP .fi .sp \f3مثال ۲: کامپایل چندین فایل مبدأ\fR .PP این مثال فایل‌های مبدأ \f3Aloha\&.java\fR، \f3GutenTag\&.java\fR، \f3Hello\&.java\fR و \f3Hi\&.java\fR را در بسته \f3greetings\fR کامپایل می‌کند\&. .sp .nf \f3% javac greetings/*\&.java\fP .fi .nf \f3% ls greetings\fP .fi .nf \f3Aloha\&.class GutenTag\&.class Hello\&.class Hi\&.class\fP .fi .nf \f3Aloha\&.java GutenTag\&.java Hello\&.java Hi\&.java\fP .fi .nf \f3\fP .fi .sp \f3مثال ۳: مشخص کردن مسیر کلاس کاربر\fR .PP پس از تغییر دادن یکی از فایل‌های مبدأ در مثال قبلی، آن را مجدداً کامپایل کنید: .sp .nf \f3pwd\fP .fi .nf \f3/examples\fP .fi .nf \f3javac greetings/Hi\&.java\fP .fi .nf \f3\fP .fi .sp از آنجا که \f3greetings\&.Hi\fR به کلاس‌های دیگر در بسته \f3greetings\fR ارجاع می‌دهد، کامپایلر نیاز دارد تا این کلاس‌های دیگر را پیدا کند\&. مثال قبلی کار می‌کند زیرا مسیر پیش‌فرض کلاس کاربر همان دایرکتوری‌ای است که شامل دایرکتوری بسته می‌باشد\&. اگر می‌خواهید این فایل را بدون نگرانی درباره اینکه در کدام دایرکتوری قرار دارید دوباره کامپایل کنید، دایرکتوری examples را با تنظیم \f3CLASSPATH\fR به مسیر کلاس کاربر اضافه نمایید\&. این مثال از گزینه \f3-classpath\fR استفاده می‌کند\&. .sp .nf \f3javac \-classpath /examples /examples/greetings/Hi\&.java\fP .fi .nf \f3\fP .fi .sp اگر \f3greetings\&.Hi\fR را تغییر دهید تا از یک ابزار اعلان (banner utility) استفاده کند، آنگاه آن ابزار نیز باید از طریق مسیر کلاس کاربر قابل دسترسی باشد\&. .sp.nf \f3javac \-classpath /examples:/lib/Banners\&.jar \e\fP .fi .nf \f3 /examples/greetings/Hi\&.java\fP .fi .nf \f3\fP .fi .sp برای اجرای یک کلاس در بستهٔ \f3greetings\fR، برنامه نیاز به دسترسی به بستهٔ \f3greetings\fR و کلاس‌هایی دارد که کلاس‌های \f3greetings\fR از آن‌ها استفاده می‌کنند\&. .sp .nf \f3java \-classpath /examples:/lib/Banners\&.jar greetings\&.Hi\fP .fi .nf \f3\fP .fi .sp \f3مثال ۴ تفکیک فایل‌های منبع و فایل‌های کلاس\fR .PP مثال زیر از \f3javac\fR برای کامپایل کدی استفاده می‌کند که روی JVM 1\&.7 اجرا می‌شود\&. .sp .nf \f3javac \-source 1\&.7 \-target 1\&.7 \-bootclasspath jdk1\&.7\&.0/lib/rt\&.jar \e \fP .fi .nf \f3\-extdirs "" OldCode\&.java\fP .fi .nf \f3\fP .fi .sp گزینهٔ \f3-source 1\&.7\fR مشخص می‌کند که برای کامپایل \f3OldCode\&.java\fR از نگارش 1\&.7 (یا 7) زبان برنامه‌نویسی جاوا استفاده شود\&. گزینهٔ \f3-target 1\&.7\fR تضمین می‌کند که فایل‌های کلاس تولیدشده با JVM 1\&.7 سازگار هستند\&. توجه داشته باشید که در بیشتر موارد، مقدار گزینهٔ \f3-target\fR همان مقدار گزینهٔ \f3-source\fR است؛ در این مثال، می‌توانید گزینهٔ \f3-target\fR را حذف کنید\&. .PP باید گزینهٔ \f3-bootclasspath\fR را جهت مشخص کردن نسخهٔ صحیح کلاس‌های راه‌انداز (کتابخانهٔ \f3rt\&.jar\fR) تعیین کنید\&. در غیر این صورت، کامپایلر یک هشدار تولید می‌کند: .sp .nf \f3javac \-source 1\&.7 OldCode\&.java\fP .fi .nf \f3warning: [options] bootstrap class path not set in conjunction with \fP .fi .nf \f3\-source 1\&.7\fP .fi .nf \f3\fP .fi .sp اگر نسخهٔ صحیح کلاس‌های راه‌انداز را مشخص نکنید، کامپایلر قواعد زبان قدیمی‌تر را (در این مثال، نسخهٔ 1\&.7 زبان برنامه‌نویسی جاوا) در ترکیب با کلاس‌های راه‌انداز جدید استفاده می‌کند که می‌تواند منجر به تولید فایل‌های کلاسی شود که روی پلتفرم قدیمی‌تر (در این مورد، Java SE 7) کار نمی‌کنند، زیرا ممکن است ارجاع به متدهای ناموجود در آن‌ها گنجانده شود\&. .PP \f3مثال ۵ کامپایل متقاطع\fR .PP این مثال از \f3javac\fR برای کامپایل کدی استفاده می‌کند که روی JVM 1\&.7 اجرا می‌شود\&. .sp .nf \f3javac \-source 1\&.7 \-target 1\&.7 \-bootclasspath jdk1\&.7\&.0/lib/rt\&.jar \e\fP .fi .nf \f3 \-extdirs "" OldCode\&.java\fP .fi .nf \f3\fP .fi .sp گزینهٔ \f3-source 1\&.7\fR مشخص می‌کند که برای کامپایل OldCode\&.java از نگارش 1\&.7 (یا 7) زبان برنامه‌نویسی جاوا استفاده شود\&. گزینهٔ \f3-target 1\&.7\fR تضمین می‌کند که فایل‌های کلاس تولیدشده با JVM 1\&.7 سازگار هستند\&. .PP باید گزینهٔ \f3-bootclasspath\fR را جهت مشخص کردن نسخهٔ صحیح کلاس‌های راه‌انداز (کتابخانهٔ \f3rt\&.jar\fR) تعیین کنید\&. در غیر این صورت، کامپایلر یک هشدار تولید می‌کند: .sp .nf \f3javac \-source 1\&.7 OldCode\&.java\fP .fi .nf \f3warning: [options] bootstrap class path not set in conjunction with \-source 1\&.7\fP .fi .nf \f3\fP .fi .sp اگر نسخهٔ صحیح کلاس‌های راه‌انداز را مشخص نکنید، کامپایلر قواعد زبان قدیمی را در ترکیب با کلاس‌های راه‌انداز جدید استفاده می‌کند\&. این ترکیب می‌تواند منجر به تولید فایل‌های کلاسی شود که روی پلتفرم قدیمی‌تر (در این مورد، Java SE 7) کار نمی‌کنند، زیرا ممکن است ارجاع به متدهای ناموجود در آن‌ها گنجانده شود\&. در این مثال، کامپایلر از نگارش 1\&.7 زبان برنامه‌نویسی جاوا استفاده می‌کند\&..SH "همچنین ببینید (SEE ALSO)" .TP 0.2i \(bu java(1) .TP 0.2i \(bu jdb(1) .TP 0.2i \(bu javah(1) .TP 0.2i \(bu javadoc(1) .TP 0.2i \(bu jar(1) .TP 0.2i \(bu jdb(1) .RE .br 'pl 8.5i 'bp