java和javac命令行
(1)javac.exe:用于编译Java程序源代码,编译之后生成字节码文件(.class)
语法:javac[option] source
[option]:可选项,可包括以下的选项。
-classpath<路径>:指定将使用的类路径或要使用的封装类的.jar文件的路径。(可以是目录,jar文件,zip文件(里面都是class文件),会覆盖掉所有在CLASSPATH里面的设定。)
-d<目录>:指定java源文件编译之后生成的字节码.class文件的存放位置
source 指Java源文件名,包括文件扩展名.java
(2)java.exe:用与执行java程序编译之后的字节码文件
语法:java [option]classname [arguments]
[option]: 可选项,可包括以下的选项。
-classpath<路径>:指定将使用的类路径或要使用的封装类的.jar文件的路径。
-version<目录>:显示JDK的版本
ClassName:编译之后的字节码文件,但不包含文件扩展名.class
[arguments]:可选项,指传递给main方法的参数。main方法的参数是字符串数据。
知道了这两个命令的一般规则之后,我们开始实际编码。
先来描述一下几种情况:
1、单独的一个java主程序;
2、带包的一个java主程序;
3、同一个包的两个类,一个引用另一个;
4、引用不同包的其它类。
1、单独的一个java主程序
public class dog{
public static void main(String[] args) {
System.out.println("我是一只小狗");
}
}
将命令行到该java文件同一目录(比如dog.java放在D:/test/dog.java)
输入命令 d:
cd test
然后输入命令javac dog.java则会在当前的文件夹下出现dog.class类文件。
如果想指定编译的同时将编译好的类文件放到某个文件夹下则可以使用-d指定路径。
例如
1.javac -d ./ dog.java则是在当前目录下,即是D:/(./表示当前目录 ../表示上一级目录 )
2.javac -d ../ dog.java 在上一个文件夹(上上级,这个例子路径太浅,不能实验)
3.javac -d ../ a dog.java则是在上一个文件夹下的a文件夹下,但是一定要保证指定的文件路径存在。
编译完之后,就应该使用执行命令java了。
使用命令:java dog就可以运行了(当然这里使用的是这个例子: javac -d ./dog.java )
注意:发现这里并没有使用-classpath标注,那是因为没有使用到某些jar文件
即如果使用了a.jar则要加上-classpath .;a.jar其中前面的那个“.;”我理解成是把环境变量中配置的jar文件拿进来。
2、带包的一个java主程序
package my.friends;
public class cat{
public static voidmain(String[] args){
System.out.println("我是小猫");
}
}
javac -d ./ cat.java,这时候会在当前目录下自动根据包的结构形式创建文件目录,即创建my/friends/文件夹,D:/test/my/friends/cat.class
执行:javamy.friends.cat
3、同一个包的两个类Joeytang.java文件为
pakage my.friends
public classJoeytang{
public StringtoString(){ return "Joey"; } }
Sunnylu.java文件为
pakage my.friends
public classSunnylu{
public static voidmain(String[] args) {
Joeytangjoey = new Joeytang();
System.out.println("Iam Sunney."+joey+" is myfriend.");
}
}
这种情况中Sunnylu类引用了Joeytang所以必须先编译Joeytang按照第二种情况将Joeytang编译,此时开始编译Sunnylu,注意要使用javac -classpath .; -d ./ Sunnylu.java,此时加入了-classpath选项,我也不知道为什么,但是如果不加编译老是提示找不到Jeoytang这个(郁闷啊,就这个问题搞了一个上午)。 编译完以后,来运行Sunnylu也要加入-classpath选项,java -classpath .; my.friends.Sunnylu
4、引用不同包的其它类
Tom.java文件为
package my.partners;
public classTom{
public StringtoString() { return "It's Tom"; }}
Sunnylu.java文件为
pakage my.friends
import my.friends.Tom;
public classSunnylu{
public static voidmain(String[] args) {
System.out.println("I am Sunny.");
Tom tom = newTom();
System.out.println(tom+ " is my partner.");
Joeytang joey =new Joeytang();
System.out.println(joey+ " is my friends."); } }
这种情况首先把Joeytang编译了,然后编译Tom类,因为Tom为外部类所以在编译Sunnylu的时候一定要在-classpath注明Tom的路径例如如果我把Tom类编译到当前目录的上一级目录上去了,则编译Sunnylu时使用javac -classpath .;../ -d ./ Jerry.java,此时编译时会到上一目录按照Tom的包结构来找Tom类。 运行时一样要加入这个选项。 好了写这么多希望跟我一样郁闷此问题的可以得到些帮助。
更深奥一点的。(使用-classpath和-sourcepath)参考网络资源
javac
-classpath,设定要搜索类的路径,
-sourcepath, 设定要搜索编译所需java 文件的路径,可以是目录,jar文件,zip文件(里面都是java文件)。
所以一个完整的javac命令行应该是这样的,
假设dog.java在d:\test里面,
(在任何的目录的都可以执行以下命令来编译。)
javac -classpath c:\classes;c:\jar\abc.jar;c:\zip\abc.zip
-sourcepath c:\source\project1\src;c:\source\project2\lib\src.jar;c:\source\project3\lib\src.zip d:\test\dog.java
表示编译需要c:\classes下面的class文件,c:\jar\abc.jar里面的class文件,c:\zip\abc.zip里面的class文件 (当然这些jar都是没有的)
还需要c:\source\project1\src下面的源文件,c:\source\project2\lib\src.jar里面的源文件,c:\source\project3\lib\src.zip里面的源文件(当然这些源文件也是没有的)
然后就编译d:test/dog.java文件
编译成功
注意:jar,zip里面的源文件不会有什么改动,目录下的源文件,有可能会被重新编译。
java
-classpath, 设定要搜索的类的路径,可以是目录,jar文件,zip文件(里面都是class文件),会覆盖掉所有的CLASSPATH的设定。
由于所要执行的类也是要搜索的类的一部分,所以一定要把这个类的路径也放到-classpath的设置里面。
表现在,在要执行的类的路径里面执行java时,一定要添加上点号(.)标示本目录也要搜索。
假设dog.class在路径d:\test里面
可以在任何路径下执行以下命令
java -classpath c:\classes;c:\jar\abc.jar;c:\zip\abc.zip; d:\test dog
问题:如果main.class属于c:\jar\abc.jar,并且在com.cnblogs.jeffchen这个包里,那么执行java -classpathc:\classes;c:\jar\abc.jar;c:\zip\abc.zip;com.cnblogs.jeffchen.main即可, 但是如果classpath中包含多个jar包呢?并且其他jar包中也有com.cnblogs.jeffchen会发生什么情况?错误?
当然,-classpath可以省略写成-cp
编译 :javac -cp 路径 类名.java 例如: javac -cp /apps/com/company/application MainClass.java.
运行:java -cp 路径 包名.类名 例如:java -cp /apps com.company.application.MainClass
在 windows 下,
文件路径的分割符为反斜杠 \
类或者 java 文件列表的分割符为分号 ;
在 linux 下
文件路径的分隔符位斜杠 /
类或者 java 文件列表的分隔符为冒号 :
一个 linux 下编译和运行的例子
/usr/local/java/bin/javac -classpath /tmp/javatest/lib/mail-1.3.3.jar -d/tmp/javatest/bin/ /tmp/javatest/src/jp/co/realseed/Capability.java
/usr/local/java/bin/java -classpath /tmp/javatest/lib/mail-1.3.3.jar:/tmp/javatest/bin/jp.co.realseed.Capability