转自:https://blog.csdn.net/qq_26597927/article/details/80170073

Maven打包三种方法(推荐第三种)

2018年05月02日 18:30:23 wind_gogo 阅读数:14853
 
版权声明: https://blog.csdn.net/qq_26597927/article/details/80170073

Maven可以使用mvn package指令对项目进行打包,如果使用Java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in xxx.jar"(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。

要想jar包能直接通过java -jar xxx.jar运行,需要满足:

1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,这样才能确定程序的入口在哪里;

2、要能加载到依赖包。

使用Maven有以下几种方法可以生成能直接运行的jar包,可以根据需要选择一种合适的方法。

方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包

在pom.xml中配置:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-jar-plugin</artifactId>
  6. <version>2.6</version>
  7. <configuration>
  8. <archive>
  9. <manifest>
  10. <addClasspath>true</addClasspath>
  11. <classpathPrefix>lib/</classpathPrefix>
  12. <mainClass>com.xxg.Main</mainClass>
  13. </manifest>
  14. </archive>
  15. </configuration>
  16. </plugin>
  17. <plugin>
  18. <groupId>org.apache.maven.plugins</groupId>
  19. <artifactId>maven-dependency-plugin</artifactId>
  20. <version>2.10</version>
  21. <executions>
  22. <execution>
  23. <id>copy-dependencies</id>
  24. <phase>package</phase>
  25. <goals>
  26. <goal>copy-dependencies</goal>
  27. </goals>
  28. <configuration>
  29. <outputDirectory>${project.build.directory}/lib</outputDirectory>
  30. </configuration>
  31. </execution>
  32. </executions>
  33. </plugin>
  34. </plugins>
  35. </build>

maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容,<mainClass>com.xxg.Main</mainClass>指定MANIFEST.MF中的Main-Class,<addClasspath>true</addClasspath>会在MANIFEST.MF加上Class-Path项并配置依赖包,<classpathPrefix>lib/</classpathPrefix>指定依赖包所在目录。

例如下面是一个通过maven-jar-plugin插件生成的MANIFEST.MF文件片段:

  1. Class-Path: lib/commons-logging-1.2.jar lib/commons-io-2.4.jar
  2. Main-Class: com.xxg.Main

只是生成MANIFEST.MF文件还不够,maven-dependency-plugin插件用于将依赖包拷贝到<outputDirectory>${project.build.directory}/lib</outputDirectory>指定的位置,即lib目录下。

配置完成后,通过mvn package指令打包,会在target目录下生成jar包,并将依赖包拷贝到target/lib目录下,目录结构如下:

指定了Main-Class,有了依赖包,那么就可以直接通过java -jar xxx.jar运行jar包。

这种方式生成jar包有个缺点,就是生成的jar包太多不便于管理,下面两种方式只生成一个jar文件,包含项目本身的代码、资源以及所有的依赖包。

方法二:使用maven-assembly-plugin插件打包

在pom.xml中配置:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-assembly-plugin</artifactId>
  6. <version>2.5.5</version>
  7. <configuration>
  8. <archive>
  9. <manifest>
  10. <mainClass>com.xxg.Main</mainClass>
  11. </manifest>
  12. </archive>
  13. <descriptorRefs>
  14. <descriptorRef>jar-with-dependencies</descriptorRef>
  15. </descriptorRefs>
  16. </configuration>
  17. </plugin>
  18. </plugins>
  19. </build>

打包方式:

  1. mvn package assembly:single

打包后会在target目录下生成一个xxx-jar-with-dependencies.jar文件,这个文件不但包含了自己项目中的代码和资源,还包含了所有依赖包的内容。所以可以直接通过java -jar来运行。

此外还可以直接通过mvn package来打包,无需assembly:single,不过需要加上一些配置:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-assembly-plugin</artifactId>
  6. <version>2.5.5</version>
  7. <configuration>
  8. <archive>
  9. <manifest>
  10. <mainClass>com.xxg.Main</mainClass>
  11. </manifest>
  12. </archive>
  13. <descriptorRefs>
  14. <descriptorRef>jar-with-dependencies</descriptorRef>
  15. </descriptorRefs>
  16. </configuration>
  17. <executions>
  18. <execution>
  19. <id>make-assembly</id>
  20. <phase>package</phase>
  21. <goals>
  22. <goal>single</goal>
  23. </goals>
  24. </execution>
  25. </executions>
  26. </plugin>
  27. </plugins>
  28. </build>

其中<phase>package</phase>、<goal>single</goal>即表示在执行package打包时,执行assembly:single,所以可以直接使用mvn package打包。

不过,如果项目中用到spring Framework,用这种方式打出来的包运行时会出错,使用下面的方法三可以处理。

方法三:使用maven-shade-plugin插件打包

在pom.xml中配置:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-shade-plugin</artifactId>
  6. <version>2.4.1</version>
  7. <executions>
  8. <execution>
  9. <phase>package</phase>
  10. <goals>
  11. <goal>shade</goal>
  12. </goals>
  13. <configuration>
  14. <transformers>
  15. <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  16. <mainClass>com.xxg.Main</mainClass>
  17. </transformer>
  18. </transformers>
  19. </configuration>
  20. </execution>
  21. </executions>
  22. </plugin>
  23. </plugins>
  24. </build>

配置完成后,执行mvn package即可打包。在target目录下会生成两个jar包,注意不是original-xxx.jar文件,而是另外一个。和maven-assembly-plugin一样,生成的jar文件包含了所有依赖,所以可以直接运行。

