千家信息网

如何进行源码分析Detect

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇文章给大家分享的是有关如何进行源码分析Detect ,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Detect该buildpack的
千家信息网最后更新 2026年11月03日如何进行源码分析Detect

本篇文章给大家分享的是有关如何进行源码分析Detect ,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Detect

该buildpack的探测的内容包含:容器,JRE,框架。具体内容在components.yml中可以看到:

# Configuration for components to use in the buildpack---containers:- "JavaBuildpack::Container::DistZip"- "JavaBuildpack::Container::Groovy"- "JavaBuildpack::Container::JavaMain"- "JavaBuildpack::Container::PlayFramework"- "JavaBuildpack::Container::Ratpack"- "JavaBuildpack::Container::SpringBoot"- "JavaBuildpack::Container::SpringBootCLI"- "JavaBuildpack::Container::Tomcat"# In order to use Oracle JREs instead of OpenJDK, you must comment out the OpenJDK line and uncomment the Oracle line.# Please see the documentation for more detail.jres:- "JavaBuildpack::Jre::OpenJdkJRE"# - "JavaBuildpack::Jre::OracleJRE"frameworks:- "JavaBuildpack::Framework::AppDynamicsAgent"- "JavaBuildpack::Framework::JavaOpts"- "JavaBuildpack::Framework::MariaDbJDBC"- "JavaBuildpack::Framework::NewRelicAgent"- "JavaBuildpack::Framework::PlayFrameworkAutoReconfiguration"- "JavaBuildpack::Framework::PlayFrameworkJPAPlugin"- "JavaBuildpack::Framework::PostgresqlJDBC"- "JavaBuildpack::Framework::SpringAutoReconfiguration"- "JavaBuildpack::Framework::SpringInsight"

由该文件可以知道该buidpack支持的容器,JRE和框架。当然你可以自己添加。

detect的入口是bin/detect,该脚本非常简单,调用JavaBuildpack的with_buildpack静态方法创建实例,然后在代码块里调用JavaBuildpack.detect方法。最后将detect的结果组成一个字符串输出,如果探测不对,则什么也不输出。

components = JavaBuildpack::Buildpack.with_buildpack(build_dir, 'Detect failed with exception %s') do |buildpack| # 这里with_buildpack创建了一个JavaBuildpack::Buildpack的实例,查看buildpack.rb可以看到  buildpack.detectend.compact

接下来看JavaBuildpack::Buildpack类,在buildpack.rb中。

with_buildpack方法

是在class << self中的,因此它是一个静态方法,在看方法定义:

def with_buildpack(app_dir, message)    app_dir = Pathname.new(File.expand_path(app_dir))  # app_dir变成一个Pathname实例    application = Component::Application.new(app_dir)  # 创建application实例    Logging::LoggerFactory.instance.setup app_dir # 初始化日志    yield new(app_dir, application) if block_given? # **创建一个对象,并且调用外部给的代码块**  rescue => e    handle_error(e, message)end

特别注意其中注释加**的那句,语法比较绕

detect方法

detect方法分别对应用使用的容器,JRE,框架探测

def detect  tags = tag_detection('container', @containers, true)  tags.concat tag_detection('JRE', @jres, true) unless tags.empty? # 如果不为空则连接tags  tags.concat tag_detection('framework', @frameworks, false) unless tags.empty?  tags << "java-buildpack=#{@buildpack_version.to_s false}" unless tags.empty? # 加上buildpack版本  tags = tags.flatten.compact.sort  @logger.debug { "Detection Tags: #{tags}" }  tagsend

detection方法

调用每个组件的detect方法,这些其实是子组件(如:容器大项中的tomcat子项),并将结果集合返回。

def detection(type, components, unique)  detected = []  tags = []  components.each do |component|    result = component.detect    next unless result # 如果结果不为空则跳出循环    detected << component    tags << result  end  fail "Application can be run by more than one #{type}: #{names detected}" if unique && detected.size > 1  [detected, tags]end

具体项目的detect方法

这里重点关注下tomcat的detect方法,tomcat.rb

tomcat的类定义:

class Tomcat < JavaBuildpack::Component::ModularComponent

初始化方法

def initialize(context, &version_validator)  super(context, &version_validator)  @sub_components = supports? ? sub_components(context) : [] # tomcat支持吗?,如果支持,初始化子项目,注意:这里两个问号,前一个是方法support?后一个是问号表达式end

可以知道Tomcat是继承自ModularComponent,detect方法是在ModularComponent中定义的,

def detect  supports? ? @sub_components.map(&:detect).flatten.compact : nil # 如果支持探测子项目end

tomcat的support?方法

def supports?  web_inf? && !JavaBuildpack::Util::JavaMainUtils.main_class(@application) # WEB-INF目录存在,且不存在Main方法endprivatedef web_inf?  (@application.root + 'WEB-INF').exist? # 其实检查的是,WEB-INF目录是否存在end

再看子项目有哪些?

def sub_components(context)  [  TomcatInstance.new(sub_configuration_context(context, 'tomcat')),  TomcatLifecycleSupport.new(sub_configuration_context(context, 'lifecycle_support')),  TomcatLoggingSupport.new(sub_configuration_context(context, 'logging_support')),  TomcatAccessLoggingSupport.new(sub_configuration_context(context, 'access_logging_support')),  TomcatRedisStore.new(sub_configuration_context(context, 'redis_store')),  TomcatInsightSupport.new(context)  ]end

TomcatInstance的detect

先从配置文件config/tomcat.yml中找到tomcat的版本及下载路径

tomcat:version: 8.0.+repository_root: "{default.repository.root}/tomcat"

然后从repository_root(默认是:https://download.run.pivotal.io/) 下载tomcat/index.yml,该文件包含了所有版本的tomcat的下载路径,找到具体的版本,如:8.0+指,8.0以上的版本,找到了8.0.14。

需要说明的是:

tomcat支持之后,TomcatInstance是默认支持的,因为tomcat instance就是基本的tomcat包, TomcatLifecycleSupport,TomcatLoggingSupport,TomcatAccessLoggingSupport也是默认支持的。

如果需要会话共享,复制,设置了service环境变量,TomcatRedisStore则是支持的。

而TomcatInsightSupport尚不支持。

以上就是如何进行源码分析Detect ,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

方法 支持 版本 子项 实例 容器 探测 子项目 文件 框架 结果 源码 分析 代码 内容 就是 是在 更多 目录 知识 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技有限公司 上海睿民互联网科技有限公司 哈尔滨大商圈互联网科技有限公司 中资互联网科技 致骋互联网科技 世界互联网领先科技成果 丰台科技园 互联网 长亮科技互联网金融 深圳期待互联网科技 成都狮子座互联网科技 重庆科技学院互联网 华脉科技工业互联网产品 互联网科技实习生岗位职责 浙江互联网科技研学营 美国互联网科技公司 上海创道互联网络科技有限公司 江苏互联网智能科技产品出厂价 数字互联网科技有限公司 银川新华互联网科技学校招聘 现代科技的标志之一的互联网 互联网科技名片 互联网和科技技术 融贸通互联网科技 华夏互联网科技业 恒生互联网科技指数跳水 银川新华互联网科技学校联系电话 互联网科技人工智能实验室 明优互联网科技有限公司 深圳互联网科技的发展 互联网科技创业有什么好项目
0