javac-----Java编程语言编译器

编程|编译

javac-----Java编程语言编译器

*提要
*说明
*查找类型
*文件列表
*选项
*例子
*请参考

SYNOPSIS[提要]
javac [options] [sourcefiles] [@files]
oldjavac [options] [soucefiles] [@files]
参数可疑位任意顺序
options
命令行选项
sourcefiles
一个或多个原文件
@files
一个或多个列有原文件列表的文件

DESCRIPTION[说明]
javac工具读由java编程语言编写的类(class)和接口(interface)的定义,并将它们编译成字节代码的class文件
有两种将原文件名传递给javac的方法
* 文件数量教少,可简单将文件名列在命令行上
* 文件数量较多,将文件名列在一个文件中,文件名用空格(包括tab)或换行隔开.将该文件前加"@"字符后,使用javac编译

原文件必须有.java后缀名,类(class)文件必须以.class为后缀名.原文件和类文件必须有定位该类的根文件名(即,去掉后缀的文件名).例如: 一个命名为MyClass的的类,原文件名应为MyClass.java,该原文件将被编译成字节代码的名为MyClass.class的类文件.

嵌套类(inner class)的定义将产生附加的类文件.这些类文件的文件名由外部类名(outer class names)和嵌套类名合并而成. 例如, MyClass$MyInnerClass.class

你应该将原文件放置在能反应它们package tree的目录下.例如,如果你将所有的原文件放置在/workspace目录下,com.mysoft.mypack.MyClass类的原文件(即 .java文件)应该为/workspace/com/mysoft/mypack/MyClass.java
[对Windows: 以上应为.例如你将所有的原文件放置在c:\workspace目录下,com.mysoft.mypack.MyClass类的原文件应为c:\workspace\com\mysoft\mypack\MyClass.java ]

缺省情况下,编译器将把类文件(.class文件)放置到和原文件(.java)相同的目录下.你可以通过使用-d选项指定目标目录(见选项的说明)

查找类型
当编译一个文件时,编译器通常需要关于它暂时无法鉴别的类型的信息. 编译器需要每一个在文件中使用的,extened或implemented的类或接口的类型信息. 它包括在文件中没有明显提级的,但是有可能通过继承来提供信息的类或接口.
例如: 当你继承java.applet.Applet,你同时也使用了Applet类的祖先:java.awt.Panel,
java.awt.Container,java.awt.Component和java.awt.Object.
当编译器需要类型信息时,它寻找定义了类型信息的原文件或类文件.编译器首先寻找boottrap和extension类(这些除非你使用编译器选项,否则不需要关心),接着查找用户的类路径,用户的类路径通过CLASSPATH环境变量或使用命令行选项-classpath来定义.(细节,请看*设置Class Path*),如果使用-sourcepath命令行选项,编译器将在该路径下查找原文件,否则编译器将在用户类路径下同时查找类文件和原文件. 你可以通过使用-bootclasspath和-extdirs命令行选项来设置不同的bootstrap和extension类;见下面的Cross-Compilation options

一次成功的查找将找到一个类文件,原文件或两者.下面是javac如何处理每一种情况
*查找找到一个类文件(.class文件)但无原文件(.java文件): javac使用了类文件
*查找找到一个原文件但无类文件: javac将编译该原文件,然后使用生成的类文件
*查找找到两者: javac判断类文件是否过期.如果类文件过期,javac将重新编译原文件并将使用更新后的类文件.否则,javac将使用该类文件(没有过期)
缺省情况下,javac通过比较原文件和类文件的更改日期来判断类文件是否过期.( -Xdepend选项提供了一个慢一些,但是更可靠的方法)

主意: javac将默默(不输出信息)地:-)编译那些没有在命令行上指定的文件.使用-verbose选项可以来跟踪自动编译过程.

[FILELIST]文件列表
为使javac的命令行短小或更简单,你可以指定一个或多个文件,这些文件每行含有一个文件名.在命令行,在这些文件前使用'@'字符来指定它们是文件列表.当javac遇到一个的名开头为"@",它将认为在该文件中的文件名为需要处理的文件的名子
例如: 你可以将所有的原文件列在一个名为sourcefile的文件中.这个文件可能如此:

MyClass1.java
MyClass2.java
MyClass3.java
你可以通过
% javac @sourcefiles
[ windows: c:\jdk1.4\bin\javac @sourcefiles]
编译MyClass1.java,MyClass2.java,MyClass3.java

OPTIONS[选项]
javac有一系列的标准选项,这些选项被当前开发环境所支持,并且将在以后的发行版中继续被支持.一些非标准的选项为专门为当前的虚拟机和编译实现.它们将在将来改变.(非标准选项以-X开头)

Standard Options[标准选项]

1: -classpath <classpath>
设置用户类路径,覆盖在CLASSPATH环境变量中的用户类路径,如果CLASSPATH和-classpath都没有指定,用户路径将包含当前目录. (更多细节见设置路径)
如果-sourcepath选项没有指定,在用户类路径下查找类文件,也查找原文件.
2: -d <directory>
为类文件设置目标目录.如果一个类是一个package的一部分.将类文件放置到反应package名的子目录下.(如果需要,将建立目录). 例如: 如果你指定-d /home/myclasses并且类为com.mypackage.myClass,那么该类将称为 /home/myclasses/com/mypackage/MyClass.class
[ windows: -d c:\workspace, 将产生 c:\workspace\com\mypackage\MyClass.class]
如果-d没有指定,javac将类文件放置到和原文件相同的目录下
注意: 使用-d选项指定的目录不自动加到你的用户类路径中.
3: -deprecation
显示每个使用或重载的"不应再使用"的成员或类,如果没有-deprecation,javac将只显示使用了这些类或成员的原文件名.
4: -encoding
设置原文件的编码名,例如 EUCJIS/SJIS(日文编码),如果-encoding没有指定,将使用平台缺省的转换
5: -g
产生所有的调试信息,包括局部变量. 缺省情况下,调试信息只包括行号和原文件信息.(建议使用)
6: -g:none
不产生调试信息
7: -g:{keyword list}

时间: 2024-10-07 10:13:10

javac-----Java编程语言编译器的相关文章

Java混淆编译器(转apusic.com)

编译 最近试用了几个Java混淆器(Java Obfuscator),感觉没有一个完全另人满意的,于是想干脆自己写一个得了.翻了几页Java虚拟机规范之后突发奇想,别的混淆器都是在编译好的byte code上做文章,能不能从源码直接编译成经过混淆的class文件呢?就这样花了一个多星期的时间写了一个Java混淆编译器(Java Obfuscator Compiler). Q: 什么是混淆器?A: 由于Java程序运行时是动态连接的,因此编译成的目标文件中包含有符号表,使得Java程序很容易被反编

关于解决Java编程语言线程问题的建议

Allen Holub 指出,Java 编程语言的线程模型可能是此语言中最薄弱的部分.它完全不适合实际复杂程序的要求,而且也完全不是面向对象的.本文建议对 Java 语言进行重大修改和补充,以解决这些问题. Java 语言的线程模型是此语言的一个最难另人满意的部分.尽管 Java 语言本身就支持线程编程是件好事,但是它对线程的语法和类包的支持太少,只能适用于极小型的应用环境. 关于 Java 线程编程的大多数书籍都长篇累牍地指出了 Java 线程模型的缺陷,并提供了解决这些问题的急救包(Band

GWT v2.2发布 使用Java编程语言编写AJAX前端

Google Web Toolkit的缩写,有了 GWT可以使用 Java 编程语言编写 AJAX 前端,然后 GWT 会交叉编译到优化的http://www.aliyun.com/zixun/aggregation/33906.html">JavaScript 中,而 JavaScript 可以自动在所有主要浏览器上运行.GWT允许开发人员使用 Java 编程语言快速构建和维护复杂但性能高的 JavaScript 前端应用程序,从而降低了开发难度,尤其是与 Eclipse Google

使用Java编程语言构建IBM InfoSphere Streams应用程序

简介 IBM InfoSphere Streams( 以下简称 Streams) 是 IBM 于 2009 年推出的具有高可靠性,高可扩展性,分布式流计算平 台,前瞻性地把支持每秒 6G 或者每小时 21600G(相当于互联网上所有网页数量之和)数据处理能力作为系统设计的指标 ,实现了流数据"永恒分析"的能力.它包含一个运行时环境 ( 或者称为实例 ) 和编程模型来简化需要对大批量连续流数 据进行提取.过滤.分析以及关联的应用程序的开发,能够广泛的应用于制造.零售.交通运输.金融证券以

使用Java编程语言来构建Streams应用程序的优势

然后详细地介绍了通过 Java 运算符模型描述文件以及 API 来构建 Streams 应用程序的方法,并讨论了 Java 运算符的生命周期与线程安全:之后对 Java 运算符各个层面 Metrics 的监控进行了讨论:最后给出了 Java 运算符的调试方法.本文特别适合流计算应用的http://www.aliyun.com/zixun/aggregation/7155.html">开发人员阅读,对需要了解和设计流计算架构的人员也有很大的参考价值. IBM InfoSphere Strea

Windows/Linux下引用jar包,并用javac/java编译运行

Windows/Linux下引用jar包,并用javac/java编译运行,有需要的朋友可以参考下.   1> Windows 假设要引用的jar放在D:/test目录下,名字为t1.jar, java源文件放在D:/test/src目录下,名字为t2.java. 编译: javac -cp d:/test/t1.jar d:/test/src/t2.java 运行: java -cp d:/test/t1.jar;d:/test/src t2 注意,分号后面没有空格,否则报错.   需要注意的

正则表达式和Java编程语言

应用程序常常需要有文本处理功能,比如单词查找.电子邮件确认或XML文档 集成.这通常会涉及到模式匹配.Perl.sed或awk等语言通过使用正则表达式来 改善模式匹配,正则表达式是一串字符,它所定义的模式可用来查找匹配的文本.为了使用JavaTM编程语言进行模式匹配,需 要使用带有许多charAt子字串的StringTokenizer类,读取字母或符号以便处理文本.这常常导致复杂或凌乱的代码. 现在不一样了. 2平台标准版(J2SETM)1.4版包含一个名 为java.util.regex的新软

源码:JAVA在线编译器模拟

有很多网站提供在线编译运行java代码,不过大家要做好安全工作,防止恶意浏览者攻击,下面做一个雏形,欢迎大家改进 [java] public class CompileAndRunJavaFile extends HttpServlet{ private static Process process ;//执行子进程 /** * 编译并且运行JAVA代码 * @author Maple */ @Override protected void doPost(HttpServletRequest r

用来理解 Java 编程语言的 8 个图表

原文地址: http://www.oschina.net/news/44438/top-8-diagrams-for-understanding-java 很多时候,一张图比你说 1000 个字能更有效的说清楚一个问题.我们列举了 8 个关于 Java 语言的图表,或许可以让你对 Java 有着更深入的认识.   1. 字符串不变性(String Immutability) 下面的图表显示执行如下两行代码所发生的事: 1 String s = "abcd"; 2 s = s.conca