【Java经验分享篇01】小白如何开始学会看开源项目?
前言
本文章纯粹是个人对于一个新手如何在有一定基础的情况下开始看自己的第一个开源项目做一定的解析。所以选用的是技术架构并不难的项目,对于新手来说也更加友好,纯属分享希望对于已经有一定代码基础的小伙伴们有用!
1.理解开源
1.1.什么是开源?
一般来说,如果提及开源,人们首先想到的是,把代码公开出去,例如放到GitHub
上。以下详细来聊聊开源这个概念的内含和外延,来快速的了解关于开源的概念以及延伸,关于开源的最权威解释可以参考 https://opensource.org ,这个网站是开源思想诞生的地方。而在国内也同样有 开源中国这样的开源网站
国内外开源社区推荐:开源中国、ChinaUnix、GitHub、Apache、SourceForge、
1.2.开源的定义
先来给开源一个定义,一个软件是开源的,最基本的含义是代码是公开的,任何人都可以去查看,修改以及使用。
首先,开源代码和闭源代码非常不同。闭源代码就是普通的商业版权软件,代码是封闭的,只有作者才能看到,出了问题也只有他能修改。而开源代码,任何人都可以查看和修改。关于开源思想的诞生,有一个很有意思的故事。Richard Stallman
是有史以来最伟大的几名黑客之一,也是世界上写代码最多的人之一,他曾经买过一个商业软件,结果有一点小问题,于是他去找软件公司,问他们能不能帮忙修复一下,软件公司说不行,Richard 于是说,那能不能把代码给我,我来修复一下,公司也说不行。于是 Richard Stallman 很生气,创立了自由软件基金会,发布了大名鼎鼎的 GPL 协议,GPL 至今为止依然是最著名的开源协议。
第二点需要特别注意的是,开源不等于免费。软件代码虽然可以免费给别人,但是软件相关的服务,例如编译维护升级等,一样可以赚钱,例如 Redhat 就是家开源软件公司,不仅仅赚钱,而且很赚钱。同时,很多公司有把越来越多的开发者投入到公司的开源项目中,这些软件可以有力的支撑起公司的生态,所以如果你是一个开源软件开发者,也不用担心找不到工作。
1.2.1.开源软件优点
优点 | 说明 |
---|---|
低风险 | 使用闭源软件无疑是把命运交给他人,一旦封闭的源代码没有人来维护,你将进退维谷;而且相较于商业软件公司,开源社区很少存在倒闭的问题。 |
高品质 | 相较于闭源软件产品,开源项目通常是由开源社区来研发及维护的,参与编写、维护、测试的用户量众多,一般的 bug 还没有等爆发就已经被修补。 |
低成本 | 开源工作者都是在幕后默默且无偿地付出劳动成果,为美好的世界贡献一份力量,因此使用开源社区推动的软件项目可以节省大量的人力、物力和财力。 |
更透明 | 没有哪个笨蛋会把木马、后门等放到开放的源代码中,这样无疑是把自己的罪行暴露在阳光之下。 |
1.2.2.经典开源软件案例
软件 | 说明 |
---|---|
Linux | Linux 是一款开源的操作系统,它的内核由多名极客共同维护。Linux 是开源软件的经典之作、代表之作、巅峰之作。 |
Apache | 世界使用排名第一的 Web 服务器软件。 |
MySQL | 世界上最流行的关系型数据库,适合中小型网站。 |
Firefox | 火狐浏览器。在 Chrome 推出之前,Firefox 几乎是最快速的浏览器,直到现在也是 Web 开发人员的调试利器。 |
OpenOffice | 套跨平台的办公软件套件,类似 Microsoft Office。 |
GCC | C语言/C++编译器。 |
Java、PHP、 Python | 开源的编程语言。 |
1.3.关于开源协议
开源软件在追求“自由”的同时,不能牺牲程序员的利益,否则将会影响程序员的创造激情,因此世界上现在有 60 多种被开源促进组织(Open Source Initiative)认可的开源许可协议来保证开源工作者的权益。
开源协议规定了你在使用开源软件时的权利和责任,也就是规定了你可以做什么,不可以做什么。
1.3.1.如何选择开源协议
世界上的开源协议有上百种,很少有人能彻底搞清它们之间的区别,即使在最流行的六种开源协议——GPL、BSD、MIT、Mozilla、Apache 和 LGPL——之中做选择,也很复杂。
乌克兰程序员 Paul Bagwell 画了一张分析图,说明应该怎么选择开源协议,大家看了一目了然,真是清爽。
2.如何查找开源项目
首先关于开源项目的查找要介绍的网站有两个,一个是 GitHub众所周知全球最大的同性交友平台,第二个则是国内近几年火热的代码管理平台 码云。想要寻找比较好的开源项目通常在这两个平台上面搜索即可,当然搜索也是需要技巧的。
代码管理平台常见关键字解析
-
watch
:会持续收到项目的动态 -
fork
:复制某个项目到自己的仓库 -
star
:点赞数,表示对该项目表示认可,点赞数越多的项目一般越火 -
clone
:将项目下载到本地 -
follow
:关注你感兴趣的作者,会收到他们的动态
2.1.一个仓库项目的基本解析
一些关键性信息分析
-
Issues(问题单)
:用于对项目进行跟踪、增强和排错。它们就像电子邮件一样 —— 除了它们可以与团队的其他成员进行分享和讨论 - 越火的项目
start
和fork
就会越多 -
commit
:一般比较好的项目,维护会比较频繁,更新也会频繁,提交数就会多 -
README.md
文件是一个项目的入门手册,里面介绍了整个项目的使用、功能等等。所以README文件写得好不好,关系到这个项目能不能更容易的被其他人了解和使用 - 也可以根据项目的最后更新时间来检验自己是否下载了远古项目
2.2.关于开源项目高级搜索
GitHub有高级搜索功能,search/advanced可以输入关键字
、代码库大小
、包含作者
、代码语
、代码包含后缀文件名
等
注意:搜索公式可以结合使用。每个公式之间用空格隔开即可!
2.3.根据仓库标题、描述搜索
in关键词限制搜索范围
-
in:name xxx
项目名包含xxx -
in:description xxx
项目描述包含xxx -
in:readme xxx
项目介绍文档里含有xxx
以in:限制 搜索的具体内容
为主导进行更加精准的搜索
2.4.按照地区和语言进行搜索
很多时候我们的项目是要用我们会的语言,你找到了一个Python
写的好项目,但是没学过Python
,下载了也看不懂,同时,为了更好的阅读README.md帮助文档以及项目注释
,我想很多同学都会想要下载中文的项目,当然英语顶呱呱的请忽略。这个时候就可以用地区和语言进行搜索。
-
location
:地区 -
language
:语言
#语言为javaScript
language:javaScript
#地区为china
location: China
#可以进行联合搜索 如下:
language:javascript location:china
2.5.根据仓库属性条件搜索
可以根据个人需求,可能想要找的项目并不是那么大的项目只是一些小项目就可以对项目大小进行限制。
-
size:>= 数字
注意:100代表100Kb 单位为Kb
如果想要寻找一些比较新颖的项目,不想要比较远古的项目则可以根据项目的更新时间来搜索
-
pushed:> YYYY-MM-DD
最后上传日期大于YYYY-MM-DD -
created:> YYYY-MM-DD
创建日期大于YYYY-MM-DD
#比如我们想要寻找2020年最新更新的项目,可以如下
pushed:>2020-01-03 Spring Boot
#这样子就可以找到2020年1月之后更新的最新项目
2.6.根据个人或某组织进行搜索
如果你想在GitHub 上找一下某个大神是不是提交了新的项目,可以对他们进行精准搜索
-
user: name
查找某个用户 -
org: name
查找某个组织 -
followers:>=xxx
查找关注者数量超过xxx的开发者
2.7.根据仓库的LICENSE搜索
开源项目的License(项目授权协议) 有的开源项目作者明确禁止商用了,但是你不知情下载了,并且使用了,这就会很麻烦,所以如果有搜索需要项目的时候就需要按照对应的开源协议来搜索项目。
license:对应协议
#例如咱们要找协议是最为宽松的 Apache License 2 的代码,如下
license:apache-2.0 Spring Boot
awesome加强搜索
Awesome 似乎已经成为不少 GitHub 项目喜爱的命名之一,Awesome 往往整合了大量的同一领域的资料,让大家可以更好的学习
-
awesome 关键字
awesome 系列一般是用来收集学习、工具、书籍类相关的项目
比如搜索优秀的Java
相关的项目,包括框架、教程等可以输入:awesome Java
2.8.热门
GitHub Trend 页面总结了每天/每周/每月周期的热门Repositories 和 Developers,你可以看到在某个周期处于热门状态的开发项目和开发者。
GitHub Topic 展示了最新和最流行的讨论主题,在这里你不仅能够看到开发项目,还能看到更多非开发技术的讨论主题
3.开源项目解析
3.1.查找相关开源项目
根据用户使用情况不同(中文Gitee,全球性GitHub),可以先从国内的开源网站来寻找开源项目,以下开源项目案例来自于 Gitee,在Gitee中可以根据首页的开源软件对最有价值的项目进行查看和搜索。或者可以根据推荐项目进行观察和选择项目学习
3.1.1.开源项目
本次开源项目来源于Gitee上的一个自动化OA办公系统。感谢大佬的开源,如果大家喜欢也可以给大佬一个start哦。办公自动化(OA)是面向组织的日常运作和管理,员工及管理者使用频率最高的应用系统,极大提高公司的办公效率。
3.2.如何分析一个开源项目
3.2.1.观察开源项目
首先针对于一个开源项目,要做的第一件事情应该是先观察这个开源项目的大致结构(如使用说明文档、sql文件、项目目录结构maven
或者gradle
等),以及所使用的语言等基本信息。
3.2.2.项目技术分析
查看说明文档-匹配技术栈与运行环境
根据开源项目的使用说明文档可以知道当前项目使用的是哪些技术栈,根据这些技术栈来分析是否符合自己的需求。并且查看当前项目的运行环境要求,以便进行下一步将项目运行起来。
以当前开源案例为说明技术栈如下:
前端技术
技术 | 名称 | 版本 | 官网 |
---|---|---|---|
freemarker | 模板引擎 | springboot1.5.6.RELEASE集成版本 | https://freemarker.apache.org/ |
Bootstrap | 前端UI框架 | 3.3.7 | http://www.bootcss.com/ |
Jquery | 快速的JavaScript框架 | 1.11.3 | https://jquery.com/ |
kindeditor | HTML可视化编辑器 | 4.1.10 | http://kindeditor.net |
My97 DatePicker | 时间选择器 | 4.8 Beta4 | http://www.my97.net/ |
后端技术
技术 | 名称 | 版本 | 官网 |
---|---|---|---|
SpringBoot | SpringBoot框架 | 1.5.6.RELEASE | https://spring.io/projects/spring-boot |
JPA | spring-data-jpa | 1.5.6.RELEASE | https://projects.spring.io/spring-data-jpa |
Mybatis | Mybatis框架 | 1.3.0 | http://www.mybatis.org/mybatis-3 |
fastjson | json解析包 | 1.2.36 | https://github.com/alibaba/fastjson |
pagehelper | Mybatis分页插件 | 1.0.0 | https://pagehelper.github.io |
部署注意事项
- 下载项目、把oasys.sql导入本地数据库
- 修改application.properties
- 修改数据源,oasys——>自己本地的库名,用户名和密码修改成自己的
- 修改相关路径,配置图片路径、文件路径、附件路径。(static/image/oasys.jpg 拷贝到配置的图片路径下,不然会报 FileNotFoundException )
- OasysApplication.java中的main方法运行,控制台没有报错信息,数据启动时间多久即运行成功
- 在浏览器中输入localhost:8088/login
3.2.3.安装环境导入项目
通过第一轮观察可以发现和找到相关的项目跑起来所需要的文件,那么接下去的第二步就是将这个项目导入到我们的IDE编译工具中去,并且尝试性的将这个项目运行起来,进行查看。
1.导入相关的sql文件
通常开源项目的作者会将项目的sql文件一起打包放入到开源项目中,在首页目录下一般都能看到相关的xxx.sql
的文件,如果没有可以查看一下有没有相关叫sql的文件夹。
找到相关数据库文件后,新建相关数据库,并且将SQL文件进行运行。
2.将项目用IDE工具打开
准备好相关的IDE工具,通常放在代码托管平台上面的项目是不会根据指定的编译器的,而是保留了Maven的核心文件即可。
通常则将IDE编译工具打开然后将对应路径上的项目进行导入即可
3.分析目录结构
在项目成功导入后可以对项目的目录结构进行一下简单的查看,看自己是否能够看懂其大概的布局再开始下一步深入的项目分析
从上图中是可以看到,就算是开源项目的目录结构也是按照平时学习过程中的标准来的,也是按层级,按功能,按资源来划分的
3.2.4.关于package-info.java
在查看开源项目的过程中可以看到很多包底下有package-info.java
这个类,package-info.java
是一个Java
文件,可以放到任意Java
源码包执行。不过里面的内容有特定的要求,其主要目的是为了提供包级别相关的操作,比如包级别的注解、注释及公共变量。
1.提供包级别的注解
在对应的源码包提供包级别的注解,简单案例如下:
// 创建包注解
@Target(ElementType.PACKAGE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestPkg {
}
//在package-info.java中添加注解
@TestPkg
package com.exercise.data_collection_error_info_transformation.component;
// 可以查看相关注解
public class Client {
public static void main(String[] args) throws ClassNotFoundException {
// 查看包注解
String pkgName = "com.exercise.data_collection_error_info_transformation.component";
Package pkg = Package.getPackage(pkgName);
Annotation[] annotations = pkg.getAnnotations();
for(Annotation an:annotations){
if(an instanceof TestPkg){
System.out.println("Hi,I\'m the TestPkg");
}
}
// 查看包下面对应的类的注解
Class test = Class.forName("com.exercise.data_collection_error_info_transformation.component.Test");
Annotation[] annotations2 = test.getAnnotations();
for(Annotation an:annotations2){
if(an instanceof TestPkg){
System.out.println("Hi,I\'m the Class TestPkg");
}
}
}
}
/**
得到最终结果如下:
Hi,I\'m the TestPkg
*/
如果一整个包都是过时的话,可以直接在package-info.java
下面,添加注解@Deprecated
,表示该源码包已过时
2.提供包级别的变量
如果想在包里面使用对应的变量,而不想让其他包使用,就可以将变量放到package-info.java
下面,实现分包自用
的理念。
/**
在package-info.java类中添加如下内容
* 包类
*/
class PACKAGE_CLASS{
public void test(){
}
}
/**
* 包常量
*/
class PACKAGE_CONST{
public static final String TEST_01="TEST";
}
// 在同级别包中进行任意调用不会报错
public class Client {
public static void main(String[] args) throws ClassNotFoundException {
System.out.println(PACKAGE_CONST.TEST_01);
}
}
3.方便JavaDoc文档输出
使用JavaDoc
的时候,通过在package-info.java
添加注释,生成JavaDoc
实现对应包的注释说明。
3.3.Debug对项目进行分析
我们可以通过对程序项目进行断点调试,来对项目的源码功能进行分析。比如可以在最常见的登陆部分进行debug测试。
根据断点一步一步的去感受作者在写这些代码的每一步用意,看开源的意义就在于此,思考、借鉴非常的重要!
总结
所以个人总结下来有基础的情况下一开始看开源项目的流程并不是很复杂,归纳如下:
- 了解什么是开源
- 学会去找一个适合自己想看技术架构的开源项目
- 观察开源项目(就是看readme.md文档)以及下载开源项目
- 将下载下来的开源项目的目录结构先进行分析,并且用IDE工具打开此开源项目
- 将开源项目运行起来
- 通过打断点(Debug)运行项目的方式来思考作者的思路如果觉得好就可以成为自己的借鉴代码