JAVA

Spring boot 项目 mvn clean install 报 “Unable to find main class”

  1. Unable to find main class

最近在做项目,使用是spring boot。做了一段时间想打包放到服务器上看看效果。于是使用maven命令进行打包。

出现了下面的错误。

 Unable to find main class

原来spring boot项目使用maven打包,如果没有做配置的话,会自动寻找签名是public static void main(String[] args)的方法。

检查项目中是否有main方法并且main方法上是否有 @SpringBootApplication 注解。

mvn 会自动在项目中找main方法加入到jar中的主清单属性中。
如果没有没有找到main方法,当你打包的时候就会报错  "Unable to find main class"。

2.Unable to find a single main class


当项目中多个class存在main方法,结果提示另外的错误:

 Unable to find a single main class

检查项目中是否有多个main方法

如果项目中存在多个main方法,mvn会不知道你究竟想要用哪个main方法作为jar包的清单属性
所以这个时候你必须要在pom.xml文件中指定一个 mainClass 
如果项目中存在多个main方法,mvn会不知道你究竟想要用哪个main方法作为jar包的清单属性
所以这个时候你必须要在pom.xml文件中指定一个 mainClass 
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.**.**.testApplication</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>
mvn 之所以能找到项目中的main方法,是因为mvn有一套自己的项目结构
例如:
source (源码) 目录:
      /src/main/java
resources (所需资源) 目录:
     /src/main/resources
所以需要检查我们的项目结构是否是按照maven的默认项目结构的标准
在IDEA中,如果项目结构不是这种默认的结构的话,我们需要在IDEA中指定source或resources目录
如果已经按照这种默认项目结构的标准导入IDEA是不需要手动指定source的
同理,如果不按照这种默认标准创建项目mvn默认也不认识项目中的source
所以我们也可以通过如下配置指定source和resource目录
<build>
   <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
   <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.**.**.testApplication</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>
但是不推荐修改默认的项目结构,还是推荐使用maven提供的默认项目结构来创建项目

3.Maven多模块打包遇到的问题


多模块打包时,子模块提示找不到main class,有人说直接在子模块加上mainclass就好了,可是往往打的是dao层的包,他就是一个jar,不是一个可执行程序,本来就没有入口class。那该如何设置呢?

其实很简单,只需要在子模块中添加:

<plugin>
	            <groupId>org.springframework.boot</groupId>
	            <artifactId>spring-boot-maven-plugin</artifactId>
	            <configuration>
	                <skip>true</skip>
	            </configuration>
</plugin>

配置添加,设置过滤即可。