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. 第一个程序HelloWorld及常见问题解决和练习

    public class hello world{ public static void main(String[] args){ System.out.println(); } } 注意事项: 源文 ...

  2. 《DSP using MATLAB》Problem 5.35

    余弦序列的谱,原始频率w0会泄露到其它频率处. 从其它书中找到的证明过程: 代码: %% +++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  3. $trainClassLayer.find('input[name=data-item-checkbox]').eq(index).change();//激活第index+1那个checkbox

    ☆ $.each(data, function (index, org) { if (org.alreadySent) { $trainClassLayer.find('input[name=data ...

  4. LeetCode - Minimum Area Rectangle

    Given a set of points in the xy-plane, determine the minimum area of a rectangle formed from these p ...

  5. Centos7下安装部署oracle数据库方法及问题汇总

    目标:在centos7上配置oracle数据库服务器,并在win7上面使用pl/sql成功访问该oracle数据库 系统环境: 服务器:centos7 64位 客户端:win7 64位 注意cneto ...

  6. gravitee-gateway 又一个开源 apigateway

    gravitee-gateway 是Gravitee.io基于 java 开发的api gateway 功能很丰富,包含ui 界面 报警管理,访问控制管理,同时也包含一个比较完整的api 声明周期管理 ...

  7. OFIFG fault when using DCO in MSP430

    The OFIFG flag always set in my recent MSP430 smoke device project. In this A sample hardware, there ...

  8. python之路---10 *args **kwargs 命名空间 作用域 函数的嵌套

    二十八.函数进阶 1.   "*"  和  "**" ① 在形参位置时   都是聚合的作用 *args    位置参数→元组 **kwargs   关键字参数→ ...

  9. Web 单点登录(SSO) 实现模型

    有网友问起, 前后端分离 架构下的  Web 单点验证 怎么做, 我画了个图 : Temp Token  就 相当于 短信验证码 . Web 单点登录 都可以用这个 模型, 不仅仅是 前后端分离 .

  10. 上外网tunnel手段

    需要的软件 1, httptunnel软件,包括服务端和客户端,家里开启服务端,公司开启客户端 2,(可选)proxifier PE,用来在公司check 代理工作是否正常 3,动态域名服务,在家里用 ...