mirror of
https://github.com/PowerJob/PowerJob.git
synced 2025-07-17 00:00:04 +08:00
v1.0.0
This commit is contained in:
parent
9823434122
commit
b31b96f36b
47
README.md
47
README.md
@ -1,22 +1,43 @@
|
||||
# 简介
|
||||
### 产品介绍
|
||||
OhMyScheduler是一个分布式调度平台和分布式计算框架
|
||||
* 支持CRON、固定频率、固定延迟和API四种定时策略
|
||||
* 支持单机、广播、**MapReduce**三种执行模式
|
||||
* 支持任意的水平扩展,性能强劲无上限
|
||||
OhMyScheduler是一个分布式调度平台和分布式计算框架,具有以下特性:
|
||||
* 支持CRON、固定频率、固定延迟和API四种调度策略。
|
||||
* 支持单机、广播、**MapReduce**三种执行模式。
|
||||
* 支持任意的水平扩展,性能强劲无上限。
|
||||
* 具有强大的故障转移与恢复能力,只要保证集群可用节点数足够,任务就能顺利完成。
|
||||
* 仅依赖数据库,部署简单,上手容易,开发高效,仅需几行代码即可获得整个集群的分布式计算能力。
|
||||
* 支持SpringBean、普通Java类(内置/外置)、Shell、Python等处理器
|
||||
* 支持SpringBean、普通Java类(内置/外置)、Shell、Python等处理器。
|
||||
|
||||
# 部署
|
||||
### 环境要求
|
||||
* 运行环境:JDK8+
|
||||
* 编译环境:Maven3+
|
||||
* 数据库:Spring Data JPA支持的关系型数据库理论上都可以(MySQL/Oracle...)
|
||||
* 数据库:Spring Data JPA支持的关系型数据库理论上都可以(MySQL/Oracle/MS SQLServer...)
|
||||
|
||||
### 依赖坐标
|
||||
>最新依赖版本请参考Maven中央仓库:[推荐地址](https://search.maven.org/search?q=com.github.kfcfans)&[备用地址](https://mvnrepository.com/search?q=com.github.kfcfans)。
|
||||
|
||||
Worker依赖包(需要接入分布式计算能力的应用需要依赖该jar包)
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>com.github.kfcfans</groupId>
|
||||
<artifactId>oh-my-scheduler-worker</artifactId>
|
||||
<version>${oms.worker.latest.version}</version>
|
||||
</dependency>
|
||||
```
|
||||
Client依赖包(需要接入OpenAPI的应用需要依赖该Jar包,使用代码调用控制台功能)
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>com.github.kfcfans</groupId>
|
||||
<artifactId>oh-my-scheduler-client</artifactId>
|
||||
<version>${oms.client.latest.version}</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
### 项目部署
|
||||
1. 部署数据库:由于调度Server数据持久化层基于Spring Data Jpa实现,**开发者仅需完成数据库的创建**,即运行SQL`CREATE database if NOT EXISTS oms default character set utf8mb4 collate utf8mb4_unicode_ci;`
|
||||
2. 部署调度服务器(oh-my-scheduler-server):修改配置文件(application.properties),按需修改,之后maven打包部署运行一条龙。
|
||||
3. 部署前端页面(可选,server多实例部署时需要),自行使用[源码](https://github.com/KFCFans/OhMyScheduler-Console)打包部署即可。
|
||||
3. 部署前端页面(可选,server多实例部署时需要,单Server已经继承在SpringBoot中),自行使用[源码](https://github.com/KFCFans/OhMyScheduler-Console)打包部署即可。
|
||||
4. 被调度任务集成`oh-my-scheduler-worker`依赖,并完成处理器的开发,详细教程见[开发文档](https://github.com/KFCFans/OhMyScheduler/blob/master/others/doc/DevelopmentGuide.md)。
|
||||
|
||||
# 开发日志
|
||||
@ -26,10 +47,12 @@ OhMyScheduler是一个分布式调度平台和分布式计算框架
|
||||
* 执行处理器:支持SpringBean、普通Java对象、Shell脚本、Python脚本的执行
|
||||
* 高可用与水平扩展:调度服务器可以部署任意数量的节点,不存在调度的性能瓶颈。
|
||||
* 不怎么美观但可以用的前端界面
|
||||
* OpenAPI:通过OpenAPI可以允许开发者在自己的应用上对OhMyScheduler进行二次开发,比如开发自己的定时调度策略,通过API的调度模式触发任务执行。
|
||||
|
||||
### 待开发
|
||||
### 下阶段目标
|
||||
* 工作流(任务编排):当前版本勉强可以用MapReduce代替,不过工作流挺酷的,等框架稳定后进行开发。
|
||||
* [应用级别资源管理和任务优先级](https://yq.aliyun.com/articles/753141?spm=a2c4e.11153959.teamhomeleft.1.696d60c9vt9lLx):没有机器资源时,进入排队队列。不过我觉得SchedulerX的方案不太行,SchedulerX无抢占,一旦低优先级任务开始运行,那么只能等他执行完成才能开始高优先级任务,这明显不合理。可是考虑抢占的话又要多考虑很多东西...先放在TODO列表吧。
|
||||
* 保护性判断(这个太繁琐了且意义不大,毕竟面向开发者,大家不会乱填参数对不对~)
|
||||
|
||||
# 参考
|
||||
>Alibaba SchedulerX 2.0
|
||||
@ -37,4 +60,10 @@ OhMyScheduler是一个分布式调度平台和分布式计算框架
|
||||
* [Akka 框架](https://yq.aliyun.com/articles/709946?spm=a2c4e.11153959.teamhomeleft.67.6a0560c9bZEnZq):不得不说,akka-remote简化了相当大一部分的网络通讯代码。
|
||||
* [执行器架构设计](https://yq.aliyun.com/articles/704121?spm=a2c4e.11153959.teamhomeleft.97.371960c9qhB1mB):这篇文章反而不太认同,感觉我个人的设计更符合Yarn的“架构”。
|
||||
* [MapReduce模型](https://yq.aliyun.com/articles/706820?spm=a2c4e.11153959.teamhomeleft.83.6a0560c9bZEnZq):想法很Cool,大数据处理框架都是处理器向数据移动,但对于传统Java应用来说,数据向处理器移动也未尝不可,这样还能使框架的实现变得简单很多。
|
||||
* [广播执行](https://yq.aliyun.com/articles/716203?spm=a2c4e.11153959.teamhomeleft.40.371960c9qhB1mB):运行清理日志脚本什么的,也太实用了8~
|
||||
* [广播执行](https://yq.aliyun.com/articles/716203?spm=a2c4e.11153959.teamhomeleft.40.371960c9qhB1mB):运行清理日志脚本什么的,也太实用了8~
|
||||
|
||||
# 后记
|
||||
* 产品永久开源(Apache License, Version 2.0),免费使用,且目前开发者@KFCFans有充足的时间进行项目维护和提供无偿技术支持(All In 了解一下),欢迎各位试用!
|
||||
* 欢迎共同参与本项目的贡献,PR和Issue都大大滴欢迎(求求了)~
|
||||
* 觉得还不错的话,可以点个Star支持一下哦~ = ̄ω ̄=
|
||||
* 联系肥宅兄@KFCFans -> `tengjiqi@gmail.com`
|
BIN
oh-my-scheduler-server/src/.DS_Store
vendored
Normal file
BIN
oh-my-scheduler-server/src/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
oh-my-scheduler-server/src/main/.DS_Store
vendored
Normal file
BIN
oh-my-scheduler-server/src/main/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
oh-my-scheduler-server/src/main/resources/.DS_Store
vendored
Normal file
BIN
oh-my-scheduler-server/src/main/resources/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
oh-my-scheduler-server/src/main/resources/static/.DS_Store
vendored
Normal file
BIN
oh-my-scheduler-server/src/main/resources/static/.DS_Store
vendored
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@
|
||||
.wrap[data-v-9781a346]{background:#fff;display:flex;text-align:center;justify-content:space-around;align-items:center;margin:10px;box-shadow:0 2px 12px 0 rgba(0,0,0,.2);font-size:1.5rem;font-weight:bolder;height:131px}.el-table .warning-row{background:#fdf5e6}.el-table .success-row{background:#8fbc8f}.el-table .error-row{background:#ff5831}
|
@ -0,0 +1 @@
|
||||
#welcome[data-v-175a435c]{width:100%;height:100%;background-image:url(../img/welcome_background.6d979910.svg);display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center;align-items:center}
|
BIN
oh-my-scheduler-server/src/main/resources/static/favicon.ico
Normal file
BIN
oh-my-scheduler-server/src/main/resources/static/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 266 KiB |
@ -0,0 +1 @@
|
||||
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/favicon.ico><title>oms-console</title><link href=/css/chunk-29e8f75a.57228328.css rel=prefetch><link href=/css/chunk-7602a25e.b9e33c01.css rel=prefetch><link href=/js/chunk-29e8f75a.a9aa0f8f.js rel=prefetch><link href=/js/chunk-2d0c76e2.33e8c899.js rel=prefetch><link href=/js/chunk-2d21772a.415195dc.js rel=prefetch><link href=/js/chunk-7602a25e.165fb79d.js rel=prefetch><link href=/css/app.46de59ae.css rel=preload as=style><link href=/js/app.69245af1.js rel=preload as=script><link href=/js/chunk-vendors.193746e8.js rel=preload as=script><link href=/css/app.46de59ae.css rel=stylesheet></head><body><noscript><strong>We're sorry but oms-console doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.193746e8.js></script><script src=/js/app.69245af1.js></script></body></html>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,2 @@
|
||||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-29e8f75a"],{6337:function(t,s,a){"use strict";var e=a("ffdc"),n=a.n(e);n.a},"7d8a":function(t,s,a){"use strict";a.r(s);var e=function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{attrs:{id:"home"}},[a("el-row",{attrs:{gutter:24}},[a("el-col",{attrs:{span:6}},[a("div",{staticClass:"wrap"},[a("div",{staticClass:"grid-content bg-purple"},[a("div",{staticClass:"text"},[t._v("任务总数")]),a("div",{staticClass:"text"},[t._v(t._s(t.systemInfo.jobCount))])]),a("i",{staticClass:"el-icon-s-custom"})])]),a("el-col",{attrs:{span:6}},[a("div",{staticClass:"wrap"},[a("div",{staticClass:"grid-content bg-purple"},[a("div",{staticClass:"text"},[t._v("当前运行实例数")]),a("div",{staticClass:"text"},[t._v(t._s(t.systemInfo.runningInstanceCount))])]),a("i",{staticClass:"el-icon-s-custom"})])]),a("el-col",{attrs:{span:6}},[a("div",{staticClass:"wrap"},[a("div",{staticClass:"grid-content bg-purple"},[a("div",{staticClass:"text"},[t._v("近期失败任务数")]),a("div",{staticClass:"text"},[t._v(t._s(t.systemInfo.failedInstanceCount))])]),a("i",{staticClass:"el-icon-s-custom"})])]),a("el-col",{attrs:{span:6}},[a("div",{staticClass:"wrap"},[a("div",{staticClass:"grid-content bg-purple"},[a("div",{staticClass:"text"},[t._v("集群机器数")]),a("div",{staticClass:"text"},[t._v(t._s(t.activeWorkerCount))])]),a("i",{staticClass:"el-icon-s-custom"})])])],1),a("el-row",[a("el-col",{attrs:{span:24}},[a("el-table",{staticStyle:{width:"100%"},attrs:{data:t.workerList,height:"400px","row-class-name":t.workerTableRowClassName}},[a("el-table-column",{attrs:{prop:"address",label:"机器地址"}}),a("el-table-column",{attrs:{prop:"cpuLoad",label:"CPU占用"}}),a("el-table-column",{attrs:{prop:"memoryLoad",label:"内存占用"}}),a("el-table-column",{attrs:{prop:"diskLoad",label:"磁盘占用"}})],1)],1)],1)],1)},n=[],i={name:"Home",data:function(){return{systemInfo:{jobCount:"N/A",runningInstanceCount:"N/A",failedInstanceCount:"N/A"},activeWorkerCount:"N/A",workerList:[]}},methods:{workerTableRowClassName:function(t){var s=t.row;switch(s.status){case 1:return"success-row";case 2:return"warning-row";case 3:return"error-row"}}},mounted:function(){var t=this,s=t.$store.state.appInfo.id;t.axios.get("/system/overview?appId="+s).then((function(s){return t.systemInfo=s})),t.axios.get("/system/listWorker?appId="+s).then((function(s){t.workerList=s,t.activeWorkerCount=t.workerList.length}))}},o=i,r=(a("ba4d"),a("6337"),a("2877")),c=Object(r["a"])(o,e,n,!1,null,"9781a346",null);s["default"]=c.exports},ba4d:function(t,s,a){"use strict";var e=a("ff73"),n=a.n(e);n.a},ff73:function(t,s,a){},ffdc:function(t,s,a){}}]);
|
||||
//# sourceMappingURL=chunk-29e8f75a.a9aa0f8f.js.map
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,2 @@
|
||||
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-7602a25e"],{"1ddd":function(e,t,i){"use strict";i.r(t);var s=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{attrs:{id:"welcome"}},[i("div",{attrs:{id:"entrance"}},[i("el-select",{attrs:{filterable:"",remote:"","reserve-keyword":"",placeholder:"请输入应用名称","remote-method":e.fetchAppNames,loading:e.loading},on:{change:e.selectedApp},model:{value:e.selectedAppInfo,callback:function(t){e.selectedAppInfo=t},expression:"selectedAppInfo"}},e._l(e.appInfoList,(function(e){return i("el-option",{key:e.id,attrs:{label:e.appName,value:e}})})),1)],1),i("div",{attrs:{id:"register"}},[i("el-button",{attrs:{type:"primary",plain:""},on:{click:function(t){e.appRegisterFormVisible=!0}}},[e._v("应用注册")]),i("el-button",{attrs:{type:"success",plain:""},on:{click:function(t){e.userRegisterFormVisible=!0}}},[e._v("用户注册")])],1),i("el-dialog",{attrs:{title:"应用注册",visible:e.appRegisterFormVisible},on:{"update:visible":function(t){e.appRegisterFormVisible=t}}},[i("el-form",{attrs:{model:e.appRegisterForm}},[i("el-form-item",{attrs:{label:"应用名称"}},[i("el-input",{model:{value:e.appRegisterForm.appName,callback:function(t){e.$set(e.appRegisterForm,"appName",t)},expression:"appRegisterForm.appName"}})],1),i("el-form-item",{attrs:{label:"应用描述"}},[i("el-input",{model:{value:e.appRegisterForm.description,callback:function(t){e.$set(e.appRegisterForm,"description",t)},expression:"appRegisterForm.description"}})],1),i("el-form-item",[i("el-button",{attrs:{type:"primary"},on:{click:e.registerApp}},[e._v("注册")]),i("el-button",{on:{click:function(t){e.appRegisterFormVisible=!1}}},[e._v("取消")])],1)],1)],1),i("el-dialog",{attrs:{title:"用户注册",visible:e.userRegisterFormVisible},on:{"update:visible":function(t){e.userRegisterFormVisible=t}}},[i("el-form",{attrs:{model:e.userRegisterForm}},[i("el-form-item",{attrs:{label:"姓名"}},[i("el-input",{model:{value:e.userRegisterForm.username,callback:function(t){e.$set(e.userRegisterForm,"username",t)},expression:"userRegisterForm.username"}})],1),i("el-form-item",{attrs:{label:"手机号"}},[i("el-input",{model:{value:e.userRegisterForm.phone,callback:function(t){e.$set(e.userRegisterForm,"phone",t)},expression:"userRegisterForm.phone"}})],1),i("el-form-item",{attrs:{label:"邮箱地址"}},[i("el-input",{model:{value:e.userRegisterForm.email,callback:function(t){e.$set(e.userRegisterForm,"email",t)},expression:"userRegisterForm.email"}})],1),i("el-form-item",[i("el-button",{attrs:{type:"primary"},on:{click:e.registerUser}},[e._v("注册")]),i("el-button",{on:{click:function(t){e.userRegisterFormVisible=!1}}},[e._v("取消")])],1)],1)],1)],1)},r=[],o={name:"Welcome",data:function(){return{selectedAppInfo:{},appInfoList:[],appRegisterFormVisible:!1,userRegisterFormVisible:!1,appRegisterForm:{appName:"",description:""},userRegisterForm:{username:"",phone:"",email:""}}},methods:{fetchAppNames:function(e){var t=this,i="/appInfo/list?condition="+e;this.axios.get(i).then((function(e){t.appInfoList=e}),(function(e){return t.$message.error(e)}))},selectedApp:function(){this.$store.commit("initAppInfo",this.selectedAppInfo),this.$router.push("/oms/home")},registerApp:function(){var e=this;this.axios.post("/appInfo/save",this.appRegisterForm).then((function(){e.$message.success("应用注册成功!"),e.appRegisterFormVisible=!1}),e.appRegisterFormVisible=!1)},registerUser:function(){var e=this;this.axios.post("/user/save",this.userRegisterForm).then((function(){e.$message.success("用户注册成功!"),e.userRegisterFormVisible=!1}),e.userRegisterFormVisible=!1)}}},n=o,a=(i("570a"),i("2877")),l=Object(a["a"])(n,s,r,!1,null,"175a435c",null);t["default"]=l.exports},4112:function(e,t,i){},"570a":function(e,t,i){"use strict";var s=i("4112"),r=i.n(s);r.a}}]);
|
||||
//# sourceMappingURL=chunk-7602a25e.165fb79d.js.map
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -27,19 +27,23 @@
|
||||
|
||||
* 运行配置
|
||||
* 最大实例数:该任务同时执行的数量(任务和实例就像是类和对象的关系,任务被调度执行后被称为实例)
|
||||
* 单机线程并发数:该实例执行过程中每台机器使用的线程数量(MapReduce任务生效,其余无论填什么,实际都是1,因为用不到多个线程...)
|
||||
* 运行时间限制:限定任务的最大运行时间,超时则视为失败,单位毫秒,0代表不限制超时时间。
|
||||
* 单机线程并发数:该实例执行过程中每个Worker使用的线程数量(MapReduce任务生效,其余无论填什么,都只会使用1个线程或3个线程...)
|
||||
* 运行时间限制:限定任务的最大运行时间,超时则视为失败,单位**毫秒**,0代表不限制超时时间。
|
||||
|
||||
* 重试配置:
|
||||
* 任务重试次数:实例级别,失败了整个重试。
|
||||
* 子任务重试次数:MapReduce和广播执行模式下生效,每个子Task失败后单独重试。
|
||||
* 任务重试次数:实例级别,失败了整个重试,会更换TaskTracker(本次任务实例的Master节点)。
|
||||
* 子任务重试次数:Task级别,每个子Task失败后单独重试,会更换ProcessorTracker(本次任务实际执行的Worker节点)。
|
||||
* 注:对于单机任务来说,假如任务重试次数和子任务重试次数都配置了1且都执行失败,实际执行次数会变成4次!推荐任务实例重试配置为0,子任务重试次数根据实际情况配置。
|
||||
|
||||
* 机器配置:用来标明允许执行任务的机器状态,避开那些摇摇欲坠的机器,0代表无任何限制。
|
||||
* 最低CPU核心数:填写浮点数,CPU可用核心数小于该值的Worker将不会执行该任务。
|
||||
* 最低内存(GB):填写浮点数,可用内存小于该值的Worker将不会执行该任务。
|
||||
* 最低磁盘(GB):填写浮点数,可用磁盘空间小于该值的Worker将不会执行该任务。
|
||||
* 集群配置
|
||||
* 执行机器地址:指定集群中的某几台机器执行任务(debug的好帮手)
|
||||
* 执行机器地址:指定集群中的某几台机器执行任务(debug的好帮手),多值英文逗号分割,如`192.168.1.1:27777,192.168.1.2:27777`
|
||||
* 最大执行机器数量:限定调动执行的机器数量
|
||||
|
||||
* 报警配置:预计由报警方式和报警人两个下拉框组成。
|
||||
* 报警配置:选择任务执行失败后报警通知的对象。
|
||||
|
||||
### 任务管理
|
||||
>可以方便地查看和管理系统当前录入的任务信息。
|
||||
@ -53,13 +57,26 @@
|
||||
|
||||
|
||||
# 处理器开发
|
||||
>搭载处理器的宿主应用需要添加`oh-my-scheduler-worker`依赖。
|
||||
>搭载处理器的宿主应用需要添加`oh-my-scheduler-worker`依赖,然后编写实现指定接口或抽象类的Java类即可。
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>com.github.kfcfans</groupId>
|
||||
<artifactId>oh-my-scheduler-worker</artifactId>
|
||||
<version>${oms.worker.latest.version}</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
### 单机处理器
|
||||
>单机执行的策略下,server会在所有可用worker中选取健康度最佳的机器进行执行。单机执行任务需要实现接口:`com.github.kfcfans.oms.worker.core.processor.sdk.BasicProcessor`,代码示例如下:
|
||||
|
||||
```java
|
||||
@Componet
|
||||
public class BasicProcessorDemo implements BasicProcessor {
|
||||
|
||||
// 支持 Spring Bean
|
||||
@Resource
|
||||
private MysteryService mysteryService;
|
||||
|
||||
@Override
|
||||
public ProcessResult process(TaskContext context) throws Exception {
|
||||
@ -67,7 +84,8 @@ public class BasicProcessorDemo implements BasicProcessor {
|
||||
// TaskContext为任务的上下文信息,包含了在控制台录入的任务元数据,常用字段为
|
||||
// jobParams(任务参数,在控制台录入),instanceParams(任务实例参数,通过 OpenAPI 触发的任务实例才可能存在该参数)
|
||||
|
||||
// 进行实际处理...
|
||||
// 可以根据控制台传递的参数进行实际处理...
|
||||
mysteryService.hasaki(context.getJobParams());
|
||||
|
||||
// 返回结果,该结果会被持久化到数据库,在前端页面直接查看,极为方便
|
||||
return new ProcessResult(true, "result is xxx");
|
||||
@ -174,6 +192,14 @@ public class MapReduceProcessorDemo extends MapReduceProcessor {
|
||||
# OpenAPI
|
||||
>OpenAPI允许开发者通过接口来完成手工的操作,让系统整体变得更加灵活,启用OpenAPI需要依赖`oh-my-scheduler-client`库。
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>com.github.kfcfans</groupId>
|
||||
<artifactId>oh-my-scheduler-client</artifactId>
|
||||
<version>${oms.client.latest.version}</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
### 简单示例
|
||||
```java
|
||||
// 初始化 client,需要server地址和应用名称作为参数
|
||||
|
7
pom.xml
7
pom.xml
@ -53,6 +53,7 @@
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
<lombok.version>1.18.12</lombok.version>
|
||||
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
@ -105,6 +106,12 @@
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>${maven-javadoc-plugin.version}</version>
|
||||
<configuration>
|
||||
<!-- JavaDoc 编译错误不影响正常构建 -->
|
||||
<failOnError>false</failOnError>
|
||||
<!-- 非严格模式...以后要好好按格式写注释啊... -->
|
||||
<additionalJOption>-Xdoclint:none</additionalJOption>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
|
Loading…
x
Reference in New Issue
Block a user