java package(包)的用法

一般来说都用eclipse自动化图形工具搞定,我用的是ubuntu,所以需要自己打包引入。

什么是包?

这是对java源代码的组织和管理的一种方式,比如:当操作系统某个目录的文件非常多的时候,我们一般建立子目录分类管理,java中的包跟文件目录的作用类似。

1,声明一个包,用package,放在文件的第一行,如:

package com.ghostwu.HelloWorld;

public class HelloWorld{
    public static void main( String[] args ){
        System.out.println( "hello world" );
    }
}

当,源代码中声明了一个包的时候,在编译的时候,需要这样做:【javac -d . HelloWorld.java】, -d: 后面指定编译生成的class文件存放的目录,

这里面的点(.)指的是当前目录。

ghostwu@dev:~/java/data_struct/package$ ls
com  ghostwu.jar  HelloWorld.java  Student.java  Test2.java  Test.java
ghostwu@dev:~/java/data_struct/package$ rm -rf com ghostwu.jar
ghostwu@dev:~/java/data_struct/package$ ls
HelloWorld.java  Student.java  Test2.java  Test.java
ghostwu@dev:~/java/data_struct/package$ javac -d . HelloWorld.java
ghostwu@dev:~/java/data_struct/package$ ls
com  HelloWorld.java  Student.java  Test2.java  Test.java
ghostwu@dev:~/java/data_struct/package$ tree com
com
└── ghostwu
    └── HelloWorld
        └── HelloWorld.class

2 directories, 1 file

我们也可以换个路径,如:我把它编译到~/tmp目录下

ghostwu@dev:~/java/data_struct/package$ ls ~/tmp
allpy.tar.gz
ghostwu@dev:~/java/data_struct/package$ javac -d ~/tmp HelloWorld.java
ghostwu@dev:~/java/data_struct/package$ ls ~/tmp
allpy.tar.gz  com
ghostwu@dev:~/java/data_struct/package$ tree ~/tmp/com
/home/ghostwu/tmp/com
└── ghostwu
    └── HelloWorld
        └── HelloWorld.class

2 directories, 1 file

2,接下来,我们定义两个类,来使用包

ghostwu@dev:~/java/data_struct/package$ cat Student.java
package com.ghostwu.Student;

public class Student {
    public void say(){
        System.out.println( "my name is ghostwu" );
    }
}
ghostwu@dev:~/java/data_struct/package$ cat Test.java
package com.ghostwu.Test;

public class Test {
    public static void main( String[] args ){
        com.ghostwu.Student.Student stu = new com.ghostwu.Student.Student();
        stu.say();
    }
}

在Test类中,如果需要使用Student类,需要使用 包名.类名( com.ghostwu.Student.Student )

ghostwu@dev:~/java/data_struct/package$ tree com
com
└── ghostwu
    └── HelloWorld
        └── HelloWorld.class

2 directories, 1 file
ghostwu@dev:~/java/data_struct/package$ ls
com  HelloWorld.java  Student.java  Test2.java  Test.java
ghostwu@dev:~/java/data_struct/package$ javac -d . Student.java
ghostwu@dev:~/java/data_struct/package$ javac Test.java
ghostwu@dev:~/java/data_struct/package$ java Test
Error: Could not find or load main class Test

在上面,编译使用的过程中,我们发现,直接执行java test报了一个错误。这是因为我们Test也有声明包( com.ghostwu.Test ),所以,我们应该这样执行:

ghostwu@dev:~/java/data_struct/package$ tree com
com
└── ghostwu
    ├── HelloWorld
    │   └── HelloWorld.class
    └── Student
        └── Student.class

3 directories, 2 files
ghostwu@dev:~/java/data_struct/package$ javac -d . Test.java
ghostwu@dev:~/java/data_struct/package$ java Test
Error: Could not find or load main class Test
ghostwu@dev:~/java/data_struct/package$ java com.ghostwu.Test.Test
my name is ghostwu

执行格式:【java 包名+类名】

3,你可能已经发现了,这种方式非常麻烦,在使用包,每次实例化都要new xxx(包名) = xxx(包名) …. ,我们可以通过import关键字,引入包,就不需要每次加上包前缀了。

ghostwu@dev:~/java/data_struct/package$ cat Test2.java
package com.ghostwu.Test2;
import com.ghostwu.Student.Student;

