1.classpath

1.1classpath定义

  • classpath是一个环境变量
  • classpath指示JVM如何搜索class
  • classpath设置的搜索路径与操作系统相关

    * window使用分号分割的,Mac、Linux使用冒号分割的

    • C:\work\project1\bin;C:\shared;"D:\My Document\project2\bin"
    • /usr/shared:/usr/local/bin:/home/csj/bin

1.2classpath用途

假设classpath是 .;C:\work\project1\bin;C:\shared

jvm在加载com.feiyangedu.Main这个类时,依次查找:

当前目录\com\feiyangedu\Hello.class

C:\work\project1\bin\com\feiyangedu\Hello.class

C:\shared\com\feiyangedu\Hello.class

  • 在某个路径下找到了,就不再继续搜索
  • 如果没有找到,报错

1.3classpath的设定方法

  • 直接在系统变量中设置classpath环境变量(不推荐)
  • 在启动JVM时设置classpath变量(推荐)
java -classpath C:\work\bin;C:\shared com.feiyangedu.Hello
java -cp C:\work\bin;C:\shared com.feiyangedu.Hello
  • 没有设置环境变量,也没有设置-cp参数,默认当前目录为classpath
  • 在eclipse中运行Java程序,eclipse自动传入的-cp参数是当前工程的bin目录和引入的.jar

2.jar包

2.1jar包的组成

  • jar包是zip格式的压缩文件,包含若干.class文件
  • jar包相当于目录
  • classpath可以包含jar文件: C:\work\bin\all.jar
  • com.feiyangedu.Hello类将在classpath给予的目录中搜索com/feiyangedu/Hello.class
  • 使用jar包可以避免大量的目录和.class文件

2.2jar包的创建

  • 使用jdk自带的jar命令
  • 使用构建工具如maven等
  • 直接压缩

2.3jar包的其他功能

2.4jdk的class

  • jvm运行时会自动加载jdk自带的class
  • jdk自带的class被打包在rt.jar
  • 不需要在classpath中引用rt.jar

3.实例

Hello.java

package com.feiyang;
public class Hello {
private final String name;
public Hello(String name){
this.name = name;
}
public String hello(){
return "Hello, " + name + "!";
}
}

Main.java

package com.feiyang;
public class Main {
public static void main(String[] args){
Hello h = new Hello("World");
System.out.println(h.hello());
}
}

3.1指定运行文件

运行Main文件,生成class文件。将class所在目录压缩为jar包

以IDEA为例,class文件在其项目路径下的target/classes里

cd target/classes/
zip -q -r test.jar *
java -cp test.jar com.feiyang.Main


## 3.2直接运行jar包
新建META-INF/MANIFEST.MF文件,重新执行main文件,在classes目录下会生成META_INF文件,将classes下的所有文件打包
```#xml
Manifest-Version: 1.0
Main-Class: com.feiyang.Main
X-Copyright: blablabla
X-Build-Version: 1.0
```
```#shell
zip -q -r main.jar *
java -jar main.jar

<img src="https://img2018.cnblogs.com/blog/1418970/201901/1418970-20190118190321398-60545465.png" width="500" />

#    4.总结:
* JVM通过环境变量classpath决定搜索class的路径和顺序
* 不推荐设置系统环境变量classpath,始终建议通过-cp命令传入
* jar包相当于目录,可以包含很多class文件,方便下载和使用
* META-INF/MANIFEST.MF可以提供jar包的信息,如Main.Class
* 不需要在classpath中引用包含Java核心类的rt.jar

廖雪峰Java2面向对象编程-5包和classpath-4classpath和jar的更多相关文章

  1. 廖雪峰Java2面向对象编程-5包和classpath-3作用域

    1.访问权限 Java的类.接口.字段和方法都可以设置访问权限 访问权限是指在一个类的内部,能否引用另一个类以及访问它的字段和方法 访问权限有public.protected.private和pack ...

  2. 廖雪峰Java2面向对象编程-5包和classpath-1包package

    1.package的意义 如下,存在多个相同类名的文件.当引用Person类,将无法确定引用小红,还是小明的Person类,即同名类的冲突. 小明的Person类:Person 小红的Person类: ...

  3. 廖雪峰Java2面向对象编程-5包和classpath-1静态字段和方法

    1.静态字段 1.1定义:用static修饰的字段称为静态字段 普通字段在每个实例中都有自己的一个独立的空间 静态字段只有1个共享空间,所有实例都共享该字段. public class Person{ ...

  4. 廖雪峰Java2面向对象编程-3继承和多态-1继承

    1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通 ...

  5. 廖雪峰Java2面向对象编程-1面向对象-1面向对象基础

    1.对象的概念 面向对象编程:Object-Oriented Programming 对现实世界建立计算机模型的一种编程方法. 现实世界 计算机模型 Java代码 人 类/class class Pe ...

  6. 廖雪峰Java2面向对象编程-4抽象类和接口-2接口

    1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ...

  7. 廖雪峰Java2面向对象编程-4抽象类和接口-1抽象类

    每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方 ...

  8. 廖雪峰Java2面向对象编程-6Java核心类-6常用工具类

    1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数 ...

  9. 廖雪峰Java2面向对象编程-6Java核心类-5枚举类

    直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON ...

随机推荐

  1. 第一天 hello world

    二进制编译工具生成img软盘执行文件 二进制编译工具https://pan.baidu.com/s/1j3wAsFxTLWv17V55iNKJJw 利用Bz.exe工具写操作系统自启程序: 前0000 ...

  2. 高斯消元 o(n^3) 取摸和不取摸

    #include<bits/stdc++.h> using namespace std; ; int a[MAXN][MAXN];//增广矩阵 int x[MAXN];//解集 bool ...

  3. 欧拉函数  已经优化到o(n)

    欧拉函数 ψ(x)=x*(1-1/pi)  pi为x的质数因子 特殊性质(图片内容就是图片后面的文字) 欧拉函数是积性函数——若m,n互质, ψ(m*n)=ψ(m)*ψ(n): 当n为奇数时,   ψ ...

  4. vue的理解

    vue提供的MVVM框架模式的数据双向绑定,实现了HTML和js的代码分离,提高代码的维护性 vue.js的核心思想包括:数据驱动和组件化思想. 如果没有中间的ViewModel则关系图编程下面所示: ...

  5. 《DSP using MATLAB》Problem 5.15

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  6. 【HAOI2016】放旗子

    终于自己推出来一道题了quq然而时间有点久,考场上并不大丈夫……原题: 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍 ...

  7. Gravitational Teleport 开源的通过ssh && kubernetes api 管理linux 服务器集群的网关

    Gravitational Teleport 是一个开源的通过ssh && kubernetes api 管理linux 服务器集群的网关 支持以下功能: 基于证书的身份认证 ssh ...

  8. Pycharm主题设置以及导入方式

    主题下载链接: http://www.themesmap.com/ pycharm -- 导入主题(theme) and 修改背景颜色(护眼色)   前情提要 众所周知,随着python语言的不断流行 ...

  9. Java单播、广播、多播(组播)---转

    一.通信方式分类 在当前的网络通信中有三种通信模式:单播.广播和多播(组播),其中多播出现时间最晚,同时具备单播和广播的优点. 单播:单台主机与单台主机之间的通信 广播:当台主机与网络中的所有主机通信 ...

  10. js将foo-bar转为fooBar

    这是一道js的面试题,就是考察将普通面命转为小驼峰命名 <!DOCTYPE html> <html lang="en"> <head> < ...