Maven转Gradle后Java多模块项目编译失败:符号找不到及源版本错误
Maven转Gradle多模块项目编译失败问题解决
问题背景
原本可正常编译的Maven多模块项目,通过gradle init转换为Gradle项目后,编译失败,出现两类核心错误:
- "cannot find symbol":Gradle无法识别包括
Main类在内的多个类及其方法(如Main.getInstance()) - "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
相关产品推荐
相关产品推荐

