Spring Boot Maven Plugin打包异常解决方案

 更新时间:2020年11月23日 11:38:14   作者:门罗的魔术师  
这篇文章主要介绍了Spring Boot Maven Plugin打包异常解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

【背景】spring-boot项目,打包成可执行jar,项目内有两个带有main方法的类并且都使用了@SpringBootApplication注解(或者另一种情形:你有两个main方法并且所在类都没有使用@SpringBootApplication注解),pom.xml如下

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <version>1.5.3.RELEASE</version>
  <executions>
    <execution>
      <goals>
        <goal>repackage</goal>
      </goals>
    </execution>
  </executions>
</plugin>

【问题】

执行mvn clean package,报错如下(说点不相关的,使用install同理。因为spring-boot:repackage目标(goal)(下文会说)被绑定在package构建阶段(phases),而package阶段在install阶段之前,指定构建阶段之前的阶段都会执行。详细参见:Introduction to the Build Lifecycle

  [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.3.RELEASE:repackage (default) on project webapps-api-bid: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.5.3.RELEASE:repackage failed: Unable to find a single main class from the following candidates [com.xx.api.main.ApiBidMain, com.xx.webapps.api.main.WebappsApiBidMain]

执行mvn clean package spring-boot:repackage,报错如下,不如上面日志详细

  [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.3.RELEASE:repackage (default) on project webapps-api-bid: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.5.3.RELEASE:repackage failed: Unable to find main class

【解决】

  Note:参考官网描述,没有指定<mainClass>或者继承了spring-boot-starter-parent并且<start-class>属性未配置时,会自动寻找签名是public static void main(String[] args)的方法... 所以插件懵逼了,两个妹子和谁在一起呢...

[推荐] 通用解决方法:<configuration>下配置mainClass,指定程序入口。

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <version>1.5.3.RELEASE</version>
  <configuration>
    <mainClass>com.xx.webapps.api.main.WebappsApiBidMain</mainClass>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>repackage</goal>
      </goals>
    </execution>
  </executions>
</plugin>

  Spring Boot Maven Plugin提供了几个目标(goal),我们在<executions>标签里配置的<goal>repackage</goal>对应spring-boot:repackage这个目标。

  • repackage: create a jar or war file that is auto-executable. It can replace the regular artifact or can be attached to the build lifecyle with a separate classifier.
  • run: run your Spring Boot application with several options to pass parameters to it.
  • start and stop: integrate your Spring Boot application to the integration-test phase so that the application starts before it.

  The plugin rewrites your manifest, and in particular it manages theMain-ClassandStart-Classentries, so if the defaults don't work you have to configure those there (not in the jar plugin). TheMain-Classin the manifest is actually controlled by thelayoutproperty of the boot plugin

  [译] 该插件重写了清单文件(MANIFEST.MF,也就是jar里面的清单文件),此文件管理着主类(Main-Class)和开始类(Start-Class)入口。清单文件中的Main-Class由layout控制

  这里的Start-Class就是我们配置的<mainClass>,而Main-Class受layout属性的控制,别被名字搞乱了(是不是很诡异?看看解决方法二就明白为啥如此诡异了).... 来张图直观的感受下,对应使用上面xml配置打包后的清单文件(MANIFEST.MF):

  

  layout属性默认不需要配置,插件会自动推断。不同的layout属性清单文件里面的Main-Class也会相应的不同。比如layout不配置或者配置为JAR对应的Main-Class是JarLauncher,layout配置为WAR对应的Main-Class是WarLauncher。

[有限制条件]解决方法二:如果你的pom继承自spring-boot-starter-parent(注意此前提),也可以直接在<properties>配置<start-class>(其实这里的start-class直接对应清单文件里的Start-Class):

<properties>
  <start-class>com.xx.webapps.api.main.WebappsApiBidMain</start-class>
</properties>

解决方法三:打包的的时候注释掉其他的@SpringBootApplication... 或者你有两处main方法并且都没有使用@SpringBootApplication注解,注释掉一个main方法..... 这就是第三种解决方法233333

【随便说说】

  说说spring-boot:repackage这个目标。Spring Boot Maven Plugin这个插件包含一系列目标(goal),我们在<executions>标签里配置的<goal>repackage</goal>对应spring-boot:repackage这个目标,看下官方介绍

  spring-boot:repackage repackages your jar/war to be executable.

  Repackages existing JAR and WAR archives so that they can be executed from the command line using java -jar. Withlayout=NONEcan also be used simply to package a JAR with nested dependencies (and no main class, so not executable).

  简单点说,这货重新打包个可执行的jar/war,可以在命令行使用-jar执行。如果指定layout为NONE那就没有主类只是打个普通的jar(不可执行),一般不会这么做。

  一般情况,这个目标会打一个新的jar/war,并把maven默认打的jar/war添加.original后缀,在target目录下可以看到:

【参考】

1.https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/

2.https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/maven-plugin//repackage-mojo.html

3.https://stackoverflow.com/questions/23217002/how-do-i-tell-spring-boot-which-main-class-to-use-for-the-executable-jar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 基于Java实现Redis多级缓存方案

    基于Java实现Redis多级缓存方案

    这篇文章主要介绍了Redis多级缓存方案分享,传统缓存方案、多级缓存方案、JVM本地缓存,举例说明这些方案,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-03-03
  • 基于Spring Boot不同的环境使用不同的配置方法

    基于Spring Boot不同的环境使用不同的配置方法

    下面小编就为大家分享一篇基于Spring Boot不同的环境使用不同的配置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 浅谈java 字符串,字符数组,list间的转化

    浅谈java 字符串,字符数组,list间的转化

    下面小编就为大家带来一篇浅谈java 字符串,字符数组,list间的转化。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Spring中@Transactional注解的使用详解

    Spring中@Transactional注解的使用详解

    @Transactional注解是Spring提供的一种声明式事务管理方式,这篇文章主要为大家详细介绍了@Transactional注解的原理分析及使用,需要的可以参考一下
    2023-05-05
  • Mybatis中SqlSession接口中selectList方法详解

    Mybatis中SqlSession接口中selectList方法详解

    这篇文章主要给大家介绍了关于Mybatis中SqlSession接口中selectList方法的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03
  • IDEA报错:Unable to save settings Failed to save settings

    IDEA报错:Unable to save settings Failed to save settings

    这篇文章主要介绍了IDEA报错:Unable to save settings Failed to save settings的相关知识,本文给大家分享问题原因及解决方案,需要的朋友可以参考下
    2020-09-09
  • SpringBoot中 Jackson 日期的时区和日期格式问题解决

    SpringBoot中 Jackson 日期的时区和日期格式问题解决

    因为最近项目需要国际化,需要能够支持多种国际化语言,目前需要支持三种(法语、英语、简体中文),这篇文章主要介绍了SpringBoot中 Jackson 日期的时区和日期格式问题,需要的朋友可以参考下
    2022-12-12
  • java split用法详解及实例代码

    java split用法详解及实例代码

    这篇文章主要介绍了java split用法的相关资料,并附实例代码,帮助大家学习参考,需要的朋友可以参考下
    2016-09-09
  • Java全能工具类之Hutool的用法详解

    Java全能工具类之Hutool的用法详解

    Hutool是一个Java工具类库,由国内的程序员loolly开发,目的是提供一些方便、快捷、实用的工具类和工具方法,本文就来详细聊聊它的使用吧
    2023-03-03
  • 详细讲解Java的泛型

    详细讲解Java的泛型

    这篇文章主要介绍了Java的泛型,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09

最新评论