[关闭]
@xiaoxiaowang 2017-05-23T16:39:46.000000Z 字数 3098 阅读 5103

Maven系列(七)assembly打包-程序和依赖jar包分开化

maven 打包 发布: IT


  如果对maven不会用甚至不知道是什么的话,建议先看看下面几篇,看完,相信你会有所启发,并会对项目进行一个完整的依赖构建-打包测试-部署发布
- Maven系列(一)Maven的简介与使用
- Maven系列(二)无Maven不项目---使用Eclipse快速搭建Maven项目
- Maven系列(三)Maven给不同的环境打包
- Maven系列(四)Maven热部署
- Maven系列(五)CentOS7搭建最新GitLab
- Maven系列(六)配合GitLab持续集成(CI)

  开发过javaweb项目并发布过的兄dei知道,普通的war包放到tomcat里之后,随着tomcat的启动,war包会自动解压成文件,假如程序里有调用xml资源文件(不是spring相关的配置文件),那么在程序里指定相对路径就行了,但是最近我有一个服务里,我把一些账户的用户名和密码放在xml里,然后启动的时候调用到文件再使用xpath去取就行了,这是比较常规的做法,idea直接运行咩有问题,但是当我打成jar包在服务器上启动的时候,报错说是找不到资源文件,即我存用户名与密码的xml文件,思来想去,明白了,因为xml文件在jar包里,程序在执行的时候根本就找不到文件,因为jar包没有被解压,根据相对路径也就找不到文件(我是这么理解的,不知道对不对),这个时候我就明白了我以往的打包方式在这个服务是行不通的。这里说一下,我用的是springboot,打包的使用的是springboot提供的plugin,如下

  1. <plugin>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-maven-plugin</artifactId>
  4. </plugin>

一般来讲,使用这个插件,就自动将程序和那些依赖的jar包捆绑在一起,然后通过java -jar xxx.jar运行就OK了

再来说说maven打包的方式,整体来讲分为两大类

各有各的好,具体的还需要视项目来定。
接下来说说第二种打包方式,我这里使用的是maven插件assembly,自己顺便写了个linux下执行和停止的脚本,解决了上面的问题,而且使用起来很方便,下面是步骤

去掉其他打包的插件

我将springboot的打包插件删掉,使用下面的插件

  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. <manifest>
  8. <!--指定main入口-->
  9. <mainClass>com.quick.Application</mainClass>
  10. <addClasspath>true</addClasspath>
  11. <classpathPrefix>lib/</classpathPrefix>
  12. </manifest>
  13. <manifestEntries>
  14. <Class-Path>./</Class-Path>
  15. </manifestEntries>
  16. </archive>
  17. <excludes>
  18. <exclude>config/**</exclude>
  19. </excludes>
  20. </configuration>
  21. </plugin>
  22. <plugin>
  23. <artifactId>maven-assembly-plugin</artifactId>
  24. <configuration>
  25. <!-- not append assembly id in release file name -->
  26. <appendAssemblyId>false</appendAssemblyId>
  27. <descriptors>
  28. <!--打包的详细描述,需要配置额外文件-->
  29. <descriptor>src/main/build/package.xml</descriptor>
  30. </descriptors>
  31. </configuration>
  32. <executions>
  33. <execution>
  34. <id>make-assembly</id>
  35. <phase>package</phase>
  36. <goals>
  37. <goal>single</goal>
  38. </goals>
  39. </execution>
  40. </executions>
  41. </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. <!--压缩文件的类型-->
  7. <format>zip</format>
  8. </formats>
  9. <includeBaseDirectory>true</includeBaseDirectory>
  10. <fileSets>
  11. <!--需要包含的文件与输出的路径-->
  12. <fileSet>
  13. <directory>src/main/bin</directory>
  14. <outputDirectory>bin/</outputDirectory>
  15. </fileSet>
  16. <fileSet>
  17. <directory>src/main/resources</directory>
  18. <outputDirectory>/</outputDirectory>
  19. </fileSet>
  20. <fileSet>
  21. <directory>${project.build.directory}</directory>
  22. <outputDirectory>/</outputDirectory>
  23. <includes>
  24. <include>*.jar</include>
  25. </includes>
  26. </fileSet>
  27. </fileSets>
  28. <dependencySets>
  29. <dependencySet>
  30. <outputDirectory>lib</outputDirectory>
  31. <scope>runtime</scope>
  32. <excludes>
  33. <exclude>${groupId}:${artifactId}</exclude>
  34. </excludes>
  35. </dependencySet>
  36. </dependencySets>
  37. </assembly>

这些可以直接拿来用,如果想看详细的解析点我
下面是项目的结构目录

结构.png
项目里有脚本,在linux里可以执行,执行命令mvn clean install之后就会生成对应一个zip压缩包,解压后如图

文件目录.png
这样程序和jar包、资源文件分开,就方便调用了,代码上传到了github

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注