public class Test2 {
    public static void main( String[] args ){
        Student stu = new Student();
        stu.say();
    }
}
ghostwu@dev:~/java/data_struct/package$ tree com
com
└── ghostwu
    ├── HelloWorld
    │   └── HelloWorld.class
    ├── Student
    │   └── Student.class
    └── Test
        └── Test.class

4 directories, 3 files
ghostwu@dev:~/java/data_struct/package$ javac -d . Test2.java
ghostwu@dev:~/java/data_struct/package$ java Test2
Error: Could not find or load main class Test2
ghostwu@dev:~/java/data_struct/package$ java com.ghostwu.Test2.Test2
my name is ghostwu

4,把所有的class打包成一个jar文件,称之为jar包,比如,我们把当前目录下的所有class文件,打成一个jar包,可以给别人使用了

【jar cvf ghostwu.jar com】 把com目录下的所有文件 打包成一个jar文件, c:创建jar文件 v:生产详细信息 f:指定jar包的名称

ghostwu@dev:~/java/data_struct/package$ tree com
com
└── ghostwu
    ├── HelloWorld
    │   └── HelloWorld.class
    ├── Student
    │   └── Student.class
    ├── Test
    │   └── Test.class
    └── Test2
        └── Test2.class

5 directories, 4 files
ghostwu@dev:~/java/data_struct/package$ ls
com  HelloWorld.java  Student.java  Test2.java  Test.class  Test.java
ghostwu@dev:~/java/data_struct/package$ jar cvf ghostwu.jar com
added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/ghostwu/(in = 0) (out= 0)(stored 0%)
adding: com/ghostwu/HelloWorld/(in = 0) (out= 0)(stored 0%)
adding: com/ghostwu/HelloWorld/HelloWorld.class(in = 448) (out= 302)(deflated 32%)
adding: com/ghostwu/Test2/(in = 0) (out= 0)(stored 0%)
adding: com/ghostwu/Test2/Test2.class(in = 347) (out= 254)(deflated 26%)
adding: com/ghostwu/Student/(in = 0) (out= 0)(stored 0%)
adding: com/ghostwu/Student/Student.class(in = 420) (out= 293)(deflated 30%)
adding: com/ghostwu/Test/(in = 0) (out= 0)(stored 0%)
adding: com/ghostwu/Test/Test.class(in = 344) (out= 255)(deflated 25%)
ghostwu@dev:~/java/data_struct/package$ ls
com          HelloWorld.java  Test2.java  Test.java
ghostwu.jar  Student.java     Test.class

java package(包)的用法

5,执行jar包的时候,发现报错了

ghostwu@dev:~/java/data_struct/package$ java -jar ghostwu.jar
no main manifest attribute, in ghostwu.jar

我们需要在ghostwu.jar包中,配置一个入口类

java package(包)的用法

java package(包)的用法

再次执行,就可以了

ghostwu@dev:~/java/data_struct/package$ java -jar ghostwu.jar
my name is ghostwu

6,解压jar包【jar -xvf ghostwu.jar 】

ghostwu@dev:~/java/data_struct/package$ ls
com          HelloWorld.java  Test2.java  Test.java
ghostwu.jar  Student.java     Test.class
ghostwu@dev:~/java/data_struct/package$ rm -rf com
ghostwu@dev:~/java/data_struct/package$ ls
ghostwu.jar  HelloWorld.java  Student.java  Test2.java  Test.class  Test.java
ghostwu@dev:~/java/data_struct/package$ jar -xvf ghostwu.jar
  created: META-INF/
 inflated: META-INF/MANIFEST.MF
  created: com/
  created: com/ghostwu/
  created: com/ghostwu/HelloWorld/
 inflated: com/ghostwu/HelloWorld/HelloWorld.class
  created: com/ghostwu/Test2/
 inflated: com/ghostwu/Test2/Test2.class
  created: com/ghostwu/Student/
 inflated: com/ghostwu/Student/Student.class
  created: com/ghostwu/Test/
 inflated: com/ghostwu/Test/Test.class
ghostwu@dev:~/java/data_struct/package$ ls
com          HelloWorld.java  Student.java  Test.class
ghostwu.jar  META-INF         Test2.java    Test.java
ghostwu@dev:~/java/data_struct/package$ tree com
com
└── ghostwu
    ├── HelloWorld
    │   └── HelloWorld.class
    ├── Student
    │   └── Student.class
    ├── Test
    │   └── Test.class
    └── Test2
        └── Test2.class

