包是一组类的集合,包其实就是多个文件夹构成的多级目录,包名全部用小写字母表示,在程序中要声明类所属的包时,用package关键字。
package edu.cn.fzh;
package语句必须作为整个文件的第一条语句,并且只能有一条。如图1所示
图1 package的用法
并把Hello.java文件保存到F:\下,并编译,运行,如图2所示,编译没问题,但运行结果不对,因为NoClassDefFoundError: Hello,没有找到名字叫Hello的类。
图2 编译运行结果(1)
原因是,现在已经有了包了:edu.cn.fzh, 类不能叫Hello,而应加上包名,运行时应修改为, java edu.cn.fzh.Hello,但结果依然不对,如图3所示:
图3编译运行结果(2)
解决方法:修改编译命令,应该用以下命令进行编译。
javac -d . Hello.java
-d的含义是根据程序中的包名生成文件夹,“.”的含义是在哪生成文件夹,代表在当前路径(F:\)生成edu文件夹,如图4所示,将编译后生成的class类放到edu\cn\fzh目录下,
图4 –d命令编译自动生成目录
这样就把类文件和源程序文件分开。
运行程序时应该输入java edu.cn.fzh.Hello, 不能直接使用java Hello
二、包的用法---进阶
在以上的演示中,我们并没有把源程序文件,Hello.java放在包对应的目录下,如果类Hello可能被其他的类调用,那么应该将Hello.java源程序放在edu/cn/fzh的目录下,如图5,图6所示:
图5 目录
图6 Hello.java 内容
将Test.java文件保存到F:\,内容如图7所示:
图7 Test.java内容
在F:\下建立class文件夹,编译命令如图8所示:该命令中只编译主类即可,系统会自动对其他类进行编译。
图8 编译命令
此时class文件的内容如图9、图10所示
图9 编译后结果(1)
图10 编译后结果(2
运行程序的命令如图11所示:
图11 运行命令
这样就将class文件和java源程序文件分开,但这时class文件有多个,
三、JAR命令用法
JAR文件,就是将程序的所有类文件.class文件压缩打包,类似与zip,但与zip不同,JAR文件还包含了一个META-INF/MANIFEST.MF的文件。
JAR打包的过程:
在class目录下创建一个文件,名字随意定,扩展名随意,也可以没有扩展名,如文件就叫mani,提前在文件中输入以下内容:
Main-Class: Test
注意: Main-Class 写法固定,区分大小写,冒号后要由空格,作用是指示该jar的入口类即主类,如果该类有包,要注明包名,但没有“.java”,也没有”.class”
最后别忘了输入“回车符”
JAR包命令如下:(注意修改命令的路径到class文件和mani文件所在的路径)
具体内容:
1. JAR为命令名
2. cvmf为jar命令子命令,其中c代表创建jar文件,v代表生成详细报告,m表示指定Manifest清单文件,及刚才创建的mani文件,f代表指定jar文件名字
3. mani代表Manifest清单文件的名字,如果有后缀名要注明后缀名
4. app.jar表示生成的jar文件的名字
5. 后面的edu和Test.class表示要加入到jar包中的文件或文件夹
生成的报告及app.jar文件:
运行jar文件的命令: