包管理

什么是包

如果我们出门旅游,拍摄了很多照片,我们会在计算机上怎么整理它们呢?想必大家和我的想法类似,使用一定的标准,把照片分类,然后存放到不同的文件夹中。
例如,我们去云南旅游,去了昆明、大理和丽江,在丽江去了丽江古城和束河古镇游玩。那么等我回到家,我整理照片时,我就会在E盘创建一个文件夹“摄影作品”,在其下创建文件夹“云南2020”,再在这个文件夹下创建“昆明”、“大理”和“丽江”三个文件夹,再在“丽江”下面创建“丽江古城”和“束河古镇”两个文件夹,然后把照片按照地点进行分类,保存到不同的文件夹中。
这样处理,在想要查找某张照片时就会非常容易——只要我们还大概记得是在什么地方拍的就行了。
编程也是如此。一个项目往往包含了不止一个源代码文件,所以我们一般会按照一定的标准把这些文件分别存放。能够把源文件分类存放到不同空间中的组织结构,就是包。

怎么命名包

在磁盘上,包和文件夹是一样,或者说:程序中的包是以文件夹的形式存在的。
既然如此,为什么不干脆叫做文件夹?主要有两个原因:一是由于Java最初是面向网络环境开发,开发者们希望程序可以和网络统一起来;二则如果使用文件夹,不同的操作系统有不同的路径表示方法,这和Java的跨平台运行理念冲突。因此,我们在Java中使用“包”来管理各类资源,而不是文件夹——两者有非常明显的对应关系,很快就会理解的。
如果我们现在创建一个文件夹“yunnan”,那么对应的包也叫作“yunnan”,两者在名称上是完全一样的。如果我们再在“yunnan”下面创建一个文件夹“lijiang”,那么就可以认为在包“yunnan”下面创建了一个包“lijiang”。我们可以将文件夹“lijiang”的路径表示为“yunnan\lijiang”(这是Windows中的表示方法,在Linux中则是“yunnan/lijiang”,分隔符不一样),对应的包则表示为“yunnan.lijiang”(分隔符是“.”,而且在任何操作系统下都这样表示)。
在命名包的时候,一般使用“组织类型名.组织名.项目名称.模块名……”这样一个格式。这个格式和访问网站时使用的URL有点像,只不过是反过来了。例如有一家公司abc,目前正在开发一个图像处理工具的项目image,设计师把这个项目拆分成若干个模块,其中一个模块用于打开图像文件,那么这个模块中的源程序所在包就会别命名为:com.abc.image.open。而且包名使用小写字母

使用包组织源文件

在源文件目录中(我这里是“D:\code\java”目录)创建一个源文件packageTest.java,代码如下:

//package语句说明包的名称,而且必须写在源程序非注释部分的第一行
//这里做了简化处理,只有单层的包,名为pack01
package pack01;
public class packageTest{
    public static void main(String[] args){
        System.out.println("我是pack01包中的程序packageTest");
    }
}

保存后,打开命令提示符工具,进入“D:\code\java”目录,然后输入命令javac -encoding utf-8 packageTest.java -d "D:\code\java"进行编译。编译完成后,当前目录下会自动创建一个目录pack01,而且编译后的字节码文件就在该目录中。
执行时,则使用命令java pack01.packageTest
如果执行java命令时,不在目录“D:\code\java”中,则可以使用命令java -classpath "D:\code\java" pack01.packageTest。其中-classpath参数用于指定类所在的起始位置,当程序执行时,就会到该路径中查找要运行的类。也可以将该路径加入到CLASSPATH环境变量中,就不需要在参数中指定了。-classpath参数和CLASSPATH环境变量所指定的都是计算机查找相应类的起始位置,所以当我们指定-classpath为"D:\code\java"后,计算机就会到这个位置找pack01.packageTest类,也就是在这个位置下面找pack01目录,再在其中找packageTest类并执行。
此外,我们注意到,这个程序源文件位于“D:\code\java”目录中,但编译后的字节码文件位于“D:\code\java\pack01”目录中。这是因为,包是针对字节码文件有效的。只要字节码文件的位置正确,程序就不会有错;源文件不参与程序执行,因此对位置没有特殊要求,但尽量存放于包中或者存放于包所在的起始位置。

导入包和类

我们的项目往往是由多个源程序组成,我们往往需要在一个类中引用其它类(或者说,在一个源程序中引用其它源程序中的代码)。有两种方法可以使用其它类,一是使用完整的包路径.类名,例如上一小节中的类就是pack01.packageTest;二是导入该类,然后就可以直接使用了。我们一般使用第二种方法。导入的语句是import 包路径.类名,例如improt pack01.packageTest;,然后我们就可以在程序中直接使用类名了。
同一个包中的类在相互引用时,不需要使用import导入;Java的标准库中java.lang中的类,也是默认导入的。
我们来看个例子。
现有三个源文件,都保存在“D:\code\java”中,但在代码中指定它们位于不同的包中,这样,字节码文件就会位于不同的包中了。第一个是Cat.java,位于包pack01中:

package pack01;
public class Cat{
    //shout方法用于表示猫的叫声
    public void shout(){
        System.out.println("喵喵喵……");
    }
}

第二个源程序是Dog.java,位于包pack02中:

package pack02;
public class Dog{
    //shout方法用于表示狗的叫声
    public void shout(){
        System.out.println("汪汪汪……");
    }
}

第三个程序是CatDogMain.java,调用前两个类,位于包pack02中:

package pack02;
//导入pack01中的Cat类,但无需导入同一个包中的Dog类
import pack01.Cat;
public  class CatDogMain{
    public static void main(String[] args){
        Cat c=new Cat();
        Dog d=new Dog();
        c.shout();
        d.shout();
    }
}

通过命令提示符,进入“D:\code\java”中,编译这三个源文件:javac -encoding utf-8 -d "d:\code\java" Cat.java CatDogMain.java Dog.java。执行时:java pack02.CatDogMain
如果源文件都在各自的包中,即Cat.java在pack01中,Dog.java和CatDogMain.java在pack02中,在命令提示符中,位于“D:\code\java”中,可以执行javac -encoding utf-8 -classpath "d:\code\java" pack02/CatDogMain.java -d .,这样在编译CatDogMain.java源文件的同时,也会编译它引用的程序源文件。执行方法和之前相同,不再赘述。

如果需要在一个包中导入所有的类,可以使用import 包路径.*;,星号表示所有的类。但一般不建议这么做,因为导入无用的类会导致程序占用更多的资源,但运行效率却不会提高。

打包

即使是简单的一个小项目,开发完毕后,也会产生几个包,几个到几十个类。大型项目则会包含数千甚至上万个类,若干个包。这就导致部署项目时需要应对大量的文件。为了解决这个问题,我们可以将整个项目所有的文件打包。因为这种包的后缀名是“jar”,所以一般习惯称之为“jar包”。
打开命令提示符,进入“D:\code\java”中,执行命令:jar cvfe cd.jar pack02.CatDogMain pack01 pack02。这个命令中,jar cvfe表示创建一个jar包,并指明主类(也就是包含主方法的类),cd.jar表示生成的jar包的名字,pack02.CatDogMain 为指定的主类,pack01 pack02为要进行打包的包。
要执行这个jar包,使用命令java -jar cd.jar即可。
当然,还有其它的方法来配置打包信息,这里不再赘述,有兴趣的同学可以自行查找并验证。

Eclipse中的操作

前面仅仅描述了手工处理包的基本方法,还有一些高级、复杂的方法没有介绍。即使如此,我们已经可以感受到——手工处理还是比较复杂的。有没有更简单的方法呢?
当然有。
主流IDE均提供了包管理的操作。这里以Eclipse为例简单介绍一下。
首先创建一个项目PackageDemo,然后展开项目,在src上点击鼠标右键,选择New–>Package,在弹出的对话框中输入包名,这里我使用cn.edu.vk.java11.package01,单击“Finish”按钮完成创建。使用同样的方法,创建另一个包cn.edu.vk.java11.package02。在包cn.edu.vk.java11.package01上点击鼠标右键,选择New–>Class,在弹出对话框中输入类名Cat,然后单击“Finish”按钮即可完成类的创建。我们会发现,除了定义类的代码,Eclipse还把package语句为我们自动添加了。我们只需要专心编写核心代码即可。
然后我们可以使用同样的方法在包cn.edu.vk.java11.package02中创建Dog.java和CatDogMain.java(创建的时候记得选中要创建主方法)两个程序。按照前面的例子编写代码。
我们在编写CatDogMain.java代码时,可以先不写import语句。这样,当我们写完后,会发现Eclipse会报错,我们把鼠标放到错误的地方(也就是带有红色下划线的地方,Cat类),会弹出一个对话框,会提示错误信息,下方还会提示修改的方案,第一条就是Import 'Cat'(cn.edu.vk.java11.package01)。单击这一项,Eclipse就会自动添加合适的import语句。
编写完毕后,我们直接运行CatDogMain.java就可以了,Eclipse会自动编译必须的源文件,并执行。
如果我们在包之间移动源文件,Eclipse也会自动帮助我们修改相关源文件中的package语句。
如果需要打包,我们可以在项目上单击鼠标右键,在弹出菜单中选择“Export”,在打开的对话框中选择Java–>Jar file,单击“Next”按钮,然后选择要打包的类,并在“JAR file”栏中填入jar的名称,如“cd.jar”,同时可以单击“Browse”按钮选择jar包的保存路径,默认是在Eclipse工作区的根目录下。设置完毕后,单击“Next”按钮,进入下一个页面后再次单击“Next”按钮,在“Main Class”中填入主类的名称,或者单击“Browse”按钮进行选择也可以。最后单击“Finish”按钮,Eclipse就会生成jar包。
进入Eclipse工作区,就会看到已经生成的cd.jar。

很显然,IDE提供了更方便地包管理功能。

04

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值