SpringBoot:无法与maven创建战争:无法找到主类
Posted
技术标签:
【中文标题】SpringBoot:无法与maven创建战争:无法找到主类【英文标题】:SpringBoot: can't create war with maven: Unable to find main class 【发布时间】:2020-08-29 06:06:58 【问题描述】:我有一个带有 war 和 ear 模块的 SpringBoot 项目,我使用 maven(主要用于 Java 项目的构建自动化工具)和 IntelliJ IDEA 构建该项目。 这是我war项目的pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.bendiciones</groupId>
<artifactId>bendiciones-parent</artifactId>
<version>4.0.0-SNAPSHOT</version>
</parent>
<artifactId>bendiciones-war</artifactId>
<name>bendiciones war</name>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.bendicionesbendiciones</groupId>
<artifactId>bendiciones</artifactId>
<version>$project.version</version>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<finalName>bendiciones</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>$java.version</source>
<target>$java.version</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.bendiciones.Application</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<scm>
<tag>bendiciones-parent-4.0.0-SNAPSHOT</tag>
</scm>
</project>
但是当我构建类时出现这个错误:
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.1.5.RELEASE:repackage (repackage) on project bendiciones-war: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.1.5.RELEASE:repackage failed: Unable to find main class -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.1.5.RELEASE:repackage (repackage) on project bendiciones-war: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.1.5.RELEASE:repackage failed: Unable to find main class
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215)
项目中甚至存在类
【问题讨论】:
如果您将 Spring Boot 应用程序打包为 war 文件,则无需定义 mainClass 和目标 如果未指定,将使用找到的第一个包含“main”方法的编译类。 你的用例是什么?你有多种主要方法吗? 能否分享您的目录结构和整个 pom 文件以供进一步分析。 也用 main 方法分享你的类 【参考方案1】:添加您的 main(starterApplication) 类。 manifest中的“Main-Class”实际上是由Spring Boot plugin的“layout”属性控制的。
<build>
<plugins>
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.your.starter.Application</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
你需要检查META-INF/MANIFEST.MF
。
Main-Class: org.springframework.boot.loader.WarLauncher
Start-Class: com.your.starter.Application
The Executable War File Structure
example.war
|
+-META-INF
| +-MANIFEST.MF
+-org
| +-springframework
| +-boot
| +-loader
| +-<spring boot loader classes>
+-WEB-INF
+-classes
| +-com
| +-mycompany
| +-project
| +-YourClasses.class
+-lib
| +-dependency1.jar
| +-dependency2.jar
+-lib-provided
+-servlet-api.jar
+-dependency3.jar
或者使用父子关系构建。
<build>
<pluginManagement>
<plugins>
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</pluginManagement>
</build>
【讨论】:
spring boot不需要maven-war-plugin,spring-boot-maven-plugin生成war文件就够了,只需要定义打包为war即可。【参考方案2】:您正在将您的应用程序打包在 WAR 中,这表明您的应用程序是 Web 应用程序。因此,请在 pom.xml 中检查或添加以下重要的 Spring Boot 依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
【讨论】:
我添加了这个依赖,结果相同:-(以上是关于SpringBoot:无法与maven创建战争:无法找到主类的主要内容,如果未能解决你的问题,请参考以下文章
使用 spring boot 和 spring-boot-maven-plugin 生成战争时排除 application.properties
如何使用 maven 中的 tomcat 插件部署多个战争?