当前位置: 首页 > news >正文

帮做ppt网站中国建设银行个人网站

帮做ppt网站,中国建设银行个人网站,自学做包装设计的步骤,wordpress手动更新SpringBoot为什么可以打成 jar包启动 简介#xff1a;庆幸的是夜跑的习惯一直都在坚持#xff0c;正如现在坚持写博客一样。最开始刚接触springboot的时候就觉得很神奇#xff0c;当时也去研究了一番#xff0c;今晚夜跑又想起来了这茬事#xff0c;于是想着应该可以记录一…SpringBoot为什么可以打成 jar包启动 简介庆幸的是夜跑的习惯一直都在坚持正如现在坚持写博客一样。最开始刚接触springboot的时候就觉得很神奇当时也去研究了一番今晚夜跑又想起来了这茬事于是想着应该可以记录一下了不至于下次想不来了又去翻资料。 一、SpringBoot生成的jar包是什么 Spring Boot的可执行jar包又称作“fat jar”那什么是fat jar呢在java中将应用程序及其依赖jar一起打包到一个独立的jar中就叫fat jar,它也叫uberJar。springboot的打包方式就是这样将应用程序代码打包到BOOT-INF.classes将依赖包打包到BOOT-INF.lib目录这里我们以xxl-job-admin-2.4.0-SNAPSHOT.jar为例来做说明我们使用反编译工具jd将jar打开目录如下 各目录存放内容如下 BOOT-INF/classes目录存放应用编译后的class文件。 BOOT-INF/lib目录存放应用依赖的第三方JAR包文件。 META-INF目录存放应用打包信息(Maven坐标、pom文件)和MANIFEST.MF文件。 org目录存放SpringBoot相关class文件。 这里我们首先关注一下配置文件MANIFEST.MF内容如下 Manifest-Version: 1.0 Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx Archiver-Version: Plexus Archiver Built-By: user Spring-Boot-Layers-Index: BOOT-INF/layers.idx Start-Class: com.xxl.job.admin.XxlJobAdminApplication Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Spring-Boot-Version: 2.6.7 Created-By: Apache Maven 3.6.1 Build-Jdk: 1.8.0_211 Main-Class: org.springframework.boot.loader.JarLauncher 参考 Oracle 官方对该的说明 Main-ClassJava 规定的 jar 包的启动类这里设置为 spring-boot-loader 项目的 JarLauncher 类进行 Spring Boot 应用的启动 Start-ClassSpring Boot 规定的主启动类这里通过 Spring Boot Maven Plugin 插件打包时会设置为我们定义的 Application 启动类 为什么不直接将我们的 Application 启动类设置为 Main-Class 启动呢 因为通过 Spring Boot Maven Plugin 插件打包后的 jar 包我们的 .class 文件在 BOOT-INF/classes/ 目录下在 Java 默认的 jar 包加载规则下找不到我们的 Application 启动类也就需要通过 JarLauncher 启动加载。当然还有一个原因Java 规定可执行器的 jar 包禁止嵌套其它 jar 包在 BOOT-INF/lib 目录下有我们 Spring Boot 应用依赖的所有第三方 jar 包因此spring-boot-loader 项目自定义实现了 ClassLoader 实现类 LaunchedURLClassLoader支持加载 BOOT-INF/classes 目录下的 .class 文件以及 BOOT-INF/lib 目录下的 jar 包。 二、JarLauncher启动器实现原理 上文描述了Application  的Main-Clas启动类是JarLauncher 类那么接下来我们一起来看看 Spring Boot 的 JarLauncher 这个类 JarLauncher的继承关系如下 JarLauncher全路径是org.springframework.boot.loader.JarLauncher。 public class JarLauncher extends ExecutableArchiveLauncher {       private static final String DEFAULT_CLASSPATH_INDEX_LOCATION BOOT-INF/classpath.idx;       static final EntryFilter NESTED_ARCHIVE_ENTRY_FILTER (entry) - {         if (entry.isDirectory()) {             return entry.getName().equals(BOOT-INF/classes/);         }         return entry.getName().startsWith(BOOT-INF/lib/);     };       public JarLauncher() {     }       protected JarLauncher(Archive archive) {         super(archive);     }       Override     protected ClassPathIndexFile getClassPathIndex(Archive archive) throws IOException {         // Only needed for exploded archives, regular ones already have a defined order         if (archive instanceof ExplodedArchive) {             String location getClassPathIndexFileLocation(archive);             return ClassPathIndexFile.loadIfPossible(archive.getUrl(), location);         }         return super.getClassPathIndex(archive);     }       private String getClassPathIndexFileLocation(Archive archive) throws IOException {         Manifest manifest archive.getManifest();         Attributes attributes (manifest ! null) ? manifest.getMainAttributes() : null;         String location (attributes ! null) ? attributes.getValue(BOOT_CLASSPATH_INDEX_ATTRIBUTE) : null;         return (location ! null) ? location : DEFAULT_CLASSPATH_INDEX_LOCATION;     }       Override     protected boolean isPostProcessingClassPathArchives() {         return false;     }       Override     protected boolean isSearchCandidate(Archive.Entry entry) {         return entry.getName().startsWith(BOOT-INF/);     }       Override     protected boolean isNestedArchive(Archive.Entry entry) {         return NESTED_ARCHIVE_ENTRY_FILTER.matches(entry);     }       public static void main(String[] args) throws Exception {         new JarLauncher().launch(args);     }   } 通过new一个JarLauncher().launch(args)方式进行启动。 public class Jarlauncher{     ...     private static final String JAR_MODE_LAUNCHER org.springframework.boot.loader.jarmode.JarModeLauncher;       ...     protected void launch(String[] args) throws Exception {         //判断是否以一个分解模式的方式运行如果是则运行否则只支持规范的jar文件从而选择跳过         if (!isExploded()) {             JarFile.registerUrlProtocolHandler();         }         //获取类加载器         ClassLoader classLoader createClassLoader(getClassPathArchivesIterator());         //获取系统中的jar模型         String jarMode System.getProperty(jarmode);         //加载启动引导类         String launchClass (jarMode ! null !jarMode.isEmpty()) ? JAR_MODE_LAUNCHER :                      getMainClass();         //启动应用         launch(args, launchClass, classLoader);     } }
http://www.hkea.cn/news/14284698/

