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

Maven转Gradle后Java多模块项目编译失败:符号找不到及源版本错误

Maven转Gradle多模块项目编译失败问题解决

问题背景

原本可正常编译的Maven多模块项目,通过gradle init转换为Gradle项目后,编译失败,出现两类核心错误:

  1. "cannot find symbol":Gradle无法识别包括Main类在内的多个类及其方法(如Main.getInstance())
  2. "invalid source release: 17":执行./gradlew assemble时提示Java版本不兼容,尽管全程使用Java 17 SDK。

未修改任何业务代码,仅变更构建配置文件。

错误示例

Main instance = Main.getInstance();
                           ^
  symbol:   method getInstance()
  location: class Main
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':PixliesCore:compileJava'.
> invalid source release: 17

当前Gradle配置文件

根项目build.gradle

plugins {
    id "java"
    id "com.github.johnrengelman.shadow" version "7.1.2"
    id "war"
}

group "net.pixlies"
version "1.0-SNAPSHOT"

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

subprojects {
    compileJava.options.encoding = "UTF-8"

    apply plugin: "java"
    apply plugin: "war"
    apply plugin: "com.github.johnrengelman.shadow"

    compileJava {
        sourceCompatibility = 17
        targetCompatibility = 17
    }
}

repositories {
    mavenCentral()
    maven { url "https://repo.purpurmc.org/snapshots/" }
    maven { url "https://repo.extendedclip.com/content/repositories/placeholderapi/" }
    maven { url "https://repo.aikar.co/content/groups/aikar/" }
    maven { url "https://repo.dmulloy2.net/repository/public/" }
}

dependencies {
    implementation "org.mongodb:mongo-java-driver:3.12.11"
    implementation "commons-io:commons-io:2.11.0"
    implementation "co.aikar:acf-paper:0.5.1-SNAPSHOT"
    implementation "org.ocpsoft.prettytime:prettytime:5.0.3.Final"
    implementation "commons-lang:commons-lang:2.6"
}

settings.gradle

pluginManagement {
    repositories {
        gradlePluginPortal()
        maven { url "https://papermc.io/repo/repository/maven-public/" }
    }
}

rootProject.name = 'version-two'

include(':PixliesCore')
include(':LobbyModule')
include(':MiniMick')
include(':ProtoBusiness')
include(':PixliesFun')
include(':Nations')
include(':DiploMaurice')
include(':PixliesProxyCore')

PixliesCore子项目build.gradle

plugins {
    id 'net.pixlies.java-conventions'
}

dependencies {
    implementation 'com.github.stefvanschie.inventoryframework:IF:0.10.7'
    implementation 'org.projectlombok:lombok:1.18.24'
    implementation 'redis.clients:jedis:4.2.3'
    implementation 'joda-time:joda-time:2.11.1'
    compileOnly 'org.purpurmc.purpur:purpur-api:1.19-R0.1-SNAPSHOT'
    compileOnly 'com.comphenix.protocol:ProtocolLib:4.7.0'
    compileOnly 'me.clip:placeholderapi:2.11.2'
    compileOnly 'net.luckperms:api:5.4'
}

description = 'PixliesCore'

原Maven配置文件(参考)

根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>

    <modules>
        <module>PixliesCore</module>
        <module>Nations</module>
        <module>MiniMick</module>
        <module>LobbyModule</module>
        <module>PixliesFun</module>
        <module>PixliesProxyCore</module>
        <module>DiploMaurice</module>
        <module>ProtoBusiness</module>
    </modules>

    <groupId>net.pixlies</groupId>
    <artifactId>version-two</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.12.11</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
        <dependency>
            <groupId>co.aikar</groupId>
            <artifactId>acf-paper</artifactId>
            <version>0.5.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.ocpsoft.prettytime</groupId>
            <artifactId>prettytime</artifactId>
            <version>5.0.3.Final</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>purpur</id>
            <url>https://repo.purpurmc.org/snapshots</url>
        </repository>
        <repository>
            <id>aikar</id>
            <url>https://repo.aikar.co/content/groups/aikar/</url>
        </repository>
            <repository>
                <id>placeholderapi</id>
                <url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
            </repository>
        <repository>
            <id>dmulloy2-repo</id>
            <url>https://repo.dmulloy2.net/repository/public/</url>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>16</source>
                    <target>16</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

