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

为什么说做网站赚钱建网站一般需要多少钱

为什么说做网站赚钱,建网站一般需要多少钱,在线电子书网站怎么做,网站建设推广熊掌号SpringBoot为什么可以打成 jar包启动 简介:庆幸的是夜跑的习惯一直都在坚持,正如现在坚持写博客一样。最开始刚接触springboot的时候就觉得很神奇,当时也去研究了一番,今晚夜跑又想起来了这茬事,于是想着应该可以记录一…

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-Class:Java 规定的 jar 包的启动类,这里设置为 spring-boot-loader 项目的 JarLauncher 类,进行 Spring Boot 应用的启动

Start-Class:Spring 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.hengruixuexiao.com/news/9155.html

相关文章:

  • 望江县住房和城乡建设局网站中小企业网站
  • 注册公司没有场地怎么办seo工资多少
  • 加快建设公司新版网站长春网站建设方案推广
  • 无锡做网络推广常德网站seo
  • 死循环网站win优化大师怎么样
  • 找外贸工作哪个网站好广告投放是什么工作
  • 网站开发教案软文广告素材
  • 对高校网站建设的期待武汉网站seo
  • flash网站规划微信营销管理软件
  • 网站超级链接深圳发布最新通告
  • 广州网站建设(信科分公司)网址缩短在线生成器
  • 百度收录自适应网站百度推广关键词价格查询
  • 自适应网站的图做多大 怎么切网站广告投放收费标准
  • 南充网站建设费用友情链接交换平台
  • dedecms做多语言的网站网络营销心得体会
  • 玄武模板网站制作报价怎样制作网页设计
  • 跨境电商在哪些网站上面做做seo网页价格
  • 独立网站与其他网站网络营销五个特点
  • 河南郑州百度网站建设收录情况有几种
  • 怀柔住房和城乡建设委官方网站可以推广赚钱的软件
  • 网站规划与开发技术郑州seo外包费用
  • 深圳产品型网站建设seo还有前景吗
  • 做豆腐交流经验的网站硬件工程师培训机构哪家好
  • 有合作做时时彩网站的吗千锋教育培训多少钱费用
  • 做电脑网站用什么软件好用做一个微信小程序需要多少钱
  • 天天斗地主官方网站开发广州搜索排名优化
  • 免费网站注册站长工具综合查询
  • 国内做批发的网站网络推广需要花多少钱
  • 微信公众号链接网站开发关键词优化公司哪家推广
  • 重庆网站备案查询系统seo建站技术