5 directories, 4 files

Original: https://www.cnblogs.com/ghostwu/p/9276517.html
Author: ghostwu
Title: java package(包)的用法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/537337/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring Boot 整合 MyBatis

    MyBatis 简介 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的…

    Java 2023年6月9日
    076
  • Spring 是怎么处理循环依赖的?

    Java语法中的循环依赖 首先看一个使用构造函数的循环依赖,如下: public class ObjectA { private ObjectB b; public ObjectA…

    Java 2023年6月8日
    078
  • Spring系列15:Environment抽象

    本文内容 Environment抽象的2个重要概念 @Profile 的使用 @PropertySource 的使用 Environment抽象的2个重要概念 Environmen…

    Java 2023年6月5日
    0133
  • 逻辑存储单元

    dbspace dbspace是一个或者多&am…

    Java 2023年6月9日
    0108
  • java Swing 进度条

    java Swing 进度条 1 package io.guanghe; 2 3 import javax.swing.*; 4 5 /* 6 ProgressMonitor&#x…

    Java 2023年5月29日
    095
  • 好书推荐之《码出高效》、《阿里巴巴JAVA开发手册》

    好评如潮 《阿里巴巴Java开发手册》 简介 《阿里巴巴Java开发手册》的愿景是码出高效,码出质量。它结合作者的开发经验和架构历程,提炼阿里巴巴集团技术团队的集体编程经验和软件设…

    Java 2023年6月15日
    095
  • Android自定义控件1

    概述 Android已经为我们提供了大量的View供我们使用,但是可能有时候这些组件不能满足我们的需求,这时候就需要自定义控件了。自定义控件对于初学者总是感觉是一种复杂的技术。因为…

    Java 2023年6月13日
    0103
  • dubbo+spring_maven 遇到的问题 Error creating bean with name ‘***’: Instantiation of bean failed;

    java;gutter:true;Exception in thread “main” org.springframework.beans.factory.BeanCreation…

    Java 2023年5月29日
    091
  • 反射、反射机制、类加载、Class类专题复习

    一、反射概念 1.反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息(比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。反射在设计模式和框架…

    Java 2023年6月8日
    094
  • Guava Cache源码浅析

    简介 Guava Cache是指在JVM的内存中缓存数据,相比较于传统的数据库或redis存储,访问内存中的数据会更加高效,无网络开销。 根据Guava官网介绍,下面的这几种情况可…

    Java 2023年6月6日
    067
  • Java开发学习(十三)—-基于注解开发定义第三方bean及注解开发总结

    在前面的博客中定义bean的时候都是在自己开发的类上面写个注解就完成了,但如果是第三方的类,这些类都是在jar包中,我们没有办法在类上面添加注解,这个时候该怎么办? 遇到上述问题,…

    Java 2023年5月29日
    077
  • 每日一考-9.15

    wait和sleep的区别 简说:wait释放🔒,sleep不释放🔒 例子:买票过程中,当程序进行上锁后 sleep控制下的线程,买票是一一完成,当程序休眠后,sleep不会释放🔒…

    Java 2023年6月16日
    073
  • 【JavaWeb-jQuery】笔记(2)— jQuery 函数精讲

    第一组函数: 1、val: 操作 DOM 数组中的对象的 value 属性 $(选择器).val();//&amp…

    Java 2023年6月8日
    095
  • WebSocket 服务端未启动时,客户端重连报错

    当WebSocket服务端未启动时,我们在客户端申请连接,会报 System.Net.Sockets.SocketException 异常。 当然,我们调试时异常设置默认是不勾选这…

    Java 2023年5月30日
    075
  • 记一次@Validated分组校验不生效问题

    原因 如果做了异常捕获,在方法入参中添加了BindingResult会导致失效,具体原因不再细查,这一块浪费了我不少时间 踩坑过程 使用@Validated直接全部校验通过,@Va…

    Java 2023年6月9日
    090
  • 多线程基础篇

    基本概念 (程序,进程,线程) 线程的创建和使用 线程的生命周期 线程的同步 线程的通信 JDK5.0新增线程创建方式 程序 (prog…

    Java 2023年6月6日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球