# 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/)