2024年1月16日发(作者:)

java和javac命令行

(1):用于编译Java程序源代码,编译之后生成字节码文件(.class)

语法:javac [option] source

[option]:可选项,可包括以下的选项。

-classpath<路径>:指定将使用的类路径或要使用的封装类的.jar文件的路径。(可以是目录,jar文件,zip文件(里面都是class文件),会覆盖掉所有在CLASSPATH里面的设定。)

-d<目录>:指定java源文件编译之后生成的字节码.class文件的存放位置

source 指Java源文件名,包括文件扩展名.java

(2):用与执行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) {

}

将命令行到该java文件同一目录(比如放在D:/test/)

输入命令 d:

cd test

然后输入命令则会在当前的文件夹下出现类文件。

如果想指定编译的同时将编译好的类文件放到某个文件夹下则可以使用-d指定路径。

例如

-d ./ 则是在当前目录下,即是D:/(./表示当前目录 ../表示上一级目录)

-d ../ 在上一个文件夹(上上级,这个例子路径太浅,不能实验)

-d ../ a 则是在上一个文件夹下的a文件夹下,但是一定要保证指定的文件路径存在。

编译完之后,就应该使用执行命令java了。

使用命令:java dog 就可以运行了(当然这里使用的是这个例子:javac -d ./

)

}

n("我是一只小狗");

注意:发现这里并没有使用-classpath标注,那是因为没有使用到某些jar文件

即如果使用了则要加上-classpath .;其中前面的那个“.;”我理解成是把环境变量中配置的jar文件拿进来。

2、带包的一个java主程序

package s;

public class cat{

public static void main(String[] args){

n("我是小猫");

}

}

javac -d ./ ,这时候会在当前目录下自动根据包的结构形式创建文件目录,即创建my/friends/文件夹,D:/test/my/friends/

执行:java

3、同一个包的两个类文件为

s

public class Joeytang{

public String toString(){ return "Joey"; } }

文件为

s

public class Sunnylu{

public static void main(String[] args) {

Joeytang joey = new Joeytang();

n("I am Sunney."+joey+" is my friend.");

}

}

这种情况中Sunnylu类引用了Joeytang所以必须先编译Joeytang按照第二种情况将Joeytang编译,此时开始编译Sunnylu,注意要使用javac -classpath .;

-d ./ ,此时加入了-classpath选项,我也不知道为什么,但是如果不加编译老是提示找不到Jeoytang这个(郁闷啊,就这个问题搞了一个上午)。 编译完以后,来运行Sunnylu也要加入-classpath选项,java -classpath .;

u

4、引用不同包的其它类

文件为

package rs;

public class Tom{

public String toString() { return "It's Tom"; }}

文件为

s

import ;

public class Sunnylu{

public static void main(String[] args) {

n( "I am Sunny.");

Tom tom = new Tom();

n(tom + " is my partner.");

Joeytang joey = new Joeytang();

n(joey + " is my friends."); } }

这种情况首先把Joeytang编译了,然后编译Tom类,因为Tom为外部类所以在编译Sunnylu的时候一定要在-classpath注明Tom的路径例如如果我把Tom类编译到当前目录的上一级目录上去了,则编译Sunnylu时使用javac

-classpath .;../ -d ./ ,此时编译时会到上一目录按照Tom的包结构来找Tom类。 运行时一样要加入这个选项。 好了写这么多希望跟我一样郁闷此问题的可以得到些帮助。

更深奥一点的。(使用-classpath和-sourcepath)参考网络资源

javac

-classpath,设定要搜索类的路径,

-sourcepath,设定要搜索编译所需java 文件的路径,可以是目录,jar文件,zip文件(里面都是java文件)。

所以一个完整的javac命令行应该是这样的,

假设在d:test里面,

(在任何的目录的都可以执行以下命令来编译。)

javac -classpath c:classes;c:;c:

-sourcepathc:sourceproject1src;c:sourceproject2

;c: d:

表示编译需要c:classes下面的class文件,c:里面的class文件,c:里面的class文件(当然这些jar都是没有的)

还需要c:sourceproject1src下面的源文件,c:sourceproject2 里面的源文件,c:里面的源文件(当然这些源文件也是没有的)

然后就编译d:test/文件

编译成功

注意:jar,zip里面的源文件不会有什么改动,目录下的源文件,有可能会被重新编译。

java

-classpath,设定要搜索的类的路径,可以是目录,jar文件,zip文件(里面都是class文件),会覆盖掉所有的CLASSPATH的设定。

由于所要执行的类也是要搜索的类的一部分,所以一定要把这个类的路径也放到-classpath的设置里面。

表现在,在要执行的类的路径里面执行java时,一定要添加上点号(.)标示本目录也要搜索。

假设在路径d:test里面

可以在任何路径下执行以下命令

java -classpath c:classes;c:;c:; d:testdog

问题:如果属于c:,并且在en这个包里,那么执行java -classpath

c:classes;c:;c:;即可,但是如果classpath中包含多个jar包呢?并且其他jar包中也有en会发生什么情况?错误?

在windows下,

文件路径的分割符为反斜杠

类或者java文件列表的分割符为分号 ;

在linux下

文件路径的分隔符位斜杠 /

类或者java文件列表的分隔符为冒号 :

一个linux下编译和运行的例子

/usr/local/java/bin/javac

/usr/local/java/bin/java -classpath

/tmp/javatest/lib/:/tmp/javatest/bin/ lity

-classpath /tmp/javatest/lib/ -d

/tmp/javatest/bin/ /tmp/javatest/src/jp/co/realseed/