如果项目中用到了Spring Framework,将依赖打到一个jar包中,运行时会出现读取XML schema文件出错。原因是Spring Framework的多个jar包中包含相同的文件spring.handlers和spring.schemas,如果生成一个jar包会互相覆盖。为了避免互相影响,可以使用AppendingTransformer来对文件内容追加合并:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-shade-plugin</artifactId>
  6. <version>2.4.1</version>
  7. <executions>
  8. <execution>
  9. <phase>package</phase>
  10. <goals>
  11. <goal>shade</goal>
  12. </goals>
  13. <configuration>
  14. <transformers>
  15. <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  16. <mainClass>com.xxg.Main</mainClass>
  17. </transformer>
  18. <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  19. <resource>META-INF/spring.handlers</resource>
  20. </transformer>
  21. <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  22. <resource>META-INF/spring.schemas</resource>
  23. </transformer>
  24. </transformers>
  25. </configuration>
  26. </execution>
  27. </executions>
  28. </plugin>
  29. </plugins>
  30. </build>

Maven打包方式的更多相关文章

  1. Maven打包方式整理

    方法一 maven-jar-plugin和maven-dependency-plugin插件打包 <build> <plugins> <plugin> <gr ...

  2. IntelliJ IDEA自身以及maven项目打包方式

    1. Idea自身打包方式 1.1 创建Artifacts 快捷键(Ctrl+Alt+Shift+S)打开项目的Project Structure.在Artifacts创建 接着,指定main cla ...

  3. Spring Boot使用Maven自定义打包方式

    前言:本文将告诉你如何将程序Jar与与依赖Jar及配置文件分离打包,以下列举了两种不同Maven打包方式,其打包效果一致! 一.第一种Maven打包方式,将jar及resources下全部配置文件,拷 ...

  4. Maven打包可执行Jar包方式

    第一步:pom.xm中的build标签下加入maven插件配置,打包生成可执行jar包方式Maven中的打包方式更换为 <packaging>jar</packaging> b ...

  5. Maven打包的三种方式(转)

    Maven可以使用mvn package指令对项目进行打包,如果使用Java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in ...

  6. maven的两种打包方式

    1.maven目前在web上面的使用方式很普遍,而打包的方式也存在很多方式 2.因为涉及一个项目调用另外一个项目的包,并将另外一个项目打成jar的形式便于管理 3.maven打包第一种方式: 将项目检 ...

  7. Maven打包的三种方式

    Maven可以使用mvn package指令对项目进行打包,如果使用Java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in ...

  8. Maven三种打包方式jar war pom

    1.pom工程 用在父级工程或聚合工程中.用来做jar包的版本控制.必须指明这个聚合工程的打包方式为pom 2.war工程 将会打包成war,发布在服务器上的工程.如网站或服务.在SpringBoot ...

  9. maven的三种项目打包方式----jar,war,pom

    1.pom工程:**用在父级工程或聚合工程中.用来做jar包的版本控制.必须指明这个聚合工程的打包方式为pom 2.war工程:将会打包成war,发布在服务器上的工程.如网站或服务.在SpringBo ...

随机推荐

  1. MyBatis和Spring整合的奥秘

    本篇博客源码分析基于Spring 5.1.16.RELEASE,mybatis-spring 2.0.0,较高版本的mybatis-spring源码有较大区别. Spring之所以是目前Java最受欢 ...

  2. 2020/7/6博客日报Java的开始--pthread的安装

    1.今天进行了Java环境的安装,安装eclipse之后学习了eclipse的使用方法,如何建立项目,并完成了最基本的Java hello的运行: 今天是Java的开端,开始进入Java编程: 今天了 ...

  3. [Mybatis]Mybatis常用操作

    Mybatis是目前国内比较流行的ORM框架,特点是可以写灵活的SQL语句,非常适合中小企业的面向数据库开发. 本文总结自己开发过程中常用的Mybatis操作. 一.插入操作 主键自增插入单条 < ...

  4. [JAVA]移位运算(左移<<,右移>>和无符号右移>>>)

    一.背景知识 整数在内存中是以二进制的形式存在的,而且存的是该整数的补码.最高位代表符号位,正数为0,负数为1 正数的补码是其二进制本身,负数的补码则是 符号位保持1不变,其他位按位取反再加1,+0和 ...

  5. linux专题(二):走近Linux系统 (2020-04-08 10:08)

    http://dwz.date/UDf 走近Linux系统 开机登录 开机会启动许多程序.它们在Windows叫做"服务"(service),在Linux就叫做"守护进程 ...

  6. 网络编程-HTTPS

    明文: 对称加密: 非对称:(公钥:pk 私钥:sk) 对称+非对称: 先用非对称方式发送num1给server,server用私钥得出key(由num1算出来),自此,约定C.S以此key(num1 ...

  7. (4)webpack中配置css,scss,less第三方loader

    为什么要使用第三方loader 一般引入样式文件,我们会在html中引入样式标签. 很明显,这样就跟之前在script中引入js文件一样,会导致二次请求.我们希望webpack像处理js文件一样处理样 ...

  8. .Net Core微服务入门全纪录(完结)——Ocelot与Swagger

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 前言 上一篇[.Net Core微服务入门全纪录(八)--Docker Compose与容器网络]完成了docker-compose.y ...

  9. 基于python的自动化测试简介【十年从业大佬】

    一.自动化测试包括以下几个方面: 1. 常用测试工具: (1)QTP:主要用于回归测试和测试同一软件的新版本 (2)Robot Framwork:python编写的功能自动化测试框架,具有良好的可扩展 ...

  10. lua的table表去重

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321  我的个人博客 方法一 用过lua的人都知道,lua的table中不允许存在相同的key,利用这个思想,我们可以将原始table ...