# 1. 类路径
1. AppClassLoader加载class的路径,就是classpath
2. 默认classpath是执行java 命令的路径下
1. 类可以被使用和加载必须在类路径(classpath)下,在可以被加载
# 2. jar
## 2.1 jar包结构
1.jar包元数据信息,Manifest 文件是一个元数据文件,它包含键 - 值对(英语:Attribute–value pair)数据。
2.如果一个 JAR 文件被当成可执行文件,那么其中的 Manifest 文件需要指出该程序的主类文件。通常 Manifest 文件的文件名为 `MANIFEST.MF`
![](https://img.kancloud.cn/bf/b9/bfb9b3686f33189992f1e636067a4bb8_747x343.png)
内容
```
Manifest-Version: 1.0
Implementation-Title: ad-ops-server
Implementation-Version: 0.0.1-SNAPSHOT
Start-Class: com.faw_qm.ad_ops.BPAppApplication #主类
Spring-Boot-Classes: BOOT-INF/classes/ #类存放位置
Spring-Boot-Lib: BOOT-INF/lib/ # 依赖位置
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.2.6.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.JarLauncher
```
BOOT-INF:存放了程序编译的class文件和依赖的jar包
![](https://img.kancloud.cn/2d/e7/2de7f2b572668ad7e0720474bcd97931_839x252.png)
## 2.2 自己创建一个可使用jar包
生成jar包一般用maven,也可以使用java提供的jar命令
1. 创建A和B类java文件
![](https://img.kancloud.cn/3d/3e/3d3e76db6092e2e27f79f8e8a3d1395d_792x217.png)
2. 编译
```
javac A.java B.java
```
![](https://img.kancloud.cn/4e/5b/4e5b2ae5155913975b9d7fb2a2413740_482x277.png)
3.打成jar包
```
jar cvf ab.jar A.class B.class
```
![](https://img.kancloud.cn/b1/f8/b1f86fa646cc52a5d0e78a42a63d502d_607x353.png)
4. 创建C类,使用A类
~~~
public class C {
public static void main(String[] args) {
A a = new A();
System.out.println("加载了类:" + a.getClass().getName());
}
}
~~~
![](https://img.kancloud.cn/76/2d/762da2fee887d33250eb245fc1e182ff_872x383.png)
5. 只保留jar包,并编译C测试是否可以加载jar包中的A
![](https://img.kancloud.cn/98/b0/98b01a7672f905277bf9d41dff23edbc_584x230.png)
编译报错找不到A类,把jar包放在classpath下(如果有A.class文件就可以直接加载,jar则不能)
配置环境变量
![](https://img.kancloud.cn/1e/7a/1e7a0fb6a2c394b463088b12b15a48a0_1038x357.png)
Linux
```
$ cat ~/.bash\_profile export JAVA\_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0\_281.jdk/Contents/Home export CLASSPATH=.:$JAVA\_HOME/lib/dt.jar:$JAVA\_HOME/lib/tools.jar:/Users/woniu/jartest/ab.jar export PATH=$JAVA\_HOME/bin:$PATH
```
```
D:\workspace\ad-ops\src\main\java>javac C.java
D:\workspace\ad-ops\src\main\java>
```
![](https://img.kancloud.cn/4d/fb/4dfb5fad4545421d64ce04ecdd694dd3_661x287.png)
- 计算机网络
- 基础_01
- tcp/ip
- http转https
- Let's Encrypt免费ssl证书(基于haproxy负载)
- what's the http?
- 网关
- 网络IO
- http
- 工具
- Git
- 初始本地仓库并上传
- git保存密码
- Gitflow
- maven
- 1.生命周期命令
- 聚合与继承
- 插件管理
- assembly
- 资源管理插件
- 依赖范围
- 分环境打包
- dependencyManagement
- 版本分类
- 找不到主类
- 无法加载主类
- 私服
- svn
- gradle
- 手动引入第三方jar包
- 打包exe文件
- Windows
- java
- 设计模式
- 七大原则
- 1.开闭原则
- 2. 里式替换原则
- 3. 依赖倒置原则
- 4. 单一职责原则
- 单例模式
- 工厂模式
- 简单工厂
- 工厂方法模式
- 抽象工厂模式
- 观察者模式
- 适配器模式
- 建造者模式
- 代理模式
- 适配器模式
- 命令模式
- json
- jackson
- poi
- excel
- easy-poi
- 规则
- 模板
- 合并单元格
- word
- 读取
- java基础
- 类路径与jar
- 访问控制权限
- 类加载
- 注解
- 异常处理
- String不可变
- 跨域
- transient关键字
- 二进制编码
- 泛型1
- 与或非
- final详解
- Java -jar
- 正则
- 读取jar
- map
- map计算
- hashcode计算原理
- 枚举
- 序列化
- URLClassLoader
- 环境变量和系统变量
- java高级
- java8
- 1.Lambda表达式和函数式接口
- 2.接口的默认方法和静态方法
- 3.方法引用
- 4.重复注解
- 5.类型推断
- 6.拓宽注解的应用场景
- java7-自动关闭资源机制
- 泛型
- stream
- 时区的正确理解
- StringJoiner字符串拼接
- 注解
- @RequestParam和@RequestBody的区别
- 多线程
- 概念
- 线程实现方法
- 守护线程
- 线程阻塞
- 笔试题
- 类加载
- FutureTask和Future
- 线程池
- 同步与异步
- 高效简洁的代码
- IO
- ThreadLocal
- IO
- NIO
- 图片操作
- KeyTool生成证书
- 压缩图片
- restful
- 分布式session
- app保持session
- ClassLoader.getResources 能搜索到的资源路径
- java开发规范
- jvm
- 高并发
- netty
- 多线程与多路复用
- 异步与事件驱动
- 五种IO模型
- copy on write
- code style
- 布隆过滤器
- 笔试
- 数据库
- mybatis
- mybatis与springboot整合配置
- pagehelper
- 分页数据重复问题
- Java与数据库之间映射
- 拦截器
- 拦截器应用
- jvm
- 堆内存测试
- 线程栈
- 直接内存
- 内存结构
- 内存模型
- 垃圾回收
- 调优
- 符号引用
- 运行参数
- 方法区
- 分带回收理论
- 快捷开发
- idea插件
- 注释模板
- git
- pull冲突
- push冲突
- Excel处理
- 图片处理
- 合并单元格
- easypoi
- 模板处理
- 响应式编程
- reactor
- reactor基础
- jingyan
- 规范
- 数据库