廖雪峰Java2面向对象编程-5包和classpath-4classpath和jar
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包的其他功能
- jar包可以包含一个特殊的/META-INF/MANIFEST.MF文件
- MANIFEST.MF是纯文本,可以指定Main-Class和其他信息
- jar包还可以包含其他jar包
- 了解更多,搜索oracle Java manifest
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的更多相关文章
- 廖雪峰Java2面向对象编程-5包和classpath-3作用域
1.访问权限 Java的类.接口.字段和方法都可以设置访问权限 访问权限是指在一个类的内部,能否引用另一个类以及访问它的字段和方法 访问权限有public.protected.private和pack ...
- 廖雪峰Java2面向对象编程-5包和classpath-1包package
1.package的意义 如下,存在多个相同类名的文件.当引用Person类,将无法确定引用小红,还是小明的Person类,即同名类的冲突. 小明的Person类:Person 小红的Person类: ...
- 廖雪峰Java2面向对象编程-5包和classpath-1静态字段和方法
1.静态字段 1.1定义:用static修饰的字段称为静态字段 普通字段在每个实例中都有自己的一个独立的空间 静态字段只有1个共享空间,所有实例都共享该字段. public class Person{ ...
- 廖雪峰Java2面向对象编程-3继承和多态-1继承
1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通 ...
- 廖雪峰Java2面向对象编程-1面向对象-1面向对象基础
1.对象的概念 面向对象编程:Object-Oriented Programming 对现实世界建立计算机模型的一种编程方法. 现实世界 计算机模型 Java代码 人 类/class class Pe ...
- 廖雪峰Java2面向对象编程-4抽象类和接口-2接口
1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ...
- 廖雪峰Java2面向对象编程-4抽象类和接口-1抽象类
每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方 ...
- 廖雪峰Java2面向对象编程-6Java核心类-6常用工具类
1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数 ...
- 廖雪峰Java2面向对象编程-6Java核心类-5枚举类
直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON ...
随机推荐
- 【MAC】常用方法-持续更新
1.Homebrew安装 删除brew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma ...
- js动态加载数据并合并单元格
js动态加载数据合并单元格, 代码如下所示,可复制直接运行: <!DOCTYPE HTML> <html lang="en-US"> <head> ...
- 日志分析-mime统计
提取日志中未落入标准字段的mime,分adx,adtype 统计mime的数量和包含js的数量占比 require 'date' require 'net/http' require 'uri' re ...
- 世界各个地区WIFI 2.4G及5G信道划分表(附无线通信频率分配表)
参考:https://blog.csdn.net/dxpqxb/article/details/80969760 目前主流的无线WIFI网络设备802.11a/b/g/n/ac: 传统 802.11 ...
- lua-resty-qless-web UI 界面运行
lua-resty-qless-web 是 lua-resty-qless 的web 管理界面以及lua-resty-template 模版引擎开发的,里面实现了一个简单的 路由功能 备注: demo ...
- 01Hadoop简介
Hadoop思想之源:Google 面对的数据和计算难题 ——大量的网页怎么存储 ——搜索算法 带给我们的关键技术和思想(Google三篇论文) ——GFS(hdfs) ——Map-Reduce —— ...
- Unity3D中常用的数据结构 学习
Array 1.数组存储在连续的内存上. 2.数组的元素都是相同类型或者类型的衍生类型 3.数组可以直接通过下标访问 ArrayList 1.不必在声明ArrayList时指定它的长度,这是由于Arr ...
- 机器学习 - 开发环境安装pycharm + tensorflow集成篇
继续上篇的pyspark集成后,我们再来看看当今热的不得了的tensorflow是如何继承进pycharm环境的 参考: http://blog.csdn.net/include1224/articl ...
- APP前端易用性和UI测试
移动APP使用场景的特点 1.屏幕小: 与Web系统相比,APP安装在手机端,展示屏幕只有几英寸,能够展示的信息就显得非常有限和珍贵,我们需要将有价值的信息放大,放在显眼的位置. 2.场景复杂化: 由 ...
- docker 运行java程序时区问题
如果 docker 上面 java 的当前时间比,真实时间慢了8 小时,那估计就是时区问题了, 需要在 打包docker镜像的时候 带上 localtime 和 timezone.(这2 个文件 ...