You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Maven迁移至Gradle时出现Main Class找不到错误

解决Spring Boot Gradle项目运行时找不到主类的问题

我正在STS中将一个Maven项目迁移至Gradle,原pom.xml内容如下:

<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>
  <groupId>com.myPack</groupId>
  <artifactId>sdk-devproxy</artifactId>
  <version>0.0.1-RELEASE</version>
  <packaging>jar</packaging>
  <name>sdk-devproxy</name>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-parent</artifactId>
        <version>Edgware.SR3</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-oauth2</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-zuul</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-log4j</artifactId>
      <version>1.3.8.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
    <dependency>
      <groupId>com.auth0</groupId>
      <artifactId>java-jwt</artifactId>
      <version>3.3.0</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>sdk-devproxy</finalName>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.7</version>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <mainClass>com.myPack.devproxy.DevProxyApp</mainClass>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.1.0</version>
      </plugin>
    </plugins>
  </build>
</project>

使用gradle init自动转换后生成的build.gradle文件:

apply plugin: 'java'
apply plugin: 'maven'

group = 'com.myPack'
version = '0.0.1-RELEASE'
description = """sdk-devproxy"""

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    maven { url "http://repo.maven.apache.org/maven2" }
}

dependencies {
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-oauth2', version:'1.2.2.RELEASE'
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-zuul', version:'1.4.4.RELEASE'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version:'1.5.10.RELEASE'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-log4j', version:'1.3.8.RELEASE'
    compile group: 'com.auth0', name: 'java-jwt', version:'3.3.0'
}

构建可成功完成,但运行Spring Boot应用时出现错误:

Error: Could not find or load main class com.myPack.mindsphere.devproxy.DevProxyApp

我尝试过刷新、重建、更新Gradle项目,还在build.gradle中添加了主类配置:

jar {
    manifest {
        attributes(
            'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
            'Main-Class': 'com.myPack.mindsphere.devproxy.DevProxyApp'
        )
    }
}

想请教可能的原因是插件/打包问题、jar兼容性问题还是其他原因?


问题分析与解决方案

咱们一步步拆解问题,先抓最核心的几个点:

1. 主类路径明显不一致

先看原pom.xml里的主类是com.myPack.devproxy.DevProxyApp,但你后来添加的Gradle配置里写成了com.myPack.mindsphere.devproxy.DevProxyApp——多了mindsphere这个包层级!这大概率是直接触发找不到主类的导火索,先核对你的实际主类所在的包路径,确保配置和代码目录完全匹配。

2. 缺失Spring Boot Gradle插件(核心根源)

原Maven项目用spring-boot-maven-plugin打包可执行Spring Boot Jar,但自动生成的Gradle配置只加了java和maven插件,完全没引入Spring Boot专属的Gradle插件。手动给普通Jar加Main-Class是没用的,因为Spring Boot需要特殊的打包格式(把依赖打包进去或者处理类加载逻辑),普通Jar不具备这些能力。

正确的Gradle配置修改方案

调整build.gradle,补上必要的插件和依赖管理,同时修正主类配置:

// 引入Spring Boot核心插件,负责打包可执行Jar
apply plugin: 'org.springframework.boot'
// 引入依赖管理插件,对应Maven的dependencyManagement功能
apply plugin: 'io.spring.dependency-management'
apply plugin: 'java'
apply plugin: 'maven'

group = 'com.myPack'
version = '0.0.1-RELEASE'
description = "sdk-devproxy"

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

// 配置Spring Boot和Spring Cloud的版本依赖,和原Maven的dependencyManagement对应
dependencyManagement {
    imports {
        mavenBom 'org.springframework.boot:spring-boot-starter-parent:1.5.10.RELEASE'
        mavenBom 'org.springframework.cloud:spring-cloud-starter-parent:Edgware.SR3'
    }
}

dependencies {
    compile 'org.springframework.cloud:spring-cloud-starter-oauth2'
    compile 'org.springframework.cloud:spring-cloud-starter-zuul'
    compile 'org.springframework.boot:spring-boot-starter-web'
    compile 'org.springframework.boot:spring-boot-starter-log4j:1.3.8.RELEASE'
    compile 'com.auth0:java-jwt:3.3.0'
}

// 用Spring Boot插件的方式配置主类,替代手动写Manifest
springBoot {
    mainClassName = 'com.myPack.devproxy.DevProxyApp'
}

后续操作步骤

  1. 删掉你之前手动添加的jar { manifest { ... } }配置,Spring Boot插件会自动处理Manifest和依赖打包。
  2. 执行gradle clean build重新构建项目。
  3. 可以用java -jar build/libs/sdk-devproxy-0.0.1-RELEASE.jar直接运行,或者在STS里调用Gradle的bootRun任务启动应用。
  4. 最后确认主类的物理路径:应该在src/main/java/com/myPack/devproxy/DevProxyApp.java,确保目录结构和包名完全一致。

为什么之前的方法无效?

  • 普通java插件打包的Jar是"瘦Jar",不包含依赖,也没有Spring Boot的类加载器支持,手动加Main-Class只能运行无外部依赖的简单程序,完全不适合Spring Boot应用。
  • 主类路径写错的话,哪怕打包逻辑正确,也会出现找不到类的错误,这是很容易忽略的细节。

内容的提问来源于stack exchange,提问作者smruti ranjan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:54:06