springboot gradle springboot源码学习 jetbrain 环境配置

springboot gradle,笔者用到的所有工具的版本号不是最新的,而且笔者哪怕去找较新的版本也不会使用最新版本,因为最新版本往往会有很多不可控的问题,所以一般最高使用的是次新版本。springboot下载源码时可能遇到的问题在之前的篇幅中已经介绍过了。本篇重点记录在jetbrain IntelliJ IDEA中配置springboot源码基于gradle构建的环境并运行部分smoke-test的过程。

  1. 环境版本说明
  • Windows 10
  • java version “1.8.0_40”
  • IntelliJ IDEA 2018.3.6
  • Apache Maven 3.6.1
  • Gradle 7.2 (笔者最初设想的版本,但是编译时会有坑,后边有修正成6.9.1)
  • git version 2.21.0.windows.1
  1. 工具安装配置

(1) JDK, 网上的教程很多,基本的思路和操作方式都是差不多的,大同小异,笔者提供一般不错的教程地址: https://www.runoob.com/w3cnote/windows10-java-setup.html

(2) Git & tortoisegit笔者在写教程的时候 git的最新版本已经到了2.34.0,与笔者的版本有出入,读者可以根据自己的需求去下载。下载地址的最后一个win说明是对应windows系统的,如果读者是mac或者linux系统可以去对应的地址下载。https://git-scm.com/download/win我们还可以再安装一个,tortoisegit–git的一个比较好用的客户端。它的下载地址如是: https://tortoisegit.org/download/ Tortosegit安装教程:https://www.cnblogs.com/xuwenjin/p/8573603.html 

(3) Maven & gradleMaven下载地址: https://maven.apache.org/download.cgiGradle 下载地址: https://services.gradle.org/distributions/Maven和Gradle 在windows系统的安装配置的过程同样不再提供具体的细节,读者自行查询,或者用笔者提供的教程地址去阅读后跟着安装配置https://www.runoob.com/maven/maven-repositories.html

(4) IntelliJ IDEA 2018.3.6下载地址: https://www.jetbrains.com/idea/download/#section=windowsIntellij IDEA的专业版有时间限制,网上有各种的破解方案又获取可以去某bao买一个便宜点的账号,如果读者有安全的白嫖方案亦可。

  1. GitHub找到springboot及源码拉取

找个gayhub的springboot地址:https://github.com/spring-projects/spring-boot

springboot github源码下载示例

在页面的右上角可以看到它stars和fork数量。我们想要得到源码一般就是这么几种方式,一是把源码fork到自己的github地址下,这么做的优势是可以做一个自己的分支,而且自己在源码中做一些改动还可以提交到自己分支中,并且还可以跟着主分支一起更新最新的代码,保持先进行;二是直接git clone master分支的源码,再一个就是直接下载当前版本的zip文件。笔者采用的是将源码fork到自己的分支下,然后直接用git下载到pc上。

  1. Git clone下载springboot

我们打开一个想要用来存放源代码的文件夹—>在文件夹的空白处【右键】–>会弹出如下的界面:我们会看到Git Bash Here 和 Git Clone (如果没有安装TortoiseGit没有Git Clone这个选项) 这些选项,这两个选项任意一个都可以把我们需要的代码下载到本地。

区别: Git Bash Here 命令行客户端; Git Clone 可视化客户端

TortoiseGit windows 快捷方式
springboot 下载示例
springboot git命令下载示例

问题一:直接git clone 总是time out,跟网络有一定的关系,不可描述的原因导致有些时候我们用gayhub的时候必须科学上网,如果没法科学上网那就多尝试几次,总有一年可以搞定。

timeout 报错示例

问题二:OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054, 这个时候需要关闭SSL CERT verification,通过命令 git config http.sslVerify “false”

如果还是报错,那就把全局的也调一下 git config –global http.sslVerify “false”

SSL_ERROR_SYSCALL 错误示例

问题三: error: unable to create file *****: Filename too long
原因是: git有可以创建4096长度的文件名,然而在windows最多是260处理方法是执行命令: git config –global core.longpaths true

  1. Intellij IDEA配置springboot源码及编译

打开我们的Intellij IDEA,然后通过打开按钮选择我们下载好的springboot, 如下图,(如果是不同版本的IDEA在操作界面上是有一些区别的,有的版本open 和 import Project是在一起的),找到我们的项目点击OK。

idea 载入springboot
idea 配置指定本地gradle 和maven仓库

问题一: MultipleCompilationErrorsException: startup failed 一般这种错误是Gradle的版本问题导致,而我们的教程在上图中已经给出来了答案,我们制定了版本但是在打开文件的时候由于笔者以前gradle历史版本的记录而没有修改成最新的gradle版本,也就是上图中的Gradle home那一栏的的默认值导致的gradle版本不同。

MultipleCompilationErrorsException 示例

问题二:AssertionFailedError  在编译的时候可能会遇到这种错误。类似下图, 这个问题的本质同样是由于gradle的版本问题导致的, 一般来说是gradle的版本比较高,没有与我们编译的springboot相对应才导致的这种错误。

distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip
AssertionFailedError 示例

最好的方式就是使用官方指定的gradle版本,而这个版本就在源码根目录下的gradle–wrapper–gradle-wrapper.properties文件中的distributionUrl给出了,我们只需要把对应版本的gradle下载到本地,并在IDEA的 File –>  Settings –> Build, Execution, Deployment –> Build Tools –> Gradle 中找到Gradle home 指定到本地的对应目录即可。如下图

gradlehome 配置

除了gradle的版本要对应正确之外,最关键的是要有几个配置项需要调整,在笔者参考的连接页面中已经解释的比较详尽了,但是笔者此处还是要强调一下,源码中调整的配置文件主要是为了配置maven的国内加速镜像以及调整gradle每次编译时使用的主要jar包工具等,总而言之就是为了爽。

  • 项目根目录下build.gradle[即文件路径:spring-boot/build.gradle],文件最开始添加如下配置
buildscript{
   repositories{
      maven { url 'https://maven.aliyun.com/nexus/content/groups/public/'}
      maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
      maven { url 'https://repo.spring.io/plugins-release'}
   }
}
  • 项目根目录下settings.gradle[即文件路径:spring-boot/settings.gradle], 在pluginManagement–> repositories 中添加两行
pluginManagement {
   repositories {
      maven { url 'https://maven.aliyun.com/nexus/content/groups/public/'}
      maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}

      mavenCentral() 
      ...
}
  • 项目子根目录buildSrc下的build.gradle[即文件路径:spring-boot/buildSrc/build.gradle], 在repositories中添加maven加速镜像的三行
repositories {
   maven { url 'https://maven.aliyun.com/nexus/content/groups/public/'}
   maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
   maven { url 'https://repo.spring.io/plugins-release'}
   mavenCentral()
   gradlePluginPortal()
   maven { url "https://repo.spring.io/release" }
}
  • 项目子根目录buildSrc下的settings.gradle[即文件路径:spring-boot/buildSrc/settings.gradle], 在repositories中添加maven加速镜像的三行
