{"id":21594192,"url":"https://github.com/justlive1/oxygen","last_synced_at":"2025-04-05T21:07:34.925Z","repository":{"id":34657854,"uuid":"150673713","full_name":"justlive1/oxygen","owner":"justlive1","description":"一个轻量级Java框架，包含ioc、aop、config、cache、job、Jdbc、web等","archived":false,"fork":false,"pushed_at":"2025-01-08T16:09:33.000Z","size":1446,"stargazers_count":119,"open_issues_count":4,"forks_count":11,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-29T20:05:12.384Z","etag":null,"topics":["framework","light","light-framework","lightframework"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/justlive1.png","metadata":{"files":{"readme":"README-zh.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-09-28T02:19:57.000Z","updated_at":"2024-11-20T09:49:58.000Z","dependencies_parsed_at":"2025-01-20T14:24:56.782Z","dependency_job_id":"1b8a8595-1e72-458c-bdfb-8878d9e74dbb","html_url":"https://github.com/justlive1/oxygen","commit_stats":null,"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justlive1%2Foxygen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justlive1%2Foxygen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justlive1%2Foxygen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justlive1%2Foxygen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/justlive1","download_url":"https://codeload.github.com/justlive1/oxygen/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247399877,"owners_count":20932876,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["framework","light","light-framework","lightframework"],"created_at":"2024-11-24T17:16:28.498Z","updated_at":"2025-04-05T21:07:34.918Z","avatar_url":"https://github.com/justlive1.png","language":"Java","readme":"# oxygen\r\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/vip.justlive/oxygen/badge.svg)](https://maven-badges.herokuapp.com/maven-central/vip.justlive/oxygen/)\r\n[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)\r\n\r\n\r\n轻量级Java框架，支持JDK21，支持模块化\r\n\r\n\r\n\r\n## 介绍\r\n\r\n一个轻量级Java框架\r\n\r\n- oxygen-core\r\n  - 配置管理，支持${attrs.key:defaultValue}表达式获取配置\r\n  - 加解密管理，提供加解密服务内置基础加密实现，例如SHA-1、SHA-256、MD5\r\n  - 异常管理，提供异常包装，统一异常编码，便于国际化\r\n  - i18n国际化\r\n  - 资源文件加载，提供file,jar,classpath等文件加载\r\n  - 类扫描器\r\n  - 基于构造器的轻量级依赖注入\r\n  - 缓存\r\n  - 提供基于注解`Scheduled`的定时任务\r\n  - 可使用注解`Aspect`或直接实现`Interceptor`编写切面\r\n  - 部分工具类\r\n\r\n- oxygen-jdbc\r\n  - 小巧简单的jdbc实现，纯jdk实现，无第三方jar\r\n  - 支持多数据源\r\n  - 基于sql进行crud，不提供类似Hibernate的链式方法（原因：sql作为数据库领域的DSL，已经很自然优雅，Less is more）\r\n\r\n- oxygen-web\r\n  - 轻量级web框架支持注解声明和函数式编程\r\n  - 支持Servlet3.0 `ServletContainerInitializer` 自动加载，省略web.xml\r\n  - 支持i18n动态切换\r\n  - 提供`WebHook`进行请求拦截处理\r\n  - 支持自定义全局异常处理\r\n  - 内置aio服务器\r\n\r\n\r\n## 特性\r\n\r\n* 轻量级，使用简单\r\n* 支持插件扩展\r\n* 函数式编程\r\n* 流式风格\r\n\r\n\r\n## 快速开始\r\n\r\n创建`Maven`项目\r\n\r\n```xml\r\n\u003c!-- tomcat,jetty,undertow --\u003e\r\n\u003cproperties\u003e\r\n  \u003coxygen.server\u003e-tomcat\u003c/oxygen.server\u003e\r\n\u003c/properties\u003e\r\n\r\n\u003c!-- 使用内嵌容器启动 --\u003e\r\n\u003cdependency\u003e\r\n    \u003cgroupId\u003evip.justlive\u003c/groupId\u003e\r\n    \u003cartifactId\u003eoxygen-web${oxygen.server}\u003c/artifactId\u003e\r\n    \u003cversion\u003e${oxygen.version}\u003c/version\u003e\r\n\u003c/dependency\u003e\r\n```\r\n\r\n或`Gradle`\r\n\r\n```\r\ncompile 'vip.justlive:oxygen-web-tomcat:$oxygenVersion'\r\n```\r\n\r\n\u003e 不需要`webapp`项目框架，支持Servlet3.0\r\n\r\n编写 `main` 函数写一个 `Hello World`\r\n\r\n```java\r\npublic static void main(String[] args) {\r\n  Router.router().path(\"/\").handler(ctx -\u003e ctx.response().write(\"hello world\"));\r\n  Server.listen(8080);\r\n}\r\n```\r\n\r\n用浏览器打开 http://localhost:8080 这样就可以看到 `hello world` 了！\r\n\r\n## 内容详解\r\n- [**`注册路由`**](#注册路由)\r\n  - [**`硬编码方式`**](#硬编码方式)\r\n  - [**`注解方式`**](#注解方式)\r\n- [**`获取请求参数`**](#获取请求参数)\r\n  - [**`表单参数或json请求参数`**](#表单参数或json请求参数)\r\n  - [**`restful参数`**](#restful参数)\r\n  - [**`header参数`**](#header参数)\r\n  - [**`cookie参数`**](#cookie参数)\r\n  - [**`参数转对象`**](#参数转对象)\r\n- [**`静态资源`**](#静态资源)\r\n- [**`上传文件`**](#上传文件)\r\n- [**`结果渲染`**](#结果渲染)\r\n  - [**`渲染json`**](#渲染json)\r\n  - [**`渲染文本`**](#渲染文本)\r\n  - [**`渲染html`**](#渲染html)\r\n  - [**`渲染模板`**](#渲染模板)\r\n  - [**`重定向`**](#重定向)\r\n  - [**`写入cookie`**](#写入cookie)\r\n  - [**`添加header`**](#添加header)\r\n  - [**`写入session`**](#写入session)\r\n- [**`拦截器`**](#拦截器)\r\n- [**`异常处理`**](#异常处理)\r\n- [**`部署项目`**](#部署项目)\r\n  - [**`修改端口`**](#修改端口)\r\n  - [**`运行项目`**](#运行项目)\r\n      \r\n### 注册路由\r\n#### 硬编码方式\r\n```java\r\nRouter.router().path(\"/\").handler(ctx -\u003e ctx.response().write(\"hello world\"));\r\nRouter.router().path(\"/get\").method(HttpMethod.GET).handler(get);\r\nRouter.router().path(\"/post\").method(HttpMethod.POST).handler(post);\r\n```\r\n\r\n#### 注解方式\r\n```java\r\n@Router(\"/book\")\r\npublic class BookRouter {\r\n  \r\n  // 视图\r\n  @Mapping(\"/\")\r\n  public ViewResult index() {\r\n    return Result.view(\"/book.html\");\r\n  }\r\n  \r\n  // json\r\n  @Mapping(value = \"/ajax\", method = {HttpMethod.POST})\r\n  public Book find(RoutingContext ctx) {\r\n    // ...\r\n    return new Book();\r\n  }\r\n}\r\n```\r\n\r\n### 获取请求参数\r\n#### 表单参数或json请求参数\r\n\r\n项目将json请求参数与表单参数合并，使用相同的方法或注解获取\r\n\r\n**使用RoutingContext获取**\r\n```java\r\nRouter.router().path(\"/\").handler(ctx -\u003e {\r\n  String id = ctx.request().getParam(\"id\");\r\n  ctx.response().write(id);\r\n});\r\n```\r\n**使用注解获取**\r\n```java\r\n@Mapping(value = \"/ajax\", method = {HttpMethod.POST})\r\npublic Book find(@Param Long id, @Param(\"tp\") String type) {\r\n  // ...\r\n  return new Book();\r\n}\r\n```\r\n\r\n#### restful参数\r\n\r\n**使用RoutingContext获取**\r\n```java\r\nRouter.router().path(\"/{id}\").handler(ctx -\u003e {\r\n  String id = ctx.request().getPathVariable(\"id\");\r\n  ctx.response().write(id);\r\n});\r\n```\r\n**使用注解获取**\r\n```java\r\n@Mapping(value = \"/{id}\", method = {HttpMethod.POST})\r\npublic void ajax(@PathParam(\"id\") Long id) {\r\n  // ...\r\n}\r\n```\r\n\r\n#### header参数\r\n\r\n**使用RoutingContext获取**\r\n```java\r\nRouter.router().path(\"/\").handler(ctx -\u003e {\r\n  String id = ctx.request().getHeader(\"id\");\r\n  ctx.response().write(id);\r\n});\r\n```\r\n**使用注解获取**\r\n```java\r\n@Mapping(value = \"/\", method = {HttpMethod.POST})\r\npublic void ajax(@HeaderParam(\"id\") Long id) {\r\n  // ...\r\n}\r\n```\r\n\r\n#### cookie参数\r\n\r\n**使用RoutingContext获取**\r\n```java\r\nRouter.router().path(\"/\").handler(ctx -\u003e {\r\n  String id = ctx.request().getCookie(\"id\");\r\n  ctx.response().write(id);\r\n});\r\n```\r\n**使用注解获取**\r\n```java\r\n@Mapping(value = \"/\", method = {HttpMethod.POST})\r\npublic void ajax(@CookieParam(\"id\") Long id) {\r\n  // ...\r\n}\r\n```\r\n\r\n#### 参数转对象\r\n\r\n**实体类**\r\n```java\r\n@Data\r\npublic class Book {\r\n  private String name;\r\n  private String author;\r\n}\r\n```\r\n\r\n**使用RoutingContext转换**\r\n```java\r\nRouter.router().path(\"/\").handler(ctx -\u003e {\r\n  // 表单或json请求参数绑定\r\n  Book book = ctx.bindParam(Book.class);\r\n  // cookie参数绑定\r\n  book = ctx.bindCookie(Book.class);\r\n  // header参数绑定\r\n  book = ctx.bindHeader(Book.class);\r\n  // restful参数绑定\r\n  book = ctx.bindPathVariables(Book.class);\r\n});\r\n```\r\n**使用注解获取**\r\n```java\r\n@Mapping(value = \"/\", method = {HttpMethod.POST})\r\npublic void ajax(@Param Book b1, @CookieParam Book b2, @HeaderParam Book b3, @PathParam Book b4) {\r\n  // ...\r\n}\r\n```\r\n\r\n### 静态资源\r\n\r\n内置默认将`classpath`下`/public,/static`作为静态资源目录，支持`webjars`，映射到`/public`\r\n\r\n自定义静态资源可使用下面代码\r\n```java\r\nRouter.staticRoute().prefix(\"/lib\").location(\"classpath:lib\");\r\n```\r\n也可以通过配置文件指定\r\n```properties\r\nweb.static.prefix=/public\r\nweb.static.path=/public,/static,classpath:/META-INF/resources/webjars\r\n```\r\n\r\n### 上传文件\r\n\r\n**使用RoutingContext获取**\r\n```java\r\nRouter.router().path(\"/\").handler(ctx -\u003e {\r\n  MultipartItem file = ctx.request().getMultipartItem(\"file\");\r\n  // ...\r\n});\r\n```\r\n**使用注解获取**\r\n```java\r\n@Mapping(\"/\")\r\npublic void upload(MultipartItem image, @MultipartParam(\"file1\") MultipartItem file) {\r\n  // 不使用注解则使用方法参数名作为请求参数名称\r\n  // 使用注解指定请求参数名称\r\n}\r\n```\r\n\r\n### 结果渲染\r\n\r\n#### 渲染json\r\n```java\r\n// 使用RoutingContext返回\r\nRouter.router().path(\"/\").handler(ctx -\u003e {\r\n  ctx.response().json(new Book(\"Java\", \"xxx\"));\r\n});\r\n\r\n// 注解式\r\n@Mapping(\"/\")\r\npublic Book find() {\r\n  // 直接返回对象，框架默认处理成json\r\n  return new Book(\"Java\", \"xxx\");\r\n}\r\n```\r\n\r\n#### 渲染文本\r\n```java\r\n// 使用RoutingContext返回\r\nRouter.router().path(\"/\").handler(ctx -\u003e {\r\n  ctx.response().text(\"hello world\");\r\n});\r\n```\r\n\r\n#### 渲染html\r\n```java\r\n// 使用RoutingContext返回\r\nRouter.router().path(\"/\").handler(ctx -\u003e {\r\n  ctx.response().html(\"\u003chtml\u003e\u003cbody\u003e\u003cspan\u003ehello world\u003c/span\u003e\u003c/body\u003e\u003c/html\u003e\");\r\n});\r\n```\r\n\r\n#### 渲染模板\r\n内置支持了`jsp`和`thymeleaf`模板，默认对应`resources`下的`WEB-INF`和`templates`目录\r\n```properties\r\n# 可通过下面配置进行更改模板目录\r\nweb.view.jsp.prefix=WEB-INF\r\nweb.view.thymeleaf.prefix=/templates\r\n```\r\n模板使用\r\n```java\r\n// 使用RoutingContext\r\nRouter.router().path(\"/\").handler(ctx -\u003e {\r\n  ctx.response().template(\"index.html\");\r\n});\r\n\r\nRouter.router().path(\"/\").handler(ctx -\u003e {\r\n  Map\u003cString, Object\u003e attrs = new HashMap\u003c\u003e();\r\n  // ...\r\n  ctx.response().template(\"index.html\", attrs);\r\n});\r\n\r\n// 注解式\r\n@Mapping(\"/\")\r\npublic Result index() {\r\n  return Result.view(\"index.html\");\r\n}\r\n\r\n@Mapping(\"/\")\r\npublic Result index() {\r\n  Map\u003cString, Object\u003e attrs = new HashMap\u003c\u003e();\r\n  // ...\r\n  return Result.view(\"index.html\").addAttributes(attrs);\r\n}\r\n```\r\n\r\n#### 重定向\r\n\r\n```java\r\nRouter.router().path(\"/\").handler(ctx -\u003e {\r\n  ctx.response().redirect(\"https://github.com/justlive1\");\r\n});\r\n\r\n@Mapping(\"/a\")\r\npublic Result index() {\r\n  // 内部地址 相对于根目录: /b\r\n  // return Result.redirect(\"/b\"); \r\n  // 内部地址 相对于当前路径: /a/b\r\n  // return Result.redirect(\"b\");\r\n  // 协议地址\r\n  return Result.redirect(\"https://github.com/justlive1\");\r\n}\r\n```\r\n\r\n#### 写入cookie\r\n\r\n```java\r\n@Mapping(\"/\")\r\npublic void index(RoutingContext ctx) {\r\n  ctx.response().setCookie(\"hello\", \"world\");\r\n  ctx.response().setCookie(\"java\", \"script\", 100);\r\n  ctx.response().setCookie(\"uid\", \"xxx\", \".justlive.vip\", \"/\", 3600, true);\r\n}\r\n```\r\n\r\n#### 添加header\r\n\r\n```java\r\n@Mapping(\"/\")\r\npublic void index(RoutingContext ctx) {\r\n  ctx.response().setHeader(\"hello\", \"world\");\r\n}\r\n```\r\n\r\n#### 写入session\r\n\r\n```java\r\n@Mapping(\"/\")\r\npublic void index(RoutingContext ctx) {\r\n  ctx.request().getSession().put(\"key\", \"value\");\r\n}\r\n```\r\n\r\n### 拦截器\r\n\r\n`WebHook`是拦截器接口，可以实现执行前、执行后和结束拦截处理\r\n\r\n```java\r\n@Slf4j\r\n@Bean\r\npublic class LogWebHook implements WebHook {\r\n  @Override\r\n  public boolean before(RoutingContext ctx) {\r\n    log.info(\"before\");\r\n    return true;\r\n  }\r\n  @Override\r\n  public void after(RoutingContext ctx) {\r\n    log.info(\"after\");\r\n  }\r\n  @Override\r\n  public void finished(RoutingContext ctx) {\r\n    log.info(\"finished\");\r\n  }\r\n}\r\n```\r\n\r\n### 异常处理\r\n\r\n框架默认提供了一个异常处理器，如需自定义处理异常，可以像下面这样使用\r\n\r\n```java\r\n@Bean\r\npublic class CustomExceptionHandler extends ExceptionHandlerImpl {\r\n\r\n  @Override\r\n  public void handle(RoutingContext ctx, Exception e, int status) {\r\n    if (e instanceof CustomException) {\r\n      // do something\r\n    } else {\r\n      super.handle(ctx, e, status);\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n### 部署项目\r\n\r\n#### 修改端口\r\n\r\n**编码指定**\r\n```java\r\nServer.listen(8080);\r\n```\r\n**配置文件**\r\n```properties\r\noxygen.server.port=8081\r\n```\r\n**启动命令**\r\n```bash\r\njava -jar -Doxygen.server.port=8090 app.jar\r\n```\r\n\r\n#### 运行项目\r\n\r\n**使用内嵌容器启动**\r\n\r\n启动类\r\n```java\r\npublic class Application {\r\n  public static void main(String[] args) {\r\n    Server.listen();\r\n  }\r\n}\r\n```\r\n通用打包方式\r\n- `${mainClass}`为上面的启动类\r\n- 会生成`lib`目录存放依赖`jar`\r\n```xml\r\n\u003cbuild\u003e\r\n  \u003cplugins\u003e\r\n    \u003cplugin\u003e\r\n      \u003cgroupId\u003eorg.apache.maven.plugins\u003c/groupId\u003e\r\n      \u003cartifactId\u003emaven-compiler-plugin\u003c/artifactId\u003e\r\n      \u003cconfiguration\u003e\r\n        \u003csource\u003e${maven.compiler.source}\u003c/source\u003e\r\n        \u003ctarget\u003e${maven.compiler.target}\u003c/target\u003e\r\n        \u003cencoding\u003eUTF-8\u003c/encoding\u003e\r\n      \u003c/configuration\u003e\r\n    \u003c/plugin\u003e\r\n    \u003cplugin\u003e\r\n      \u003cgroupId\u003eorg.apache.maven.plugins\u003c/groupId\u003e\r\n      \u003cartifactId\u003emaven-jar-plugin\u003c/artifactId\u003e\r\n      \u003cconfiguration\u003e\r\n        \u003carchive\u003e\r\n          \u003cmanifest\u003e\r\n            \u003caddClasspath\u003etrue\u003c/addClasspath\u003e\r\n            \u003cclasspathPrefix\u003elib/\u003c/classpathPrefix\u003e\r\n            \u003cmainClass\u003e${mainClass}\u003c/mainClass\u003e\r\n          \u003c/manifest\u003e\r\n        \u003c/archive\u003e\r\n      \u003c/configuration\u003e\r\n    \u003c/plugin\u003e\r\n    \u003cplugin\u003e\r\n      \u003cgroupId\u003eorg.apache.maven.plugins\u003c/groupId\u003e\r\n      \u003cartifactId\u003emaven-dependency-plugin\u003c/artifactId\u003e\r\n      \u003cexecutions\u003e\r\n        \u003cexecution\u003e\r\n          \u003cid\u003ecopy\u003c/id\u003e\r\n          \u003cphase\u003epackage\u003c/phase\u003e\r\n          \u003cgoals\u003e\r\n            \u003cgoal\u003ecopy-dependencies\u003c/goal\u003e\r\n          \u003c/goals\u003e\r\n          \u003cconfiguration\u003e\r\n            \u003coutputDirectory\u003e${project.build.directory}/lib\u003c/outputDirectory\u003e\r\n          \u003c/configuration\u003e\r\n        \u003c/execution\u003e\r\n      \u003c/executions\u003e\r\n    \u003c/plugin\u003e\r\n  \u003c/plugins\u003e\r\n\u003c/build\u003e\r\n```\r\n\r\n打成`fat-jar`:\r\n- 使用springboot打包插件\r\n```xml\r\n\u003cbuild\u003e\r\n  \u003cplugins\u003e\r\n    \u003cplugin\u003e\r\n      \u003cgroupId\u003eorg.springframework.boot\u003c/groupId\u003e\r\n      \u003cartifactId\u003espring-boot-maven-plugin\u003c/artifactId\u003e\r\n      \u003cversion\u003e1.3.8.RELEASE\u003c/version\u003e\r\n      \u003cexecutions\u003e\r\n        \u003cexecution\u003e\r\n          \u003cphase\u003epackage\u003c/phase\u003e\r\n          \u003cgoals\u003e\r\n            \u003cgoal\u003erepackage\u003c/goal\u003e\r\n          \u003c/goals\u003e\r\n        \u003c/execution\u003e\r\n      \u003c/executions\u003e\r\n    \u003c/plugin\u003e\r\n  \u003c/plugins\u003e\r\n\u003c/build\u003e\r\n```\r\n\r\n**使用外部容器（jetty、tomcat等）**\r\n\r\n无需web.xml配置，打包成`war`放入容器即可，实现机制可查看`WebContainerInitializer`\r\n\r\n```xml\r\n\u003c!-- 解决默认打war包报错 webxml attribute is required --\u003e\r\n\u003cproperties\u003e\r\n  \u003cfailOnMissingWebXml\u003efalse\u003c/failOnMissingWebXml\u003e\r\n\u003c/properties\u003e\r\n```\r\n\r\n### 外部化配置\r\n\r\n框架可以通过使用配置文件进行修改默认属性\r\n```properties\r\n##### 基础配置\r\n# 配置覆盖地址，用户外部配置覆盖项目配置 例 file:/config/*.properties,classpath*:/config/*.properties,xx.properties\r\noxygen.config.override.path=\r\n# 类扫描路径属性\r\noxygen.class.scan=vip.justlive\r\n# 临时文件根目录\r\noxygen.temp.dir=.oxygen\r\n# 缓存实现类，自定义缓存时使用\r\noxygen.cache.class=\r\n\r\n\r\n##### web \r\n# embedded 启动端口\r\noxygen.server.port=8080\r\n# context path\r\noxygen.server.contextPath=\r\n# session失效时间，单位秒\r\noxygen.web.session.expired=3600\r\n# 默认静态资源请求前缀\r\noxygen.web.static.prefix=/public\r\n# 默认静态资源目录\r\noxygen.web.static.path=/public,/static,classpath:/META-INF/resources/webjars\r\n# 静态资源缓存时间\r\noxygen.web.static.cache=3600\r\n# jsp路径前缀\r\noxygen.web.view.jsp.prefix=WEB-INF\r\n# thymeleaf 路径前缀\r\noxygen.web.view.thymeleaf.prefix=/templates\r\n# thymeleaf 视图后缀\r\noxygen.web.view.thymeleaf.suffix=.html\r\n# freemarker 路径前缀\r\noxygen.web.view.freemarker.prefix=/templates\r\n# 内置简单视图处理 路径前缀\r\noxygen.web.view.simple.prefix=/templates\r\n# 内置简单视图处理 视图后缀\r\noxygen.web.view.simple.suffix=.htm\r\n# 是否开启模板缓存\r\noxygen.web.view.cache.enabled=true\r\n\r\n\r\n##### 定时任务job\r\n# job线程名称格式\r\noxygen.job.threadNameFormat=jobs-%d\r\n# job核心线程池大小\r\noxygen.job.corePoolSize=10\r\n\r\n\r\n##### i18n国际化\r\n# i18n配置文件地址\r\noxygen.i18n.path=classpath:message/*.properties\r\n# i18n默认语言\r\noxygen.i18n.language=zh\r\n# i18n默认国家\r\noxygen.i18n.country=CN\r\n# i18n参数key\r\noxygen.i18n.param.key=locale\r\n# i18n Session key\r\noxygen.i18n.session.key=I18N_SESSION_LOCALE\r\n\r\n\r\n##### jetty\r\n# 虚拟主机\r\noxygen.server.jetty.virtualHosts=\r\n# 连接器在空闲状态持续该时间后（单位毫秒）关闭\r\noxygen.server.jetty.idleTimeout=30000\r\n# 温和的停止一个连接器前等待的时间（毫秒）\r\noxygen.server.jetty.stopTimeout=30000\r\n# 等待处理的连接队列大小\r\noxygen.server.jetty.acceptQueueSize=\r\n# 允许Server socket被重绑定，即使在TIME_WAIT状态\r\noxygen.server.jetty.reuseAddress=true\r\n# 是否启用servlet3.0特性\r\noxygen.server.jetty.configurationDiscovered=true\r\n# 最大表单数据大小\r\noxygen.server.jetty.maxFormContentSize=256 * 1024 * 1024\r\n# 最大表单键值对数量\r\noxygen.server.jetty.maxFormKeys=200\r\n\r\n\r\n##### tomcat\r\n# 最大请求队列数\r\noxygen.server.tomcat.acceptCount=100\r\n# 最大连接数\r\noxygen.server.tomcat.maxConnections=5000\r\n# 最大工作线程数\r\noxygen.server.tomcat.maxThreads=200\r\n# 最小线程数\r\noxygen.server.tomcat.minSpareThreads=10\r\n# 最大请求头数据大小\r\noxygen.server.tomcat.maxHttpHeaderSize=8 * 1024\r\n# 最大表单数据大小\r\noxygen.server.tomcat.maxHttpPostSize=2 * 1024 * 1024\r\n# 连接超时\r\noxygen.server.tomcat.connectionTimeout=20000\r\n# URI解码编码\r\noxygen.server.tomcat.uriEncoding=utf-8\r\n# 调用backgroundProcess延迟时间\r\noxygen.server.tomcat.backgroundProcessorDelay=10\r\n# 是否启用访问日志\r\noxygen.server.tomcat.accessLogEnabled=false\r\n# 访问日志是否开启缓冲\r\noxygen.server.tomcat.accessLogBuffered=true\r\n# 是否设置请求属性，ip、host、protocol、port\r\noxygen.server.tomcat.accessLogRequestAttributesEnabled=false\r\n# 每日日志格式\r\noxygen.server.tomcat.accessLogFileFormat=.yyyy-MM-dd\r\n# 日志格式\r\noxygen.server.tomcat.accessLogPattern=common\r\n\r\n\r\n\r\n##### undertow\r\n# 主机名\r\noxygen.server.undertow.host=0.0.0.0\r\n# io线程数\r\noxygen.server.undertow.ioThreads=\r\n# worker线程数\r\noxygen.server.undertow.workerThreads=\r\n# 是否开启gzip压缩\r\noxygen.server.undertow.gzipEnabled=false\r\n# gzip处理优先级\r\noxygen.server.undertow.gzipPriority=100\r\n# 压缩级别，默认值 -1。 可配置 1 到 9。 1 拥有最快压缩速度，9 拥有最高压缩率\r\noxygen.server.undertow.gzipLevel=-1\r\n# 触发压缩的最小内容长度\r\noxygen.server.undertow.gzipMinLength=1024\r\n# url是否允许特殊字符\r\noxygen.server.undertow.allowUnescapedCharactersInUrl=true\r\n# 是否开启http2\r\noxygen.server.undertow.http2enabled=false\r\n\r\n\r\n#### aio\r\n# aio服务连接空闲超时时间，单位毫秒\r\noxygen.server.aio.idleTimeout=10000\r\n# aio请求连接超时时间，负数为不超时\r\noxygen.server.aio.requestTimeout=-1\r\n# 连接线程数\r\noxygen.server.aio.acceptThreads=100\r\n# 连接线程最大等待数\r\noxygen.server.aio.acceptMaxWaiter=10000\r\n# 工作线程数\r\noxygen.server.aio.workerThreads=200\r\n# 工作线程最大等待数\r\noxygen.server.aio.workerMaxWaiter=1000000\r\n# 是否hold住端口，true的话随主线程退出而退出，false的话则要主动退出\r\noxygen.server.aio.daemon=false\r\n\r\n```\r\n\r\n## 联系信息\r\n\r\nE-mail: qq11419041@163.com","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjustlive1%2Foxygen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjustlive1%2Foxygen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjustlive1%2Foxygen/lists"}