📄 javac - java 编程语言编译器.htm
字号:
<B>-extdirs</B> 的使用很重要;请参阅下面的<A
href="http://www.iplab.is.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/tooldocs/solaris/javac.html#crosscomp-example">联编程序示例</A>。
<DL>
<DT><B>-target</B> <I>版本</I>
<DD>生成将要在指定版本的虚拟机上运行的类文件。缺省情况下生成与 1.1 和 1.2 版本的虚拟机都兼容的类文件。JDK 1.2 中的
<B>javac</B> 所支持的版本有:
<DL>
<DT><B>1.1</B>
<DD>保证所产生的类文件与 1.1 和 1.2 版的虚拟机兼容。这是缺省设置。
<DT><B>1.2</B>
<DD>生成的类文件可在 1.2 版的虚拟机上运行,但不能在 1.1 版的虚拟机上运行。 </DD></DL>
<DT><B>-bootclasspath</B> <I>自举类路径</I>
<DD>根据指定的自举类集进行联编。和用户类路径一样,自举类路径项用冒号 (<B>:</B>) 进行分隔,它们可以是目录、JAR 归档文件或 ZIP
归档文件。
<DT><B>-extdirs</B> <I>目录</I>
<DD>根据指定的扩展目录进行联编。<I>目录</I>是以冒号分隔的目录列表。在指定目录的每个 JAR 归档文件中查找类文件。
</DD></DL></BLOCKQUOTE><A name=nonstandard>
<H3>非标准选项</H3></A>
<BLOCKQUOTE>
<DL>
<DT><B>-X</B>
<DD>显示非标准选项的有关信息并退出。
<DT><B>-Xdepend</B>
<DD>递归地搜索所有可获得的类,以寻找要重编译的最新源文件。该选项将更可靠地查找需要编译的类,但会使编译进程的速度大为减慢。
<DT><B>-Xstdout</B>
<DD>将编译器信息送到<CODE>System.out</CODE> 中。缺省情况下,编译器信息送到 <CODE>System.err</CODE>
中。
<DT><B>-Xverbosepath</B>
<DD>说明如何搜索路径和标准扩展以查找源文件和类文件。
<DT><B>-J</B><I>选项</I>
<DD>将<I>选项</I>传给 <B>javac</B> 调用的 <B>java</B> 启动器。例如, <B>-J-Xms48m</B>
将启动内存设为 48 兆字节。虽然它不以 <B>-X</B> 开头,但它并不是 <B>javac</B> 的‘标准选项’。用 <B>-J</B>
将选项传给执行用 Java 编写的应用程序的虚拟机是一种公共约定。
<P>注意: <B>CLASSPATH</B> 、 <B>-classpath</B> 、 <B>-bootclasspath</B> 和
<B>-extdirs</B> 并 <I>不</I> 指定用于运行 <B>javac</B> 的类。如此滥用编译器的实现通常没有任何意义而且总是很危险的
。如果确实需要这样做,可用 <B>-J</B> 选项将选项传给基本的 <B>java</B> 启动器。</P></DD></DL></BLOCKQUOTE><A
name=examples>
<H2>程序示例</H2></A><A name=simpleexamples>
<H3>编译简单程序</H3></A>
<BLOCKQUOTE>
<P>一个源文件 <CODE>Hello.java</CODE> ,它定义了一个名叫 <B>greetings.Hello</B>
的类。<CODE>greetings</CODE> 目录是源文件和类文件两者的包目录,且它不是当前目录。这让我们可以使用缺省的用户类路径。它也使我们没必要用
<B>-d</B> 选项指定单独的目标目录。</P>
<BLOCKQUOTE><PRE>% <B>ls</B>
greetings/
% <B>ls greetings</B>
Hello.java
% <B>cat greetings/Hello.java</B>
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]);
}
}
}
% <B>javac greetings/Hello.java</B>
% <B>ls greetings</B>
Hello.class Hello.java
% <B>java greetings.Hello World Universe Everyone</B>
Hello World
Hello Universe
Hello Everyone
</PRE></BLOCKQUOTE></BLOCKQUOTE><A name=multiple-example>
<H3>编译多个源文件</H3></A>
<BLOCKQUOTE>
<P>该示例编译 <CODE>greetings</CODE> 包中的所有源文件。</P>
<BLOCKQUOTE><PRE>% <B>ls</B>
greetings/
% <B>ls greetings</B>
Aloha.java GutenTag.java Hello.java Hi.java
% <B>javac greetings/*.java</B>
% <B>ls greetings</B>
Aloha.class GutenTag.class Hello.class Hi.class
Aloha.java GutenTag.java Hello.java Hi.java
</PRE></BLOCKQUOTE></BLOCKQUOTE><A name=userclasspath>
<H3>指定用户类路径</H3></A>
<BLOCKQUOTE>
<P>对前面示例中的某个源文件进行更改后,重新编译它: </P>
<BLOCKQUOTE><PRE>% <B>pwd</B>/examples
% <B>javac greetings/Hi.java</B>
</PRE></BLOCKQUOTE>
<P>由于 <CODE>greetings.Hi</CODE> 引用了 <CODE>greetings</CODE>
包中其它的类,编译器需要找到这些其它的类。上面的示例能运行是因为缺省的用户类路径刚好是含有包目录的目录。但是,假设我们想重新编译该文件并且不关心我们在哪个目录中的话,
我们需要将 <CODE>/examples</CODE> 添加到用户类路径中。可以通过设置 <B>CLASSPATH</B> 达到此目的,但这里我们将使用
<B>-classpath</B> 选项来完成。</P>
<BLOCKQUOTE><PRE>% <B>javac -classpath \examples /examples/greetings/Hi.java</B>
</PRE></BLOCKQUOTE>
<P>如果再次将 <CODE>greetings.Hi</CODE> 改为使用标题实用程序,该实用程序也需要通过用户类路径来进行访问: </P>
<BLOCKQUOTE><PRE>% <B>javac -classpath /examples:/lib/Banners.jar \
/examples/greetings/Hi.java</B>
</PRE></BLOCKQUOTE>
<P>要执行 <CODE>greetings</CODE> 中的类,需要访问 <CODE>greetings</CODE> 和它所使用的类。</P>
<BLOCKQUOTE><PRE>% <B>java -classpath /examples:/lib/Banners.jar greetings.Hi</B>
</PRE></BLOCKQUOTE></BLOCKQUOTE><A name=separating>
<H3>将源文件和类文件分开</H3></A>
<BLOCKQUOTE>
<P>将源文件和类文件置于不同的目录下经常是很有意义的,特别是在大型的项目中。我们用 <B>-d</B>
选项来指明单独的类文件目标位置。由于源文件不在用户类路径中,所以用 <B>-sourcepath</B> 选项来协助编译器查找它们。</P>
<BLOCKQUOTE><PRE>% <B>ls</B>
classes/ lib/ src/
% <B>ls src</B>
farewells/
% <B>ls src/farewells</B>
Base.java GoodBye.java
% <B>ls lib</B>
Banners.jar
% <B>ls classes</B>
% <B>javac -sourcepath src -classpath classes:lib/Banners.jar \
src/farewells/GoodBye.java -d classes</B>
% <B>ls classes</B>
farewells/
% <B>ls classes/farewells</B>
Base.class GoodBye.class
</PRE></BLOCKQUOTE>
<P>注意:编译器也编译了 <CODE>src/farewells/Base.java</CODE>,虽然我们没有在命令行中指定它。要跟踪自动编译,可使用
<B>-verbose</B> 选项。</P></BLOCKQUOTE><A name=crosscomp-example>
<H3>联编程序示例</H3></A>
<BLOCKQUOTE>
<P>这里我们用 JDK 1.2 的 <B>javac</B> 来编译将在 1.1 版的虚拟机上运行的代码。</P>
<BLOCKQUOTE><PRE>% <B>javac -target 1.1 -bootclasspath jdk1.1.7/lib/classes.zip \
-extdirs "" OldCode.java</B>
</PRE></BLOCKQUOTE><B>
<P>-target 1.1</B> 选项可确保生成的类文件与 1.1 版的虚拟机兼容。在 JDK1.2 中, 缺省情况下 <B>javac</B>
编译生成的文件是与 1.1
版的虚拟机兼容的,因此并非严格地需要该选项。然而,由于别的编译器可能采用其它的缺省设置,所以提供这一选项将不失为是个好的习惯。</P>
<P>JDK 1.2 <B>javac</B> 在缺省状态下也将根据 1.2 版的自举类来进行编译,因此我们需要告诉 <B>javac</B> 让它根据
JDK 1.1 自举类来进行编译。可用 <B>-bootclasspath</B> 和 <B>-extdirs</B>
选项来达到此目的。不这样做的话,可能会使编译器根据 1.2 版的 API 来进行编译。由于 1.1 版的虚拟机上可能没有该 1.2 版的
API,因此运行时将出错。</P></BLOCKQUOTE><A name=seealso>
<H2>另请参阅</H2></A>
<BLOCKQUOTE>
<UL>
<LI><A
href="http://www.iplab.is.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/tooldocs/solaris/java.html">java
- Java 应用程序启动器</A>
<LI><A
href="http://www.iplab.is.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/tooldocs/solaris/jdb.html">jdb
- Java 应用程序调试程序</A>
<LI><A
href="http://www.iplab.is.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/tooldocs/solaris/javah.html">javah
- C 头文件及 stub 文件生成器</A>
<LI><A
href="http://www.iplab.is.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/tooldocs/solaris/javap.html">javap
- 类文件解析器</A>
<LI><A
href="http://www.iplab.is.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/tooldocs/solaris/javadoc.html">javadoc
- API 文档生成器</A>
<LI><A
href="http://www.iplab.is.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/tooldocs/solaris/jar.html">jar
- JAR 归档工具</A>
<LI><A
href="http://www.iplab.is.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/guide/extensions/index.html">Java
扩展框架</A> </LI></UL></BLOCKQUOTE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -