如果通过不同的IDE打包,着实会觉得依赖性太大,并且容易出现错误,操作也比较复杂

同时,spring-boot-maven-plugin的使用感觉,相关配置太少,并且无法满足方便部署和运行的需求。

这里我们使用了,Maven的如下插件 下载

maven-jar-plugin,负责将应用程序打包成可执行的jar文件 
maven-assembly-plugin,负责将整个项目按照自定义的目录结构打成最终的压缩包,方便实际部署

需求1,将依赖的jar提取到可运行的jar文件之外,我们使用maven-jar-plugin来实现 下载

比如我的项目最终的打包目录如下 
 
代码目录结构如下 

最终的可运行文件jar文件并不包含依赖的jar包,所有依赖的jar包都放在和ps.jar平行的lib文件夹内,这样如果以后想快速部署,就不用每一次都把体积很大的lib包都要传一遍,除非依赖包有所变化,当然这些都是后续如果想这么做的前提,我这里还是为了使部署的文件比较规整 
这里的maven-jar-plugin的配置文件如下

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-jar-plugin</artifactId>
  4. <version>2.6</version>
  5. <configuration>
  6. <archive>
  7. <!-- 添加index则不从mainfest中读取classpath,而是从Index.list中读取 -->
  8. <!--                         <index>true</index> -->
  9. <manifest>
  10. <mainClass>com.vmpay.pay.App</mainClass>
  11. <!-- to create a class path to your dependecies you have to fill true
  12. in this field -->
  13. <addClasspath>true</addClasspath>
  14. <classpathPrefix>lib/</classpathPrefix>
  15. <!--<classpathLayoutType>custom</classpathLayoutType> <customClasspathLayout>
  16. lib/
    artifact.groupId.

    {artifact.artifactId}.$${artifact.extension} </customClasspathLayout> -->

  17. </manifest>
  18. <manifestEntries>
  19. <Class-Path>./</Class-Path>
  20. </manifestEntries>
  21. </archive>
  22. <excludes>
  23. <exclude>config/**</exclude>
  24. </excludes>
  25. </configuration>
  26. </plugin>

其中manifest的部分是核心,在可执行的jar文件中,打包后会在jar文件内的META-INF文件夹下,生成一个MANIFEST.MF文件,里面记录了可执行文件的一些相关配置,比如像上面一段代码中所配置的内容,这里面就配置了可执行jar文件未来读取classpath的相对目录位置在什么地方,以及引入的jar文件都有哪些,上面的配置就是classpath目录是./(稍后会解释为什么) 
mainClass配置表示,哪个class作为程序的入口来执行 
addClasspath配置表示,是否将依赖的classpath一起打包 
classpathPrefix配置表示,依赖的classpath的前缀,也就是打包后生成的MANIFEST.MF文件里,引入的jar文件都会加上前缀,lib/,比如fastjson-1.2.7.jar,在mainfest文件里就会是lib/fastjson-1.2.7.jar 
excludes配置表示,排除哪些文件夹不被打包进去

其实maven-jar-plugin主要就是配置了MANIFEST.MF这个文件而已,就是让可执行文件知道自己怎么执行,加载哪些文件执行的描述,剩下的工作交由maven-assembly-plugin来处理

在pom文件中配置类似如下 下载

  1. <plugin>
  2. <artifactId>maven-assembly-plugin</artifactId>
  3. <configuration>
  4. <!-- not append assembly id in release file name -->
  5. <appendAssemblyId>false</appendAssemblyId>
  6. <descriptors>
  7. <descriptor>src/main/build/package.xml</descriptor>
  8. </descriptors>
  9. </configuration>
  10. <executions>
  11. <execution>
  12. <id>make-assembly</id>
  13. <phase>package</phase>
  14. <goals>
  15. <goal>single</goal>
  16. </goals>
  17. </execution>
  18. </executions>
  19. </plugin>

重点的就是package.xml的路径了,使用maven-assembly-plugin的相关配置实际上都在这个文件里面 
package.xml的文件内容

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
  4. <id>package</id>
  5. <formats>
  6. <format>zip</format>
  7. </formats>
  8. <includeBaseDirectory>true</includeBaseDirectory>
  9. <fileSets>
  10. <fileSet>
  11. <directory>bin</directory>
  12. <outputDirectory>/</outputDirectory>
  13. </fileSet>
  14. <fileSet>
  15. <directory>src/main/resources</directory>
  16. <outputDirectory>/</outputDirectory>
  17. </fileSet>
  18. <fileSet>
  19. <directory>${project.build.directory}</directory>
  20. <outputDirectory>/</outputDirectory>
  21. <includes>
  22. <include>*.jar</include>
  23. </includes>
  24. </fileSet>
  25. </fileSets>
  26. <dependencySets>
  27. <dependencySet>
  28. <outputDirectory>lib</outputDirectory>
  29. <scope>runtime</scope>
  30. <!--             <unpack>false</unpack> -->
  31. <excludes>
  32. <!--                 <exclude>${project.name}-${project.version}</exclude> -->
  33. <exclude>${groupId}:${artifactId}</exclude>
  34. </excludes>
  35. </dependencySet>
  36. </dependencySets>
  37. </assembly>

其他相关配置可参看官方文档 
[url] 
http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html#class_unpackOptions 
[/url]

这里面我配置了,最终压缩的文件格式,为zip,也就是最终打包出来的是一个zip的文件,然后发布到服务器上进行解压部署,相关我要的配置都在这个压缩包内,解压即可直接使用 下载

下面的fileSets中配置了我需要将那些文件打包到我的最终压缩包中, 
我的配置文件包括了启动脚本bin文件夹,里面放着shell的启动脚本, 
相关的配置文件src/main/resources,里面放着整个程序提取的properties等相关的配置文件 
最终可运行的jar文件,使用了${project.build.directory}变量,也就是通过maven-jar-plugin生成的那个jar文件 
dependencySets里面配置了依赖库最终输出到lib文件夹下,与上面的maven-jar-plugin配置生成的manifest文件路径相对应,这样可运行jar就会按照manifest的路径来找相应的文件进行加载 下载

start.sh

  1. ###启动
  2. #!/bin/sh
  3. moduleName="ps"
  4. pidPath="/var/run/$moduleName-tpid"
  5. rm -f $pidPath
  6. nohup java -jar ./$moduleName.jar -server -Xms1024m -Xmx2048m -Xss256k > ./run.log 2>&1 &
  7. echo $! > $pidPath

stop.sh

    1. ###停止
    2. moduleName="ps"
    3. tpid=`cat /var/run/$moduleName-tpid | awk '{print $1}'`
    4. tpid=`ps -aef | grep $tpid | awk '{print $2}' |grep $tpid`
    5. if [ ${tpid} ]; then
    6. kill -9 $tpid
    7. fi

通过Maven构建打包Spring boot,并将config配置文件提取到jar文件外的更多相关文章

  1. 第三章 Maven构建 Java Spring Boot Web项目

    3.1   认识Srping Boot Spring Boot是一个框架,是一种全新的编程规范,它的产生简化了对框架的使用,简化了Spring众多的框架中大量的繁琐的配置文件,所以说Spring Bo ...

  2. 第二章 微服务构建:Spring Boot

    此处介绍Spring Boot的目的除了它是Spring Cloud的基础外,也由于其自身的各项优点,如自动化配置.快速开发.轻松部署等,非常适合用作微服务架构中各项具体微服务的开发框架. 本章内容: ...

  3. 微服务构建: Spring Boot

    在展开 Spring Cloud 的微服务架构部署之前, 我们先了解一下用于构建微服务的基础框架-Spring Boot. 由于 Spring Cloud 的构建基于 Spring Boot 实现, ...

  4. Maven构建的Spring项目需要哪些依赖?

    Maven构建的Spring项目需要哪些依赖? <!-- Spring依赖 --> <!-- 1.Spring核心依赖 --> <dependency> <g ...

  5. Spring boot 自动配置自定义配置文件

    示例如下: 1.   新建 Maven 项目 properties 2.   pom.xml <project xmlns="http://maven.apache.org/POM/4 ...

  6. Spring Boot: 加密应用配置文件敏感信息

    Spring Boot: 加密应用配置文件敏感信息 背景 我们的应用之前使用的是Druid数据库连接池,由于需求我们迁移到HikariCP连接池,druid 数据源加密提供了多种方式: 可以在配置文件 ...

  7. Spring Boot 核心注解与配置文件

    @SpringBootApplication注解 Spring Boot项目有一个入口类 (*Application) 在这个类中有一个main 方法,是运行该项目的切入点.而@SpringBootA ...

  8. Spring Boot配置,读取配置文件

    Spring Boot配置,读取配置文件 一.配置Spring Boot 1.1 服务器配置 1.2 使用其他Web服务器 1.3 配置启动信息 1.4 配置浏览器显示ico 1.5 Yaml语法 1 ...

  9. 总结Spring、Hibernate、Struts2官网下载jar文件

    一直以来只知道搭SSH需要jar文件,作为学习的目的,最好的做法是自己亲自动手去官网下.不过官网都是英文,没耐心一般很难找到下载入口,更何 况版本的变化也导致不同版本jar文件有些不一样,让新手很容易 ...

随机推荐

  1. 关于Tensorflow 加载和使用多个模型的方式

    在Tensorflow中,所有操作对象都包装到相应的Session中的,所以想要使用不同的模型就需要将这些模型加载到不同的Session中并在使用的时候申明是哪个Session,从而避免由于Sessi ...

  2. CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现

    CRC16算法系列文章: CRC16算法之一:CRC16-CCITT-FALSE算法的java实现 CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现 CRC16算法之三:CR ...

  3. Tomcat的安装及使用

    下面是我搭建Tomcat的过程,记录一下 下载地址:http://tomcat.apache.org/  我下载的是8.5.30版本 安装 下载完成后解压到D盘 (配置变量的的教程网上大把随便搜) 1 ...

  4. web.xml中:<context-param>与<init-param>的区别与作用及获取方法

    <context-param>的作用: web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件w ...

  5. iOS端IM开发从入门到填坑

      让App聊起来 IM开发从入门到填坑Demo IM的实现方式 拿来主义,使用第三方IM服务 IM的第三方服务商国内有很多,底层协议基本上都是基于TCP的,类似有网易云信.环信.融云.极光IM.Le ...

  6. [poj3140]Contestants Division树形dp

    题意:切掉树上的某条边,使分开的两棵树上各点的权值和差值最小. 与hdu2196不同的是,此题是点权,其他无太大差别,注意数据范围. 先求出每个节点的子树权值和,然后自底向上dp即可.取$\min ( ...

  7. POJ-3050

    Hopscotch Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4385   Accepted: 2924 Descrip ...

  8. windows64下安装MySQLdb连接数据库

    MySQLdb是Python连接MySQL的模块,下面介绍一下源码方式安装MySQLdb: 1.首先要下载:http://www.codegood.com/downloads,由于我的python是2 ...

  9. 3dmax室内设计,建筑视频

    第一教程篮球场 http://video.1kejian.com/video/?30800-0-1.html 第一课 元素级别-flip反转(直接看模型里面) 第二课 alt+r = ring crt ...

  10. Spring Boot Dubbo 构建分布式服务

    概述: 节点角色说明 节点 角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次数 ...