javac和java的使用

http://www.edu114.cn/java/java785043.html

 

 
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}
 
 
jar

用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
选项:
    -c  创建新的存档
    -t  列出存档内容的列表
    -x  展开存档中的命名的(或所有的〕文件
    -u  更新已存在的存档
    -v  生成详细输出到标准输出上
    -f  指定存档文件名
    -m  包含来自标明文件的标明信息
    -0  只存储方式;未用ZIP压缩格式
    -M  不产生所有项的清单(manifest〕文件
    -i  为指定的jar文件产生索引信息
    -C  改变到指定的目录,并且包含下列文件:
如果一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。
示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中:
       jar cvf classes.jar Foo.class Bar.class
示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有
           文件存档到一个名为 'classes.jar' 的存档文件中:
       jar cvfm classes.jar mymanifest -C foo/ .


java


用法: java [-选项] 类 [参数...]
           (执行一个类)
   或者 java [-选项] -jar jar文件 [参数...]
           (执行一个jar文件)
其中,可能的选项包括:
    -client       选择 "client" VM(ginger547:应该是指Virtual Machine)
    -server     选择 "server" VM
    -hotspot      与 "client" VM同义  [不赞成]
                  默认情况的VM是client.
    -cp <一个文件夹和zip/jar文件组成的类搜索路径>
    -classpath <一个文件夹和zip/jar文件组成的类搜索路径>
                 一个由文件夹,JAR压缩文件,或者ZIP压缩文件组成的用来搜索类的列表
    -D<名字>=<值>
                  设置一个系统属性
    -verbose[:class|gc|jni]
                  使详细输出变的可用
    -version      打印产品版本然后退出
    -version:<值>
                  只运行指定版本
    -showversion  打印产品版本后继续
    -jre-restrict-search | -jre-no-restrict-search
                  在版本搜索的时候,包含/排除用户私人的JRE
    -? -help      打印帮助信息
    -X            打印非标准选项帮助
    -ea[:<包名>...|:<类名>]
    -enableassertions[:<包名>...|:<类名>]
                 使断言可用
    -da[:<包名>...|:<类名>]
    -disableassertions[:<包名>...|:<类名>]
                  是断言不可用
    -esa | -enablesystemassertions
                  使系统级断言可用
    -dsa | -disablesystemassertions
                  使系统级断言不可用
    -agentlib:<库名>[=<选项>]
                  加载本地代理库<库名>,例如. -agentlib:hprof
                  同时可查看, -agentlib:jdwp=help和 -agentlib:hprof=help
    -agentpath:<路径名>[=<选项>]
                  通过全路径名来加载本地代理库
    -javaagent:<jar路径>[=<选项>]
                 加载Java编程语言代理,可查看 java.lang.instrument
一个包允许创建一个名为 List 的类,可以把它保存在自己的包中而不用考虑和其他地方的某个名为 List 的类相冲突。包以分层方式保存并被明确地引入新的类定
Java 中最具革新性的两个特点就是:包和接口。包(package)是类的容器,用来保存划
分的类名空间。例如,一个包允许创建一个名为 List 的类,可以把它保存在自己的包中而不
用考虑和其他地方的某个名为 List 的类相冲突。包以分层方式保存并被明确地引入新的类定
义。通过运用关键字 interface,Java 允许充分抽象它实现的接口。用接口,可以定义一系列
被一个类或多个类执行的方法。接口自己不定义任何实现。尽管它们与抽象类相似,接口有
一个特殊的功能:类可以实现多个接口。与之相反,类只能继承一个超类(抽象类或其他)。
包和接口是 Java 程序的两个基本组成。

4.1 包
在编制大程序的时候,常常会定义许多不同用途的类。如何更好地将这些类组织起来,
是一个很重要的问题。这不仅可以使程序整体清晰条理,还可以使其他项目中对这些类的引
用更为方便。为此,Java 引入了包的概念。
包是类的容器,用于保证类名空间的一致性,例如,可以在自己的包内创建一个名为 List
的类而不会与别人创建的其他 List 类重名。由于 Java 是一种网络编程语言,支持在 Internet
上动态装载模块,因此它特别注意避免名字空间的冲突。可以认为包是一个名字空间,在该
空间中,除了方法重载的情形外,同一个相同类型(类、接口、变量和方法)的名字只能出
现一次,当在各包之间出现重名时,系统将根据包名对重名的标识符进行区分。实际上,在
程序中使用的每一个变量和方法都隐含地用全限定名进行访问。
限定名的组成方式为:[格式]包名.类名.变量名或方法名

4.1.1 定义包
要创建一个包,只需要包含一个 package 命令作为 Java 源文件的第一句即可。在该文件
中定义的任何类将属于指定的包。package 语句定义了一个存储类的名字空间。如果省略
package 语句,类名将被输入一个默认的没有名称的包。尽管默认包对于短的例子程序很好用,
但对于实际的应用程序它是不适当的。在多数情况下,程序编写者需要为自己的代码定义一
个包。下面是 package 声明的通用形式:
package pkg;
这里,pkg 是包名。例如,下面的声明创建了一个名为 MyPackage 的包。
package MyPackage;
Java 用文件系统目录来存储包。例如,任何声明的 MyPackage 中的一部分类的.class 文
件被存储在一个 MyPackage 目录中。记住这种情况是很重要的,目录名必须和包名严格匹配。
多个文件可以包含相同的 package 声明。package 声明仅仅指定了文件中定义的被包含的
文件属于哪一个包。它不拒绝其他文件的其他方法成为相同包的一部分。多数实际的包分散
在很多文件中。可以创建包层次。为了做到这点,只要将每个包名与它的上层包名用点号“ .”
分隔开就可以了。一个多级包声明的通用形式如下:
package pkg1[.pkg2[.pkg3]];
包层次一定要在 Java 开发系统的文件系统中有所反映。例如,一个由下面语句定义的包:
package java.awt.image;
需要在 UNIX,Windows 或 Macintosh 文件系统的 java/awt/image, java\awt\image 或
java:awt:image 中分别保存。一定要仔细选用包名。不能在没有对保存类的目录重命名的情况
下重命名一个包。

4.1.2 编译和运行包
在介绍运用包的例子之前,有必要先来讲解一下类路径环境变量。因为 Java 编译器考虑
特定位置作为包层次的根被类路径(CLASSPATH)控制。
如果我们没有用到 package 语句,可以在同样的未命名的默认包中保存所有的类。这样
做允许仅仅通过在命令行输入类名编译源文件和运行 Java 解释器,并得到结果。在这种情况
下它还会工作是因为默认的当前工作目录(.),通常在类路径环境变量中为 Java 运行时间默
认定义。然而,当有包参与时,事情就不这么简单了,如果用 package 语句指明一个包,则
包的层次结构必须与文件目录的层次相同。例如,在 test 目录下创建一个名为 packTest 的类
放在包 test 中,然后保存在文件 packTest.java 中。对该文件进行编译后,得到字节码文件
packTest.class。如果直接在 test 目录下运行 javapackTest,解释器将返回“can’t find class
packTest”(找不到类 packTest),因为这时类 packTest 位于包 test 中,对它的引用应为
test.packTest,这时运行 java test.packTest,但解释器仍然返回“can’t find class test\packTest”
(找不到类 test\packTest)。这时可以查看 CLASSPATH,发现它的值为 C:\java\classes,表明
Java 解释器在当前目录和 Java 类库所在目录 C:\java\classes 下查找,也即在\test\test 目录下查
找类 packTest,因此找不到,改正的方法可以有两种:
(1)在 test 的上一级目录运行 java test.packTest。
(2)修改 CLASSPATH,使其包括当前目录的上一级目录。
由此可以看出,运行一个包中的类时,必须指明包含这个类的包,而且要在适当的目录
下运行,同时正确地设定环境变量 CLASSPATH,使解释器能够找到指定的类。
[例 4−1] 一个简单的包示例。
package MyPack;

class Balance {
String name;
double bal;
Balance(String n, double b) {
name = n;
bal = b;
}
void show() {
if(bal
S ys tem.out.print("--> ");
System.out.println(name + ": $" + bal);
}
}
class AccountBalance {
public static void main(String args[]) {
Balance current[] = new Balance[3];
current[0] = new Balance("K. J. Fielding", 123.23);
current[1] = new Balance("Will Tell", 157.02);
current[2] = new Balance("Tom Jackson", -12.33);
for(int i=0; i
}
}
称该文件名为 AccountBalance.java,把它存放在 MyPack 目录中。接着,编译文件。确
信结果文件.class 同样在 MyPack 目录中,然后使用下面的命令执行 AccountBalance 类:
java MyPack.AccountBalance
这时需要注意,当执行该命令时必须在 MyPack 的上级目录,或者把类路径环境变量设
置成合适的值。
如上所述,AccountBalance 现在是 MyPack 包的一部分,这意味着它不能自己执行,也
就是说不能用下面的命令执行:
java AccountBalance
AccountBalance 必须和它的包名一起使用。

本篇来源于希有学院 原文链接: http://edu.seuuo.com/html/36/n-9036.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值