项目作者: victoryofymk

项目描述 :
bubble is a common Spring boot framework.
高级语言: Java
项目地址: git://github.com/victoryofymk/bubble.git
创建时间: 2018-07-02T09:38:30Z
项目社区:https://github.com/victoryofymk/bubble

开源协议:

下载


本文简介

  1. # properties式语法描述
  2. spring.datasource.name = mysql
  3. spring.datasource.url = jdbc:mysql://localhost:3306/root?characterEncoding=utf-8
  4. spring.datasource.username = root
  5. spring.datasource.password = root
  6. # yml式语法描述
  7. spring:
  8. datasource:
  9. name: mysql
  10. url: jdbc:mysql://localhost:3306/root?characterEncoding=utf-8
  11. username: root
  12. password: root

编译工具

maven

多版本使用profile
本地库依赖
  1. mvn install
指定编译版本
  1. mvn install -Pdev
  2. IDE可以启动任何指定版本,需要clean后才会生效,IDEA需要配置启动前自定义编译MAVEN需要使用install和指定profile
指定打包译版本
  1. mvn clean package -Pdev

常用组件

基础依赖配置pom.xml文件中的常见依赖,例如Web、Mybatis、test以及Mysql

  1. <!-- spring web mvc -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <!-- mybatis -->
  7. <dependency>
  8. <groupId>org.mybatis.spring.boot</groupId>
  9. <artifactId>mybatis-spring-boot-starter</artifactId>
  10. <version>1.3.1</version>
  11. </dependency>
  12. <!-- mysql -->
  13. <dependency>
  14. <groupId>mysql</groupId>
  15. <artifactId>mysql-connector-java</artifactId>
  16. <scope>runtime</scope>
  17. </dependency>
  18. <!-- test -->
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-test</artifactId>
  22. <scope>test</scope>
  23. </dependency>

增加druid数据源、fastjson、pagehelper分页插件,整合swagger2文档自动化构建框架

  1. <!-- 分页插件 -->
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper-spring-boot-starter</artifactId>
  5. <version>1.2.3</version>
  6. </dependency>
  7. <!-- alibaba的druid数据库连接池 -->
  8. <dependency>
  9. <groupId>com.alibaba</groupId>
  10. <artifactId>druid-spring-boot-starter</artifactId>
  11. <version>1.1.1</version>
  12. </dependency>
  13. <!-- alibaba的json格式化对象 -->
  14. <dependency>
  15. <groupId>com.alibaba</groupId>
  16. <artifactId>fastjson</artifactId>
  17. <version>1.2.31</version>
  18. </dependency>
  19. <!-- 自动生成API文档 -->
  20. <dependency>
  21. <groupId>io.springfox</groupId>
  22. <artifactId>springfox-swagger2</artifactId>
  23. <version>2.5.0</version>
  24. </dependency>

项目框架

前端

模块

requirejs

api

grid

插件

easyuigrid

扩展
跨页勾选

资源访问

springboot 资源文件说明

  1. /META-INF/resources/
  2. /resources/
  3. /static/
  4. /public/

spring boot默认加载文件的路径是

  1. /META-INF/resources/
  2. /resources/
  3. /static/
  4. /public/
  1. META_INF/resources 下面的静态资源文件可以覆盖引用的 jar 保重的资源文件

WebJars统一管理静态资源

引入相关依赖
  1. <!--Webjars版本定位工具(前端)-->
  2. <dependency>
  3. <groupId>org.webjars</groupId>
  4. <artifactId>webjars-locator-core</artifactId>
  5. </dependency>
  6. <!--Jquery组件(前端)-->
  7. <dependency>
  8. <groupId>org.webjars</groupId>
  9. <artifactId>jquery</artifactId>
  10. <version>3.3.1</version>
  11. </dependency>
访问静态资源

在浏览器访问静态资源:

快速访问:http://localhost:8080/webjars/jquery/jquery.js (推荐)

快速访问:http://localhost:8080/webjars/jquery/3.3.1/jquery.js

webjars-locator-core 解决访问WebJars静态资源时必须携带版本号的繁琐问题

静态资源版本化

1.简洁做法