相关文章:

  • 做加盟网站赚钱吗做网站十大公司哪家好
  • 石家庄建设集团网站seo服务器优化
  • 企业网站一般多少钱福州搜索优化公司
  • 深圳企业高端网站建设源代码网站开发
  • 怎么介绍自己做的静态网站网站设计公司如何盈利
  • 如何网站网站做代理点击一个网站跳转到图片怎么做的
  • 360企业网站认证如何做网站的映射
  • 深圳市外贸网站建设网站建设与推广公司
  • 旅游景点网站建设方案wordpress 兼容性
  • 坪山住房及建设局网站公司装修费用会计分录
  • 做付费软件网站长春做网站长春网站设计
  • 导航网站优化网站建设服务好公司
  • 天门网站定制开源做网站需要申请账号吗
  • 做和别人类似的网站侵权吗龙岗企业网站设计公司
  • 商会网站设计大连个人网站开发制作
  • 网站文章推广交互式网站开发技术
  • 一个电信ip做网站卡不卡绍兴高兴区建设网站
  • 十堰城市建设网站怎么做网页签到
  • 千秋网站建设公司关联词有哪些关系
  • 做百度手机网站优临港注册公司优惠政策
  • 网站怎么进行网络推广形象类网站
  • app网站开发学习温州做网站老师
  • 安徽建网站公司突发 佛山出大事
  • 要解析做邮箱以及网站牡丹江到林口火车时刻表
  • 网站标签是什么长沙做网站建设公司
  • 网站 外包合同企业网站建设和管理
  • 长业建设网站制作ppt用什么软件好
  • 沧州网站推广优化wordpress 中国
  • 用旧技术做网站能过毕设么知乎一米八效果图网站
  • 织梦做博客类网站简述企业网站建设的目的有哪些