# DemoClasspassIndex
**Repository Path**: penghaoyou/DemoClasspassIndex
## Basic Information
- **Project Name**: DemoClasspassIndex
- **Description**: 测试jar的加载顺序
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-09-24
- **Last Updated**: 2022-09-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# DemoClasspassIndex
#### 介绍
测试jar的加载顺序 classpath.idx
同时根据中间做知道了 java -classpath= 时 其中的顺序是java加载jar包的顺序
DemoMain为主模块, Demo1、Demo2的子模块中都包含类 org.demochild.DemoChildClass
其中 Demo1 中的类调用时 会打印 "demo1"
Demo2中的类调用时会打印 "demo2"
看最终DemoMain大成的jar包中的classpath.idx对同类名类加载顺序的影响
可执行的shell脚本
```shell
java -jar DemoMain-1.0-SNAPSHOT.jar
执行结果为
bj-guoxiaopeng:target penghaoyou$ java -jar DemoMain-1.0-SNAPSHOT.jar
Hello World! App
demo1
demo1 == App print ==
解压替换 classpath.idx中的 文件 然后重新打包
tar -zxvf DemoMain-1.0-SNAPSHOT.jar
更改 BOOT-INF/classpath.idx 看下一个模块
打包更改后的文件 (要用jar命令打包 用tar命令打包失败)
jar -cvfM0 project.jar ./BOOT-INF/ ./META-INF/ ./org/
看执行结果
bj-guoxiaopeng:target penghaoyou$ java -jar project.jar
Hello World! App
demo2
demo2 == App print ==
到此说明了打包关系
```
打包命令的网址与说明为
```text
http://www.highersoft.net/mobile/detailnotice_mobile.jsp?id=529
1.解压包
unzip project.jar -d project
2.打包
jar -cvfM0 project.jar ./
```
刚开始打开 BOOT-INF/classpath.idx 的内容为
```text
- "BOOT-INF/lib/Demo1-1.0-SNAPSHOT.jar"
- "BOOT-INF/lib/Demo2-1.0-SNAPSHOT.jar"
- "BOOT-INF/lib/spring-boot-autoconfigure-2.6.7.jar"
- "BOOT-INF/lib/spring-boot-2.4.5.jar"
- "BOOT-INF/lib/spring-core-5.3.6.jar"
- "BOOT-INF/lib/spring-jcl-5.3.6.jar"
- "BOOT-INF/lib/spring-context-5.3.6.jar"
- "BOOT-INF/lib/spring-aop-5.3.6.jar"
- "BOOT-INF/lib/spring-beans-5.3.6.jar"
- "BOOT-INF/lib/spring-expression-5.3.6.jar"
- "BOOT-INF/lib/spring-boot-jarmode-layertools-2.4.5.jar"
```
更改内容主要是更换 Demo1 与 Demo2 的jar包顺序
更改后的 BOOT-INF/classpath.idx 的内容为
```text
- "BOOT-INF/lib/Demo2-1.0-SNAPSHOT.jar"
- "BOOT-INF/lib/Demo1-1.0-SNAPSHOT.jar"
- "BOOT-INF/lib/spring-boot-autoconfigure-2.6.7.jar"
- "BOOT-INF/lib/spring-boot-2.4.5.jar"
- "BOOT-INF/lib/spring-core-5.3.6.jar"
- "BOOT-INF/lib/spring-jcl-5.3.6.jar"
- "BOOT-INF/lib/spring-context-5.3.6.jar"
- "BOOT-INF/lib/spring-aop-5.3.6.jar"
- "BOOT-INF/lib/spring-beans-5.3.6.jar"
- "BOOT-INF/lib/spring-expression-5.3.6.jar"
- "BOOT-INF/lib/spring-boot-jarmode-layertools-2.4.5.jar"
```
然后重新打包
#### 程序学到的关于打包可执行类的知识。
用以下配置打包的时候 (只有父模块的xml是这个配置, 其他子模块没有这个配置)
```xml
org.springframework.boot
spring-boot-maven-plugin
```
执行DemoMain 的时候提示
```
bj-guoxiaopeng:target penghaoyou$ java -jar DemoMain-1.0-SNAPSHOT.jar
Hello World! App
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Caused by: java.lang.NoClassDefFoundError: org/demochild/DemoChildClass
at org.example.App.main(App.java:16)
... 8 more
Caused by: java.lang.ClassNotFoundException: org.demochild.DemoChildClass
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 9 more
```
但是本地运行正常,
######================
后来百度更改xml配置最后导出的包 可以java -jar 正常执行
打包更改配置如下
Demo1、Demo2 的 pom.xml中增加如下 表示被依赖的模块 生成普通jar包而不是可执行jar包
[链接为](https://blog.51cto.com/u_15091061/2950780)
```xml
org.springframework.boot
spring-boot-maven-plugin
exec
```
#### 软件架构
软件架构说明
#### 安装教程
1. xxxx
2. xxxx
3. xxxx
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)