diff --git a/README.md b/README.md index f724453fb34ed7d55cb96f0999af3a0be2b82092..f02f2f444fa6e50fa6c8b340de3acd7b3e12c926 100644 --- a/README.md +++ b/README.md @@ -1,638 +1 @@ -# spring-boot-assembly - -> 1. 在spring boot项目中使用maven profiles和maven assembly插件根据不同环境打包成tar.gz或者zip -> 2. 将spring boot项目中的配置文件提取到外部config目录中 -> 3. 将spring boot项目中的启动jar包移动到boot目录中 -> 4. 将spring boot项目中的第三方依赖jar包移动到外部lib目录中 -> 5. bin目录中是启动,停止,重启服务命令 -> 6. 打包后的目录结构类似于tomcat/maven目录结构 - -## 代码托管 - -> **[Github](https://github.com/geekidea/spring-boot-assembly)** | **[Gitee](https://gitee.com/geekideaio/spring-boot-assembly)** - - -### 主要插件 -1. maven-assembly-plugin -2. maven-jar-plugin -3. spring-boot-maven-plugin -4. maven-dependency-plugin -5. maven-resources-plugin - -### CHANGELOG -[CHANGELOG](https://github.com/geekidea/spring-boot-assembly/blob/master/CHANGELOG.md) - -#### 1.maven-assembly-plugin 配置assembly.xml文件路径 -```xml - - maven-assembly-plugin - 3.1.0 - - - src/main/assembly/assembly.xml - - - - - make-assembly - package - - single - - - - -``` - -#### 2.assembly.xml打包配置文件 -```xml - - - - - ${profileActive}-${project.version} - - - - tar.gz - - - - true - - - - - - ${basedir}/src/bin - bin - 0755 - - **.sh - **.bat - - - - - - ${basedir}/target/classes - config - 0644 - - application.yml - application-${profileActive}.yml - mapper/**/*.xml - static/** - templates/** - *.xml - *.properties - - - - - - ${basedir}/target/lib - lib - 0755 - - - - - ${basedir}/target - boot - 0755 - - ${project.build.finalName}.jar - - - - - - ${basedir} - - NOTICE - LICENSE - *.md - - - - - -``` - -#### 3.spring-boot-maven-plugin 排除启动jar包中依赖的jar包 -```xml - - org.springframework.boot - spring-boot-maven-plugin - - ZIP - - - - non-exists - non-exists - - - - -``` - -#### 4.maven-jar-plugin 自定义maven jar打包内容 -```xml - - org.apache.maven.plugins - maven-jar-plugin - 3.1.0 - - - - - Application - - ../lib - true - - - - - io/geekidea/springboot/** - - - -``` - -#### 5.maven-dependency-plugin 复制项目的依赖包到指定目录 - -```xml - - org.apache.maven.plugins - maven-dependency-plugin - 3.1.0 - - - prepare-package - - copy-dependencies - - - target/lib - false - false - true - compile - - - - -``` - -#### 6.maven-resources-plugin - -```xml - - org.apache.maven.plugins - maven-resources-plugin - 3.1.0 - -``` - -```xml - - src/main/resources - true - - application.yml - application-${profileActive}.yml - mapper/**/*.xml - static/** - templates/** - *.xml - *.properties - - -``` - -#### 7.maven profiles配置 -```xml - - - - - local - - local - - - true - - - - dev - - dev - - - false - - - - test - - test - - - false - - - - uat - - uat - - - false - - - - prod - - prod - - - false - - - -``` - -#### 8.阿里云仓库配置 -```xml - - - - aliyun - http://maven.aliyun.com/nexus/content/groups/public/ - - -``` - - -___ -##### 项目源码结构 -```text -├─bin -│ restart.sh -│ shutdown.sh -│ startup.bat -│ startup.sh -│ -├─logs -│ springboot-assembly.log -│ -├─main -│ ├─assembly -│ │ assembly.xml -│ │ -│ ├─java -│ │ └─io -│ │ └─geekidea -│ │ └─springboot -│ │ └─assembly -│ │ Application.java -│ │ HelloController.java -│ │ HelloService.java -│ │ HelloServiceImpl.java -│ │ -│ └─resources -│ │ application-dev.yml -│ │ application-local.yml -│ │ application-prod.yml -│ │ application-test.yml -│ │ application-uat.yml -│ │ application.yml -│ │ -│ ├─mapper -│ │ │ test.xml -│ │ │ -│ │ └─hello -│ │ hello.xml -│ │ -│ ├─static -│ │ index.html -│ │ -│ └─templates -│ test.txt -│ -└─test -``` - -##### 项目打包 - -```bash -mvn clean package -``` - -##### 使用maven assembly插件打包local环境后的压缩包,target目录下 -```bash -spring-boot-assembly-local-1.0.RELEASE.tar.gz -``` - -##### linux解压tar.gz - -```bash -tar -zxvf spring-boot-assembly-local-1.0.RELEASE.tar.gz -``` - -##### 解压后的目录结构 -```text -└─spring-boot-assembly - │ LICENSE - │ NOTICE - │ README.md - │ - ├─bin - │ restart.sh - │ shutdown.sh - │ startup.bat - │ startup.sh - │ - ├─boot - │ spring-boot-assembly.jar - │ - ├─config - │ │ application-local.yml - │ │ application.yml - │ │ - │ ├─mapper - │ │ │ test.xml - │ │ │ - │ │ └─hello - │ │ hello.xml - │ │ - │ ├─static - │ │ index.html - │ │ - │ └─templates - │ test.txt - │ - └─lib - classmate-1.4.0.jar - fastjson-1.2.54.jar - hibernate-validator-6.0.13.Final.jar - jackson-annotations-2.9.0.jar - jackson-core-2.9.7.jar - jackson-databind-2.9.7.jar - jackson-datatype-jdk8-2.9.7.jar - jackson-datatype-jsr310-2.9.7.jar - jackson-module-parameter-names-2.9.7.jar - javax.annotation-api-1.3.2.jar - jboss-logging-3.3.2.Final.jar - jul-to-slf4j-1.7.25.jar - log4j-api-2.11.1.jar - log4j-to-slf4j-2.11.1.jar - logback-classic-1.2.3.jar - logback-core-1.2.3.jar - slf4j-api-1.7.25.jar - snakeyaml-1.23.jar - spring-aop-5.1.2.RELEASE.jar - spring-beans-5.1.2.RELEASE.jar - spring-boot-2.1.0.RELEASE.jar - spring-boot-autoconfigure-2.1.0.RELEASE.jar - spring-boot-starter-2.1.0.RELEASE.jar - spring-boot-starter-json-2.1.0.RELEASE.jar - spring-boot-starter-logging-2.1.0.RELEASE.jar - spring-boot-starter-tomcat-2.1.0.RELEASE.jar - spring-boot-starter-web-2.1.0.RELEASE.jar - spring-context-5.1.2.RELEASE.jar - spring-core-5.1.2.RELEASE.jar - spring-expression-5.1.2.RELEASE.jar - spring-jcl-5.1.2.RELEASE.jar - spring-web-5.1.2.RELEASE.jar - spring-webmvc-5.1.2.RELEASE.jar - tomcat-embed-core-9.0.12.jar - tomcat-embed-el-9.0.12.jar - tomcat-embed-websocket-9.0.12.jar - validation-api-2.0.1.Final.jar -``` - - -___ - -##### window启动,会打开浏览器,访问项目测试路径 - -```bash -bin/startup.bat -``` -> - 访问地址: [http://localhost:8080/example/hello?name=123](http://localhost:8080/example/hello?name=123) -> - 响应结果: -```json -{"msg":"service hello:123","code":200} -``` - -##### linux启动,停止,重启 - -```bash -sh bin/startup.sh 启动项目 -sh bin/shutdown.sh 停止服务 -sh bin/restart.sh 重启服务 -``` - -##### startup.sh 脚本中的主要内容 -- 配置项目名称及项目启动jar名称,默认项目名称与启动jar名称一致 - -```bash -APPLICATION="spring-boot-assembly" -APPLICATION_JAR="${APPLICATION}.jar" -``` - -- JAVA_OPTION配置 -> - JVM Configuration -> - -Xmx256m:设置JVM最大可用内存为256m,根据项目实际情况而定,建议最小和最大设置成一样。 -> - -Xms256m:设置JVM初始内存。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存 -> - -Xmn512m:设置年轻代大小为512m。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8 -> - -XX:MetaspaceSize=64m:存储class的内存大小,该值越大触发Metaspace GC的时机就越晚 -> - -XX:MaxMetaspaceSize=320m:限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序 -> - -XX:-OmitStackTraceInFastThrow:解决重复异常不打印堆栈信息问题 - -```bash -JAVA_OPT="-server -Xms256m -Xmx256m -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m" -JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow" -``` -#### 执行启动命令:后台启动项目,并将日志输出到项目根目录下的logs文件夹下 - -```bash -nohup java ${JAVA_OPT} -jar ${BASE_PATH}/boot/${APPLICATION_JAR} --spring.config.location=${CONFIG_DIR} > ${LOG_PATH} 2>&1 & -``` - -## 最终执行jar包的命令 - -```bash -nohup java -server -Xms256m -Xmx256m -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:-OmitStackTraceInFastThrow -jar /opt/spring-boot-assembly/boot/spring-boot-assembly.jar --spring.config.location=/opt/spring-boot-assembly/config/ > /opt/spring-boot-assembly/logs/spring-boot-assembly.log 2>&1 & -``` -> - nohup:在后台运行jar包,然后将运行日志输出到指定位置 -> - -server:指定JVM参数 -> - -jar /opt/spring-boot-assembly/boot/spring-boot-assembly.jar:指定启动的jar包 -> - 启动命令中指定的启动jar包路径,配置文件路径,日志路径都是绝对路径 -> - 可在任何位置执行start.sh,shutdown.sh,restart.sh脚本 -> - --spring.config.location:指定配置文件目录或者文件名称,如果是目录,以/结束 -> - > /opt/spring-boot-assembly/logs/spring-boot-assembly.log:指定日志输出路径 -> - 2>&1 & :将正常的运行日志和错误日志合并输入到指定日志,并在后台运行 - -#### shutdown.sh停服脚本,实现方式:找到当前项目的PID,然后kill -9 - -```bash -PID=$(ps -ef | grep "${APPLICATION_JAR}" | grep -v grep | awk '{ print $2 }') -kill -9 ${PID} -``` - -#### 日志记录 -##### 项目启动日志存储路径,一个项目只有一个启动日志文件 - -```bash -logs/spring-boot-assembly_startup.log -``` - -```text -================================================ 2018-12-12 12:36:56 ================================================ -application name: spring-boot-assembly -application jar name: spring-boot-assembly.jar -application bin path: /opt/spring-boot-assembly/bin -application root path: /opt/spring-boot-assembly -application log path: /opt/spring-boot-assembly/logs/spring-boot-assembly.log -application JAVA_OPT : -server -Xms256m -Xmx256m -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:-OmitStackTraceInFastThrow -application background startup command: nohup java -server -Xms256m -Xmx256m -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:-OmitStackTraceInFastThrow -jar /opt/spring-boot-assembly/boot/spring-boot-assembly.jar --spring.config.location=/opt/spring-boot-assembly/config/ > /opt/spring-boot-assembly/logs/spring-boot-assembly.log 2>&1 & -application pid: 11596 -``` - -##### 项目运行日志存储路径,最近一次启动项目的运行日志 - -```bash -logs/spring-boot-assembly.log -``` - -```text -. ____ _ __ _ _ - /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ -( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ - \\/ ___)| |_)| | | | | || (_| | ) ) ) ) - ' |____| .__|_| |_|_| |_\__, | / / / / - =========|_|==============|___/=/_/_/_/ - :: Spring Boot :: (v2.1.0.RELEASE) - -2018-12-12 23:28:58.420 INFO 11596 --- [ main] o.s.boot.SpringApplication : Starting application on VM_0_17_centos with PID 11596 (started by root in /opt/spring-boot-assembly) -2018-12-12 23:28:58.442 INFO 11596 --- [ main] o.s.boot.SpringApplication : The following profiles are active: local -2018-12-12 23:29:01.355 INFO 11596 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) -2018-12-12 23:29:01.437 INFO 11596 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2018-12-12 23:29:01.437 INFO 11596 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/9.0.12 -2018-12-12 23:29:01.461 INFO 11596 --- [ main] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib] -2018-12-12 23:29:01.646 INFO 11596 --- [ main] o.a.c.c.C.[.[localhost].[/example] : Initializing Spring embedded WebApplicationContext -2018-12-12 23:29:01.647 INFO 11596 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 3028 ms -2018-12-12 23:29:01.708 INFO 11596 --- [ main] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/] -2018-12-12 23:29:01.712 INFO 11596 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] -2018-12-12 23:29:01.712 INFO 11596 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] -2018-12-12 23:29:01.712 INFO 11596 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'formContentFilter' to: [/*] -2018-12-12 23:29:01.713 INFO 11596 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] -2018-12-12 23:29:02.250 INFO 11596 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' -2018-12-12 23:29:03.179 INFO 11596 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '/example' -2018-12-12 23:29:03.182 INFO 11596 --- [ main] o.s.boot.SpringApplication : Started application in 5.844 seconds (JVM running for 6.547) -spring.profiles.active = local -contextPath = /example -server.port = 8080 -hello = Hello Local -http://localhost:8080/example/hello?name=123 -``` - - -##### 项目历史运行日志存储路径,每启动一次项目,会将之前的运行日志移动到back目录 -```text -`-- logs - |-- back - | |-- spring-boot-assembly_back_2018-12-12-23-30-10.log - | `-- spring-boot-assembly_back_2018-12-12-23-36-56.log - |-- spring-boot-assembly.log - `-- spring-boot-assembly_startup.log -``` - -#### maven项目打包 -##### 1. 使用IDEA工具打包,选择对应的profiles,然后clean package -![mvn-clean-package-local](https://raw.githubusercontent.com/geekidea/spring-boot-assembly/master/img/mvn-clean-package-local.png) -![mvn-clean-package-dev](https://raw.githubusercontent.com/geekidea/spring-boot-assembly/master/img/mvn-clean-package-dev.png) - -##### 2. 使用maven命令打包 - -```bash -mvn clean package -Pdev -``` -##### 3. 使用mvn-package脚本打包 -> window - -```bash -mvn-package.bat dev -``` - -> linux/mac - -```bash -sh mvn-package.sh dev -``` - -#### FAQ -##### Q: 项目打成tar包后,不能正常读取resource目录下的某些配置文件 - -##### A:如果resource目录中还用到其它配置文件,需要在pom.xml和assembly.xml文件的resource中进行配置 -1. pom.xml中的resource默认配置 -> 把需要打包的文件添加到include中 - -```xml - - - src/main/resources - true - - application.yml - application-${profileActive}.yml - mapper/**/*.xml - static/** - templates/** - *.xml - *.properties - - xxx.keystore - - -``` - -2. assembly.xml中的resource默认配置 -> 把需要打包的文件添加到include中 - -```xml - - - ${basedir}/target/classes - config - 0644 - - application.yml - application-${profileActive}.yml - mapper/**/*.xml - static/** - templates/** - *.xml - *.properties - - xxx.keystore - - -``` - -##### 参考: -- https://docs.spring.io/spring-boot/docs/current/maven-plugin/ -- http://maven.apache.org/components/plugins/maven-assembly-plugin/usage.html -- http://maven.apache.org/plugins/maven-jar-plugin/ -- http://maven.apache.org/components/plugins/maven-dependency-plugin/ -- https://maven.apache.org/plugins/maven-resources-plugin/ -- http://maven.apache.org/guides/introduction/introduction-to-profiles.html \ No newline at end of file +![输入图片说明](www.baidu.com)![输入图片说明](sdas%2012.webp) \ No newline at end of file diff --git a/sdas 12.webp b/sdas 12.webp new file mode 100644 index 0000000000000000000000000000000000000000..d0df7c5a235258d6e89c8445aa44906e98228a34 Binary files /dev/null and b/sdas 12.webp differ