新建一个SpringBoot项目,手工创建目录 META-INF/resources/ ,将静态资源完整复制进去,然后发布公司Maven私服即可。

2.标准的Webjars格式

1、新建SpringBoot工程 然后在srcmain esources 新建目录 META-INF.resources.webjars.metronic.4.1.9 重点来了 这里4.1.9 必须跟POM文件的4.1.9保持一致。
2、修改POM文件 填写项目信息和公司私服地址。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <!--项目信息-->
  6. <groupId>org.webjars</groupId>
  7. <artifactId>metronic</artifactId>
  8. <version>4.1.9</version>
  9. <packaging>jar</packaging>
  10. <name>metronic</name>
  11. <description>metronic</description>
  12. <!--维护信息-->
  13. <developers>
  14. <developer>
  15. <name>socks</name>
  16. <email>https://github.com/yizhiwazi</email>
  17. </developer>
  18. </developers>
  19. <!--发布地址-->
  20. <distributionManagement>
  21. <repository>
  22. <id>xx-repo</id>
  23. <!--这里替换成公司私服地址-->
  24. <url>http://127.0.0.1:8088/nexus/content/repositories/thirdparty/</url>
  25. </repository>
  26. <snapshotRepository>
  27. <id>xx-plugin-repo</id>
  28. <!--这里替换成公司私服地址-->
  29. <url>http://127.0.0.1:8088/nexus/content/repositories/thirdparty/</url>
  30. </snapshotRepository>
  31. </distributionManagement>
  32. </project>

3、在本地MAVEN的配置文件指定公司私服的账号密码。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  5. <localRepository>D:devmvnrepository</localRepository>
  6. <mirrors>
  7. <!-- 阿里云仓库 -->
  8. <mirror>
  9. <id>aliyun</id>
  10. <mirrorOf>central</mirrorOf>
  11. <name>aliyun-all</name>
  12. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  13. </mirror>
  14. <!-- 中央仓库1 -->
  15. <mirror>
  16. <id>repo1</id>
  17. <mirrorOf>central</mirrorOf>
  18. <name>Human Readable Name for this Mirror.</name>
  19. <url>http://repo1.maven.org/maven2/</url>
  20. </mirror>
  21. <!-- 中央仓库2 -->
  22. <mirror>
  23. <id>repo2</id>
  24. <mirrorOf>central</mirrorOf>
  25. <name>Human Readable Name for this Mirror.</name>
  26. <url>http://repo2.maven.org/maven2/</url>
  27. </mirror>
  28. </mirrors>
  29. <!-- 暂时在发布仓库到213的时候用到-->
  30. <servers>
  31. <!-- 仓库地址账号 -->
  32. <server>
  33. <id>xx-repo</id>
  34. <username>admin</username>
  35. <password>123456</password>
  36. </server>
  37. <!-- 插件地址账号 -->
  38. <server>
  39. <id>xx-plugin-repo</id>
  40. <username>admin</username>
  41. <password>123456</password>
  42. </server>
  43. </servers>
  44. </settings>

4、打开IDEA->Maven->Deploy 将项目到公司私服,大功告成。

后端

就成spring-boot-starter-data-jpa

spring-boot-starter-data-jpa,示例模块:bubble-component-shiro

添加依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-jpa</artifactId>
  4. </dependency>

添加配置,ddl-auto设置为cteate表示每次重新初始化数据库

  1. #ddl-auto 四个值的解释
  2. #create: 每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
  3. #create-drop :每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
  4. #update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
  5. #validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。 5、 none : 什么都不做。
  6. spring.jpa.database=mysql
  7. spring.jpa.show_sql=true
  8. spring.jpa.hibernate.ddl-auto=create
  9. spring.jpa.database-platform=com.it.ymk.bubble.config.MySQL5DialectUTF8

