如何用源码分析Compile

85次阅读
没有评论

共计 2204 个字符,预计需要花费 6 分钟才能阅读完成。

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

bin/compile

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

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

compile 方法

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

Ruby 代码  如何用源码分析 Compile

def compile 

 puts BUILDPACK_MESSAGE % @buildpack_version 

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

 fail  No container can run this application  unless container 

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

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

 container.compile 

end 

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

JRE 的编译

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

Ruby 代码  如何用源码分析 Compile

def compile 

 download_tar 

 @droplet.copy_resources 

end 

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

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

Tomcat 的编译

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

Java 代码  如何用源码分析 Compile

def compile 

 @sub_components.each(:compile) 

end 

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

TomcatInstance 的 compile 方法

该 compile 方法完成了三件事:

1. 下载 tomcat 的包;

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

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

Ruby 代码  如何用源码分析 Compile

def compile 

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

 link_to(@application.root.children, root) 

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

 @droplet.additional_libraries.link_to web_inf_lib 

end 

TomcatLifecycleSupport 的 compile 方法

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

Ruby 代码  如何用源码分析 Compile

def compile 

 download_jar(jar_name, tomcat_lib) 

end 

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

TomcatRedisStore 的 compile 方法

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

Ruby 代码  如何用源码分析 Compile

def compile 

 return unless supports? 

 download_jar(jar_name, tomcat_lib) 

 mutate_context 

end 

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

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计2204字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)