千家信息网

如何用源码分析Compile

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,如何用源码分析Compile,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。bin/compile入口是:bin/compile,该脚
千家信息网最后更新 2026年11月01日如何用源码分析Compile

如何用源码分析Compile,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

bin/compile

入口是:bin/compile,该脚本和detect脚本很类似:需要一个构建目录实例化buildpack对象,并调用其compile接口。

注意:在这个脚本看似只有一个参数,但运行时实际需要第二个参数:应用缓存目录,当下载JDK,

compile方法

compilempilecompile先调用component_detection,探测了对容器,JRE,framework的支持情况,并依次调用JRE的编译,每个框架的编译,和容器的编译。

Ruby代码

  1. def compile

  2. puts BUILDPACK_MESSAGE % @buildpack_version

  3. container = component_detection('container', @containers, true).first

  4. fail 'No container can run this application' unless container

  5. component_detection('JRE', @jres, true).first.compile

  6. component_detection('framework', @frameworks, false).each(&:compile) #调用每一个框架的编译

  7. container.compile

  8. end

component_detection返回的是component,如JRE的component_detection返回的是JavaBuildpack::Jre::OpenJdkJRE。

JRE的编译

JRE编译调用的是JavaBuildpack::Jre::OpenJdkJRE的compile,而JavaBuildpack::Jre::OpenJdkJRE又是继承自OpenJDKLike,因此追溯到OpenJDKLike的compile

Ruby代码

  1. def compile

  2. download_tar

  3. @droplet.copy_resources

  4. end

可以看到编译就干了两件事:

下载Jdk的包,拷贝resources,即:拷贝resources/open_jdk_jre下面的文件

Tomcat的编译

容器的编译调用了JavaBuildpack::Container::Tomcat的compile,方法是定义在其父类:JavaBuildpack::Component::ModularComponent

Java代码

  1. def compile

  2. @sub_components.each(&:compile)

  3. end

即调用其子组件的编译,子组件包括:TomcatInstance,TomcatLifecycleSupport,TomcatLoggingSupport,TomcatAccessLoggingSupport,TomcatRedisStore,TomcatInsightSupport。

TomcatInstance的compile方法

该compile方法完成了三件事:

1. 下载tomcat的包;

2. 在tomcat的webapps/WEB-INF/ROOT中链接用户应用根目录;

3. 链接jar包到WEB-INF/lib

Ruby代码

  1. def compile

  2. download(@version, @uri) { |file| expand file }

  3. link_to(@application.root.children, root)

  4. @droplet.additional_libraries << tomcat_datasource_jar if tomcat_datasource_jar.exist? # 追加数组的意思

  5. @droplet.additional_libraries.link_to web_inf_lib

  6. end

TomcatLifecycleSupport的compile方法

该方法只是下载了tomcat_lifecycle_support的jar包

Ruby代码

  1. def compile

  2. download_jar(jar_name, tomcat_lib)

  3. end

TomcatLoggingSupport,TomcatAccessLoggingSupport的compile方法都只是下载了相应的jar包

TomcatRedisStore的compile方法

先检查了是否需要redis做session共享中间件,接着下载了redis_store.jar包,并修改tomcat的conf/context.xml配置

Ruby代码

  1. def compile

  2. return unless supports?

  3. download_jar(jar_name, tomcat_lib)

  4. mutate_context

  5. end

从源码来看,compile并非是编译java的源代码,而是准备应用运行的环境。

关于如何用源码分析Compile问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

编译 方法 代码 源码 分析 容器 脚本 问题 应用 参数 只是 拷贝 更多 框架 目录 组件 链接 帮助 解答 运行 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海挚品互联网科技有限公司 小米移动互联网科技园 保险科技 互联网保险 蓝思科技飞鸽互联网 互联网科技公司华为 金融科技创新监管互联网金融 小马过河互联网科技 互联网科技缩写 互联网科技公司名称 滨湖区互联网智能科技产品供应 互联网企业和科技型企业 湖北码尼互联网科技有限公司电话 青海科技产业互联网发展 互联网科技人工智能实验室 互联网金融科技元年 亚光科技低轨卫星互联网 承德科技产业互联网平台 广东猫王互联网科技有限公司电话 瑞安市蟠桃会互联网科技有限公司 互联网科技创业有什么好项目 深圳九邦互联网科技有限公司 互联网是不是新科技 互联网的科技创新 紫鲸互联网科技 新浪科技互联网 成都仁贤领冠互联网科技有限公司 互联网科技商业 云鲸互联网络科技有限公司 优雇互联网科技有限公司 株洲百竞科技的互联网营销顾问
0