在src/main/resources下面创建import.sql,每次启动会执行此脚本

  1. INSERT INTO `sys_user` (`uid`,`username`,`name`,`password`,`salt`,`state`) VALUES ('1', 'admin', '管理员', 'd3c59d25033dbf980d29554025c23a75', '8d78869f470951332959580424d4bf4f', 0);
  2. INSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (1,0,'用户管理',0,'0/','userInfo:view','menu','userInfo/userList');
  3. INSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (2,0,'用户添加',1,'0/1','userInfo:add','button','userInfo/userAdd');
  4. INSERT INTO `sys_permission` (`id`,`available`,`name`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`) VALUES (3,0,'用户删除',1,'0/1','userInfo:del','button','userInfo/userDel');
  5. INSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (1,0,'管理员','admin');
  6. INSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (2,0,'VIP会员','vip');
  7. INSERT INTO `sys_role` (`id`,`available`,`description`,`role`) VALUES (3,1,'test','test');
  8. INSERT INTO `sys_role_permission` VALUES ('1', '1');
  9. INSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (1,1);
  10. INSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (2,1);
  11. INSERT INTO `sys_role_permission` (`permission_id`,`role_id`) VALUES (3,2);
  12. INSERT INTO `sys_user_role` (`role_id`,`uid`) VALUES (1,1);

集成Mybatis

推荐需要较多业务逻辑的模块使用此组件,实现有基于xml和无xml方式

本配置主要包括了druid数据库连接池、pagehelper分页插件、mybatis-generator插件以及mapper、pojo扫描配置

配置druid数据库连接池

添加如下配置

  1. spring:
  2. datasource:
  3. # 如果存在多个数据源,监控的时候可以通过名字来区分开来
  4. name: mysql
  5. # 连接数据库的url
  6. url: jdbc:mysql://localhost:3306/db?characterEncoding=utf-8
  7. # 连接数据库的账号
  8. username: root
  9. # 连接数据库的密码
  10. password: 123
  11. # 使用druid数据源
  12. type: com.alibaba.druid.pool.DruidDataSource
  13. # 扩展插件
  14. # 监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall
  15. filters: stat
配置分页插件
  1. #pagehelper 分页插件
  2. pagehelper:
  3. # 数据库的方言
  4. helperDialect: mysql
  5. # 启用合理化,如果pageNum < 1会查询第一页,如果pageNum > pages会查询最后一页
  6. reasonable: true
mybatis扫描

1.在application.yml配置mapper.xml以及pojo的包地址

  1. #mybatis 配置
  2. mybatis.type-aliases-package=com.it.ymk.bubble.core.entity,com.it.ymk.bubble.component.schedule.entity
  3. mybatis.mapper-locations=classpath*:com/it/ymk/bubble/component/schedule/mapper/mysql/*Mapper.xml

2.在启动类开启Mapper扫描注解

  1. @Controller
  2. @SpringBootApplication
  3. @MapperScan("com.it.ymk.bubble.**.dao")
  4. @ImportResource(locations = { "classpath:cxf.xml" })
  5. public class Application {
  6. @GetMapping("/")
  7. @ResponseBody
  8. public String index() {
  9. return "Hello Spring Boot World!";
  10. }
  11. /**
  12. * 异常访问
  13. * @return
  14. * @throws Exception
  15. */
  16. @RequestMapping(value = "/errorIndex")
  17. @ResponseBody
  18. public String testError() throws Exception {
  19. ErrorUtil.randomException();
  20. return "Hello Spring Boot World!";
  21. }
  22. public static void main(String[] args) {
  23. SpringApplication.run(Application.class, args);
  24. }
  25. }

CXF 整合restful风格服务

rest服务

  1. @Path("/restService")
  2. public class RestServiceDemoImpl {
  3. /**
  4. *获取资源的列表,用复数的形式,GET方法
  5. **/
  6. @Path("/getCarList")
  7. @GET
  8. @Produces(MediaType.APPLICATION_JSON)
  9. public List<HashMap> getCarList() throws Exception {
  10. //方法名可以根据业务等取名,查询是的参数放入对象中,但是在开发的时候遇到的问题是获取列表的种类多种多样,
  11. //获取的时候,需要在service中进行复杂判断
  12. ArrayListWrapper w = new ArrayListWrapper();
  13. List<HashMap> resultList = new ArrayList();
  14. HashMap hashMap = new HashMap();
  15. hashMap.put("name", "yuhui");
  16. resultList.add(hashMap);
  17. w.myArray = resultList;
  18. return resultList;
  19. }

在启动类添加配置:

  1. @ImportResource(locations = { "classpath:cxf.xml" })

文件配置:

  1. #xml
  2. <bean id="restService" class="com.it.ymk.bubble.web.service.rest.RestServiceDemoImpl">
  3. </bean>
  4. <jaxrs:server id="restContainer" address="/rs">
  5. <!--编码格式-->
  6. <jaxrs:languageMappings>
  7. </jaxrs:languageMappings>
  8. <!--输入拦截器设置-->
  9. <jaxrs:inInterceptors>
  10. </jaxrs:inInterceptors>
  11. <!--输出拦截器设置-->
  12. <jaxrs:outInterceptors>
  13. </jaxrs:outInterceptors>
  14. <jaxrs:serviceBeans>
  15. <ref bean="restService"></ref>
  16. </jaxrs:serviceBeans>
  17. <jaxrs:providers>
  18. <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"></bean>
  19. </jaxrs:providers>
  20. <!--支持的协议-->
  21. <jaxrs:extensionMappings>
  22. <entry key="json" value="application/json"></entry>
  23. <entry key="xml" value="application/xml"></entry>
  24. </jaxrs:extensionMappings>
  25. </jaxrs:server>

代码配置

  1. #java
  2. @Configuration
  3. public class CxfConfig {
  4. /**
  5. * webservice
  6. *
  7. * @return
  8. */
  9. @Bean(name = Bus.DEFAULT_BUS_ID)
  10. public SpringBus springBus() {
  11. return new SpringBus();
  12. }
  13. /**
  14. * 注入webService
  15. *
  16. * @return
  17. */
  18. @Bean
  19. @Qualifier("WebserviceImpl")
  20. public Endpoint endpoint(WebserviceImpl WebserviceImpl) {
  21. EndpointImpl endpoint = new EndpointImpl(springBus(), WebserviceImpl);
  22. // 暴露webService api
  23. endpoint.publish("/ws");
  24. return endpoint;
  25. }
  26. /**
  27. *cxf实现restful风格
  28. *
  29. * @return
  30. */
  31. @Bean
  32. public ServletRegistrationBean dispatcherCxfRestServlet() {
  33. return new ServletRegistrationBean(new CXFServlet(), "/cxf/*");
  34. }
  35. }

集成Swagger2

  1. 建立SwaggerConfig文件
  1. @Configuration //标记配置类
  2. @EnableSwagger2 //开启在线接口文档
  3. @Profile({ "dev", "test" })
  4. public class Swagger2Config {
  5. /**
  6. * 接口版本号
  7. */
  8. private final String VERSION = "版本:1.0";
  9. /**
  10. * 接口大标题
  11. */
  12. private final String TITLE = "标题:XX_接口文档";
  13. /**
  14. * 具体的描述
  15. */
  16. private final String DESCRIPTION = "描述:接口说明文档..";
  17. /**
  18. * 服务说明url
  19. */
  20. private final String TERMS_OF_SERVICE_URL = "http://www.xxx.com";
  21. /**
  22. * licence
  23. */
  24. private final String LICENSE = "MIT";
  25. /**
  26. * licnce url
  27. */
  28. private final String LICENSE_URL = "https://mit-license.org/";
  29. /**
  30. * 接口作者联系方式
  31. */
  32. private final Contact CONTACT = new Contact("starlord", "https://github.com/victoryofymk", "starlord.yan@gmail.com");
  33. /**
  34. * 添加摘要信息(Docket)
  35. */
  36. @Bean
  37. public Docket controllerApi() {
  38. return new Docket(DocumentationType.SWAGGER_2)
  39. .apiInfo(new ApiInfoBuilder()
  40. .title(TITLE)
  41. .description(DESCRIPTION)
  42. .termsOfServiceUrl(TERMS_OF_SERVICE_URL)
  43. .license(LICENSE)
  44. .licenseUrl(LICENSE_URL)
  45. .contact(CONTACT)
  46. .version(VERSION)
  47. .build())
  48. .select()
  49. .apis(RequestHandlerSelectors.basePackage("com.it.ymk"))
  50. .paths(PathSelectors.any())
  51. .build();
  52. }
  53. }
  1. 常用注解示例
  1. @Api("Quartz定时任务管理")
  2. @RestController
  3. @RequestMapping(value = "/job")
  4. public class JobController {
  5. @Autowired
  6. private IJobAndTriggerService iJobAndTriggerService;
  7. @Autowired
  8. @Qualifier("Scheduler")
  9. private Scheduler scheduler;
  10. /**
  11. * 新增一个job
  12. * @param jobClassName
  13. * @param jobGroupName
  14. * @param cronExpression
  15. * @throws Exception
  16. */
  17. @ApiOperation(" 新增一个job")
  18. @ApiImplicitParams({ @ApiImplicitParam(name = "jobClassName", value = "任务class名称", dataType = "String"),
  19. @ApiImplicitParam(name = "jobGroupName", value = "任务分组名称", dataType = "String"),
  20. @ApiImplicitParam(name = "cronExpression", value = "任务时间表达式 ", dataType = "String") })
  21. @RequestMapping(value = "/addSingleJob")
  22. public void addSingleJob(@RequestParam(value = "jobClassName") String jobClassName,
  23. @RequestParam(value = "jobGroupName") String jobGroupName,
  24. @RequestParam(value = "cronExpression") String cronExpression) throws Exception {
  25. addJob(jobClassName, jobGroupName, cronExpression);
  26. }
  1. 生成json形式的文档

控制台会打印级别为INFO的日志,表明可通过访问应用的v2/api-docs接口得到文档api的json格式数据,可在浏览器输入指定地址验证集成是否成功

  1. Mapped "{[/v2/api-docs],methods=[GET],produces=[application/json || application/hal+json]}"
  2. http://localhost:8080/v2/api-docs
  1. 集成官方的页面
  1. <!--添加Swagger-UI依赖 -->
  2. <dependency>
  3. <groupId>io.springfox</groupId>
  4. <artifactId>springfox-swagger-ui</artifactId>
  5. <version>2.7.0</version>
  6. </dependency>

访问页面

  1. http://localhost:8090/bubble/swagger-ui.html

实现中文覆盖官方页面,在/src/main/resources/META-INF/resources/ 路径下新增 swagger-ui.html,并添加中文

  1. <!--国际化操作:选择中文版 -->
  2. <script src='webjars/springfox-swagger-ui/lang/translator.js' type='text/javascript'></script>
  3. <script src='webjars/springfox-swagger-ui/lang/zh-cn.js' type='text/javascript'></script>

zh-cn.js 在src/main/resources/META-INF/resources/webjars/springfox-swagger-ui/lang/zh-cn.js,内容:

  1. 'use strict';
  2. /* jshint quotmark: double */
  3. window.SwaggerTranslator.learn({
  4. "Warning: Deprecated": "警告:已过时",
  5. "Implementation Notes": "实现备注",
  6. "Response Class": "响应类",
  7. "Status": "状态",
  8. "Parameters": "参数",
  9. "Parameter": "参数",
  10. "Value": "值",
  11. "Description": "描述",
  12. "Parameter Type": "参数类型",
  13. "Data Type": "数据类型",
  14. "Response Messages": "响应消息",
  15. "HTTP Status Code": "HTTP状态码",
  16. "Reason": "原因",
  17. "Response Model": "响应模型",
  18. "Request URL": "请求URL",
  19. "Response Body": "响应体",
  20. "Response Code": "响应码",
  21. "Response Headers": "响应头",
  22. "Hide Response": "隐藏响应",
  23. "Headers": "头",
  24. "Try it out!": "试一下!",
  25. "Show/Hide": "显示/隐藏",
  26. "List Operations": "显示操作",
  27. "Expand Operations": "展开操作",
  28. "Raw": "原始",
  29. "can't parse JSON. Raw result": "无法解析JSON. 原始结果",
  30. "Example Value": "示例",
  31. "Click to set as parameter value": "点击设置参数",
  32. "Model Schema": "模型架构",
  33. "Model": "模型",
  34. "apply": "应用",
  35. "Username": "用户名",
  36. "Password": "密码",
  37. "Terms of service": "服务条款",
  38. "Created by": "创建者",
  39. "See more at": "查看更多:",
  40. "Contact the developer": "联系开发者",
  41. "api version": "api版本",
  42. "Response Content Type": "响应Content Type",
  43. "Parameter content type:": "参数类型:",
  44. "fetching resource": "正在获取资源",
  45. "fetching resource list": "正在获取资源列表",
  46. "Explore": "浏览",
  47. "Show Swagger Petstore Example Apis": "显示 Swagger Petstore 示例 Apis",
  48. "Can't read from server. It may not have the appropriate access-control-origin settings.": "无法从服务器读取。可能没有正确设置access-control-origin。",
  49. "Please specify the protocol for": "请指定协议:",
  50. "Can't read swagger JSON from": "无法读取swagger JSON于",
  51. "Finished Loading Resource Information. Rendering Swagger UI": "已加载资源信息。正在渲染Swagger UI",
  52. "Unable to read api": "无法读取api",
  53. "from path": "从路径",
  54. "server returned": "服务器返回"
  55. });
  1. 第三方页面增强-Swagger增强UI实现

https://github.com/xiaoymin/Swagger-Bootstrap-UI

说明:https://github.com/xiaoymin/Swagger-Bootstrap-UI/blob/master/README_zh.md

引入:

  1. <dependency>
  2. <groupId>com.github.xiaoymin</groupId>
  3. <artifactId>swagger-bootstrap-ui</artifactId>
  4. <version>${lastVersion}</version>
  5. </dependency>

访问:http://${host}:${port}/doc.html

部署

本地运行

修改application.properties相关配置

修改启动环境

  1. spring.profiles.active=dev

修改数据源、redis等环境信息
本地运行在IDE直接运行com.it.ymk.bubble.Application

多环境打包

默认打包dev环境,-P指定环境

  1. #指定打包版本
  2. mvn package -Pdev

jar包启动

启动应用,control+c或者退出命令行应用关闭

  1. java -jar XXX.jar

后台启动

制作docker镜像

基于docker-maven-plugin或者dockerfile-maven-plugin 插件构建docker,推荐使用dockerfile-maven-plugin

dockerfile基础配置

  1. #简洁版
  2. FROM openjdk:8-jdk-alpine
  3. VOLUME /tmp
  4. ADD ${JAR_FILE} app.jar
  5. ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

dockerfile进阶配置,加入时区

  1. #包含时区设置
  2. FROM openjdk:8-jdk-alpine
  3. VOLUME /tmp
  4. ADD ${JAR_FILE} app.jar
  5. # timezone
  6. ARG TIME_ZONE=Asia/Shanghai
  7. RUN apk add -U tzdata \
  8. && cp /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime
  9. ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

推送远程docker服务器

远程服务器修改配置步骤:

  1. 修改/etc/docker/daemon.json文件,加入hosts配置即可。
    如:
    {
    “hosts”:[“tcp://0.0.0.0:2375”,”unix:///var/run/docker.sock”]
    }

  2. 重新加载配置文件,并重启docker

  1. systemctl daemon-reload
  2. systemctl restart docker
  1. 验证,直接访问:
    ```
    curl 127.0.0.1:2375/info
  1. 返回记录即可说明已经生效。
  2. ### docker启动
  3. 基础依赖:dockermaven
  4. 编译打包镜像,执行 docker-maven-plugin

mvn package docker:build

  1. 或者,执行 dockerfile-maven-plugin,速度较快

mvn package docker:build

  1. docker 查看

docker images

  1. 启动

docker run -p 8090:8090 -t bubble-springboot/bubble-springboot-web

  1. ## 其他
  2. ### 代码优化
  3. #### java
  4. ##### 占位符

string拼接占位符

System.out.printf(“该域名%s被访问了%s次.”, domain , iVisit);
System.out.println(MessageFormat.format(“该域名{0}被访问了 {1} 次.”, domain , iVisit));

使用logback占位符{}

if(logger.isDebugEnabled()) {
logger.debug(“Entry number: “ + i + “ is “ + String.valueOf(entry[i]));
}
```