PixliesCore子项目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>
        <artifactId>version-two</artifactId>
        <groupId>net.pixlies</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>PixliesCore</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>

    <repositories>
        <repository>
            <id>aikar</id>
            <url>https://repo.aikar.co/content/groups/aikar/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>com.github.stefvanschie.inventoryframework</groupId>
            <artifactId>IF</artifactId>
            <version>0.10.7</version>
        </dependency>
        <dependency>
            <groupId>org.purpurmc.purpur</groupId>
            <artifactId>purpur-api</artifactId>
            <version>1.19-R0.1-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>com.comphenix.protocol</groupId>
            <artifactId>ProtocolLib</artifactId>
            <version>4.7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>4.3.1</version>
        </dependency>
        <dependency>
            <groupId>me.clip</groupId>
            <artifactId>placeholderapi</artifactId>
            <version>2.11.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.12.2</version>
        </dependency>
        <dependency>
            <groupId>net.luckperms</groupId>
            <artifactId>api</artifactId>
            <version>5.4</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <pluginRepositories>
        <pluginRepository>
            <id>maven-snapshots</id>
            <url>https://repository.apache.org/content/repositories/snapshots/</url>
        </pluginRepository>
    </pluginRepositories>

    <properties>
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
    </properties>

    <build>
        <defaultGoal>clean package</defaultGoal>
        <finalName>PixliesCore</finalName>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.3.1-SNAPSHOT</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <dependencyReducedPomLocation>${project.build.directory}/dependency-reduced-pom.xml</dependencyReducedPomLocation>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

解决步骤

1. 统一Java版本配置

原Maven项目使用Java 16,Gradle中强制设置为17导致版本不兼容,可二选一:

  • 方案A:匹配原Maven的Java 16
    修改根build.gradle:
    java {
        toolchain {
            languageVersion = JavaLanguageVersion.of(16)
        }
    }
    
    subprojects {
        // ... 其他配置
        compileJava {
            sourceCompatibility = 16
            targetCompatibility = 16
        }
    }
    
  • 方案B:升级到Java 17
    确认本地JAVA_HOME指向Java 17,检查代码中是否有Java 16专属语法并调整,保持Gradle的Java 17配置不变。

2. 修复根项目依赖传递

Gradle根项目的dependencies不会自动传递给子项目,需将根依赖移到subprojects块中:

subprojects {
    // ... 其他配置
    dependencies {
        implementation "org.mongodb:mongo-java-driver:3.12.11"
        implementation "commons-io:commons-io:2.11.0"
        implementation "co.aikar:acf-paper:0.5.1-SNAPSHOT"
        implementation "org.ocpsoft.prettytime:prettytime:5.0.3.Final"
        implementation "commons-lang:commons-lang:2.6"
    }
}

删除根项目下独立的dependencies块。

3. 添加Lombok插件支持

PixliesCore使用Lombok但未配置对应插件,导致生成的方法无法被识别。修改PixliesCore的build.gradle:

plugins {
    id 'net.pixlies.java-conventions'
    id 'io.freefair.lombok' version '8.4'
}

// ... 其他配置

也可在subprojects块中统一添加该插件,覆盖所有子项目。

4. 移除不必要的War插件

原Maven中PixliesCore是Jar包,Gradle的War插件会干扰构建,删除:

  • 根build.gradle中的id "war"
  • subprojects块中的apply plugin: "war"

5. 补全模块间依赖

如果其他子项目依赖PixliesCore,在对应子项目的build.gradle中添加:

dependencies {
    implementation project(':PixliesCore')
}

验证执行

修改完成后,执行命令清理并重新构建:

./gradlew clean assemble

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:20:31