Java如何使用命令行编译包

Posted AcTarjan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java如何使用命令行编译包相关的知识,希望对你有一定的参考价值。

最近写Java实验报告的时候遇到了编译包的问题,很烦。。。

问题:编写一个类A,它位于包a中,保存到A.java中,再编写一个类B,它位于包b中,保存到B.java中。在类B中实例化类A的一个对象。分别编译类A和类B。

使用IDE编译很方便,按要求建包再编译就可以,但要是使用cmd就有一些坑。。。

首先我们建立如下的包关系:

包a:包b、A.java;包b:B.java(B中需要用到类A的对象,所以编译时一定要先编译A.java,再编译B.java)

包a放在D盘中javacode文件夹中,位置是:"D:javacodea";

错误编译方法:首先到包a的位置:"D:javacodea",先编译A.java,成功编译,生成A.class;再编译B.java,提示找不到类A

技术分享图片技术分享图片?

至于为什么会出错?我想了很久才明白,我们理一下整个编译过程:(仔细体会)

编译A.java时,首先要找到A.java在哪里?此时我们的位置是"D:javacodea",A.java就在a的直接目录下,此时系统能找到A.java,所以直接使用"javac A.java"进行编译,会在这个位置生成A.class;然后编译B.java时,B.java位于包a中的包b里,这时系统在这个位置就找不到B.java了,我们需要进入包b才能找到B.java,所以我们这样写:"javac bB.java";但是却提示不能找到类A,为什么呢?我们需要弄明白它是怎么找类A的?B.java使用import语句把类A添加到B.java中,我们看import语句怎么写的就知道系统是怎么找类A的了,import a.*意味着我们要先找到包a,我们现在的位置是:"D:javacodea",但是在这个位置是找不到包a的,可能有人会疑惑这不就是包a的位置吗,怎么会找不到包a?其实真的找不到,此时系统在这个位置能看到的只有包b、A.java和A.class,是无法找到包a的(如下图所示),所以就出错了。

技术分享图片技术分享图片?

那我们怎么解决这个问题呢?我目前只知道两种解决方法,如果有其他方法的欢迎补充

方法一:使用-d编译

格式:javac -d<位置a> A.java

表示的意思是在位置a里生成一个同包名(你需要编译的包的包名)的包,包里面只包含编译后的class文件

一般使用:javac -d . A.java(‘.’表示当前位置,‘.’两边有空格不能省略)

使用这种方法进行编译:

技术分享图片技术分享图片?

编译后:在包a里又产生了一个和a同名的包,这样在编译B.java时就能找到包a了,而且包a里有A.class

技术分享图片技术分享图片?

我们打开新产生的包a:新包与旧包有相同的结构,里面有编译A.java产生的A.class文件、包b;包b中有编译B.java产生的B.class

技术分享图片技术分享图片?

打开包b:包b中有编译B.java产生的B.class

 技术分享图片技术分享图片?

方法二:我们不进入要编译包的这一层,而是上一层

我们只进入到"D:javacode",而不是"D:javacodea",这样做是为了编译B.java时能找到包a,我们在包a的上一层就能看到包a了,这么做不会产生新包,只是在java文件的位置产生class文件

编译过程:

技术分享图片技术分享图片?

包a的变化:

技术分享图片技术分享图片?

包b的变化: 

技术分享图片技术分享图片?

以上是关于Java如何使用命令行编译包的主要内容,如果未能解决你的问题,请参考以下文章

用命令行编译java并生成可执行的jar包

命令行编译java文件

JAVA代码在命令行下的编译

韩顺平细说Servlet视频系列意外收获之用命令行编译带有包的java类解决方案

基本命令行操作1(java编译)

java 命令行 编译 运行程序