pluginManagement {
   repositories {
      maven { url 'https://maven.aliyun.com/nexus/content/groups/public/'}
      maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
      maven { url 'https://repo.spring.io/plugins-release'}
      mavenCentral()
      gradlePluginPortal()
   }
  • 项目子根目录gradle下的radle-wrapper.properties[即文件路径:spring-boot/gradle/wrapper/gradle-wrapper.properties], 修改distributionUrl,即gradle编译工具为本地的路径文件,否则每次编译的时候总是会去网上拉取文件
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
#distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip
distributionUrl=file:///C:/AppConfigs/gradle-6.9-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

只要gradle的版本对应好,基本的maven仓库和gradle配置没有问题的话再十几分钟的编译后总是可以通过的,当然读者可能会遇到各种Heap堆内存没有足够的空间的问题,那是读者的PC硬件参数偏低或者IDEA配置的问题,可以按照这个地址https://blog.csdn.net/smart_an/article/details/107219821的方式配置一下内存参数。

springboot编译成功
  1. 源码smoke-test冒烟测试

笔者主要运行了两个模块的smoke-test,分别是spring-boot-smoke-test-hibernate52和spring-boot-smoke-test-data-redis。笔者在运行冒泡测试Hibernate52Application的时候遇到了以下的问题。解决方法是升级一下kotlin插件,settings -> Languages & Frameworks -> kotlin(如下图)

Information:Kotlin: kotlinc-jvm 1.3.11 (JRE 1.8.0_40-b25)Information:2021/11/23 16:34 - Compilation completed with 1 error and 0 warnings in 12 s 48 msError:Kotlin: [Internal Error] java.lang.LinkageError: loader constraint violation: loader (instance of org/jetbrains/kotlin/cli/jvm/plugins/PluginURLClassLoader$SelfThenParentURLClassLoader) previously initiated loading for a different type with name "kotlin/sequences/Sequence"
升级kotlin插件

运行redis冒烟测试的时候如果没有任何的额外配置和修改,则会默认连接redis的本地地址路径,我们可以在模块下添加一个ymal文件来指定自己的redis地址,如下图在模块的main下添加一个resources文件夹,新建一个yml文件且文件被ide识别成绿叶子的样子即可。在文件中添加redis的配置信息。

somke-redis增加配置文件
spring:
  redis:
    port: 6739
    host: 1*.*.*.*
    password: ****

不论我们运行哪一个冒烟测试,如果需要额外的配置都可以按照spring的预定新建yaml文件或者properties文件;而且如果要debug进源代码也是可以的,跟中springboot的源码主要是跟进main函数的run方法,一层层的run方法点进去就可以看到springboot启动的时候所有的流程细节。

springboot 源码fork后下载到本地的血泪历程

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者

百度百科

spring boot的介绍以及它的优点缺点种种信息,笔者不再累赘。此篇旨在记录一下笔者自己下载spring boot源码时的过程,真的是费时费力又费心。

由于笔者想要跟踪阅读源码,也可能在浏览源码时在源代码是做笔记记录,或对其代码做部分的调整和验证,而每次修改的记录又没法完全靠脑子记录下来,所以笔者把springboot的源码fork到自己的GitHub分支上,直接Git clone fork后的分支,这样本地的修改都可以在git中有所记录,而且也可以把笔记和一些心得临时记录在git中push到自己的分支,以便后续整理汇总。

问题一: time out

直接git clone 总是time out,跟网络有一定的关系,不可描述的原因导致有些时候我们用gayhub的时候必须科学上网,如果没法科学上网那就多尝试几次,总有一年可以搞定。

Git clone time out

问题二:OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054

Git clone的时候如果出现了如下图的错误,这个时候需要关闭SSL CERT verification,通过命令

SSL_ERROR_SYSCALL

git config http.sslVerify “false”

如果还是报错,那就把全局的也调一下

git config –global http.sslVerify “false”

问题三:Git clone 完成没有文件

我们经过很长一段时间的下载终于把所有的文件都下载完成了,而且也提示了如下图的完成下载仪式,可以在文件中什么都没有。 别慌,这个时候需要再一个命令把下载的内容都变出来。

git checkout FETCH_HEAD

上边的命令执行完成后,我们就可以看到文件了,而且执行日志中也会有给我们的提示,提示我们要自己 git checkout -b <new-branch-name>, 意思是让我们建一个本地的分支,不然现在的分支没有一个正经的名字。

apache hive reflect函数 基因型的UDF函数

在写hsql(hive sql)的时候,我们可以利用hive自身的函数来处理很多的数据,但是有的时候内置函数没法满足我们的需求时就需要用到UDF(User-Defined Function),而有时我们的需求也很简单,在很多的jar包或者java自身的包中已经存在具体的实现逻辑或者方法。那么我们如何来调用这些已经存在且不需要自己写的函数和方法呢?

apache hive

A java class and method often exists to handle the exact function a user would like to use in hive. Rather then having to write a wrapper UDF to call this method, the majority of these methods can be called using reflect udf. Reflect uses java reflection to instantiate and call methods of objects, it can also call static functions. The method must return a primative type or a type that hive knows how to serialize.

Apache hive reflect

大致含义: 通常存在一个 Java 类和方法来处理用户想要在 Hive 中使用的确切功能。不必编写包装 UDF 来调用此方法,大多数方法都可以使用反射 UDF 调用。Reflect 使用 Java 反射来实例化和调用对象的方法;它还可以调用静态函数。该方法必须返回原始类型或 Hive 知道如何序列化的类型。

SELECT reflect("java.lang.String", "valueOf", 1),
       reflect("java.lang.String", "isEmpty"),
       reflect("java.lang.Math", "max", 2, 3),
       reflect("java.lang.Math", "min", 2, 3),
       reflect("java.lang.Math", "round", 2.5),
       reflect("java.lang.Math", "exp", 1.0),
       reflect("java.lang.Math", "floor", 1.9)
FROM src LIMIT 1;

# 输出: 1   true    3   2   3   2.7182818284590455  1.0

再比如我们在解析URL的时候,java的已存在函数是java.net.URLDecoder.decode(),在hive中如何调用?

hive> select reflect('java.net.URLDecoder','decode',cur) from pv where day_id='2016-05-01';

注意: As of Hive 0.9.0, java_method() is a synonym for reflect(). See Misc. Functions in Hive Operators and UDFs.

参考地址: http://sishuok.com/forum/blogPost/list/6226.html