通过Maven构建打包Spring boot,并将config配置文件提取到jar文件外

原创 2016年08月30日 09:34:49
如果通过不同的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的配置文件如下 

Xml代码  下载
  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文件中配置类似如下 下载

Xml代码  下载
  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的文件内容 
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 
Shell代码  下载
  1. ###启动  
  2.   
  3. #!/bin/sh  
  4.   
  5. moduleName="ps"  
  6. pidPath="/var/run/$moduleName-tpid"  
  7.   
  8. rm -f $pidPath  
  9.   
  10. nohup java -jar ./$moduleName.jar -server -Xms1024m -Xmx2048m -Xss256k > ./run.log 2>&1 &  
  11.   
  12. echo $! > $pidPath  

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

maven快照版本和发布版本

在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次。我们知道,maven的依赖管理是基于版本管理的,...

将项目发布到 maven 中央仓库踩过的坑

记录第一次将项目发布到 maven 中央仓库踩过的坑和解决方案。

通过Maven构建打包Spring boot,并将config配置文件提取到jar文件外

如果通过不同的IDE打包,着实会觉得依赖性太大,并且容易出现错误,操作也比较复杂  同时,spring-boot-maven-plugin的使用感觉,相关配置太少,并且无法满足方便部署和运行的需...

Maven打包Spring boot,把依赖和配置文件及前端代码提取到jar文件外

运用到maven如下插件: maven-jar-plugin,负责将应用程序打包成可执行的jar文件  maven-assembly-plugin,负责将整个项目按照自定义的目录结构打成最终的...
  • e_wsq
  • e_wsq
  • 2017年12月12日 20:43
  • 32

Spring-boot中读取config配置文件的两种方式

了解过spring-Boot这个技术的,应该知道Spring-Boot的核心配置文件application.properties,当然也可以通过注解自定义配置文件的信息。 Spring-Boo...

Spring Boot Maven 打包可执行Jar文件!

Maven pom.xml 必须包含 jar org.springframework.boot spring-boot-maven-plugin ...

maven dao和service工程,spring 扫描jar中配置文件nullpointer的问题

今天试着用spring maven hibernate搭建了mvc项目时, dao,service分别作为两个子工程. service调用dao. 但是不太顺利. dao直接运行mvn test是可...

初识spring boot maven管理--配置文件

web环境下修改信息需要重启服务器,如果在一个大型的项目中经常重启服务器,那浪费的时间可想而知,今天介绍个好东西 --spring boot!一般学习都是从hello world开始学习的!下面介绍s...

使用maven给spring项目打可直接运行的jar包(配置文件内置外置的打法)

从网上看过许多打jar包的例子,大多是将配置文件打进jar包的。经过本人一番研究,终于搞清楚了怎样将jar包的配置文件外置。 废话不说,直接上spring的pom.xml的配置文件。 ...
  • hj7jay
  • hj7jay
  • 2016年07月30日 14:04
  • 2876

不使用Maven的情况下,搭建Spring+Struts+Hibernate框架 - jar包与配置文件

Spring+Struts+Hibernate被简称为SSH,是Java EE开发中比较流行的开发框架组合,很够方便快速的让你开发出你想要的网站。Spring负责解耦,主要是通过控制反转来实现。Str...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过Maven构建打包Spring boot,并将config配置文件提取到jar文件外
举报原因:
原因补充:

(最多只允许输入30个字)