升级Gradle 4.5至5.0及Java8至11时遇'java'组件未知属性错误
Gradle 4.5升级到5.0 + Java 8升级到11的问题解决
问题背景
我正尝试将Gradle从4.5版本升级到5.0版本,同时将Java从8升级到11。项目是包含backend和frontend的多模块项目,根项目的build.gradle代码如下:
apply plugin: 'maven-publish' apply plugin: 'java' def mavenArtifactId = 'root-project-name' group = 'com.root.project' allprojects { apply plugin: 'eclipse' version = '14.5.0-SNAPSHOT'; ext { buildDate = new Date(); productName = 'xyz' productDescription = 'xyz' gitVersion = getGitVersion(); } if( project.hasProperty('mvn_username')) { mvn_user = mvn_username } if(project.hasProperty('mvn_password')) { mvn_pass = mvn_password } repositories { maven { url releaseRepo } maven { url snapshotRepo } maven { url publicRepo } } } println "Version: " + version; def currentJvm = org.gradle.internal.jvm.Jvm.current() println "Building with java " + currentJvm // Define git version def getGitVersion() { def describeStdOut = new ByteArrayOutputStream() try { exec { commandLine 'git', 'describe', '--tags', '--always', '--dirty' standardOutput = describeStdOut ignoreExitValue true } describeStdOut.toString().trim() } catch(Exception e ) { "n/a" } } publish.dependsOn(':backend:test') publishing { repositories { maven { credentials { username=mvn_user password=mvn_pass } if (version.endsWith("-SNAPSHOT")) { url snapshotRepo } else { url releaseRepo } } } publications { mavenJava(MavenPublication) { artifactId = mavenArtifactId from project(':backend').components.java artifact project(':backend').javadocJar artifact project(':backend').sourceJar artifact examplePropertiesArtifact artifact exampleLog4jFileArtifact artifact windowsScriptFile artifact linuxScriptArtifact artifact aixScriptArtifact pom.withXml { asNode().appendNode('name', productName) asNode().appendNode('description', productDescription) } } } } //wrapper { // gradleVersion = '5.0' //}
遇到的错误
升级过程中触发如下错误:
Could not get unknown property 'java' for SoftwareComponentInternal set of type org.gradle.api.internal.component.DefaultSoftwareComponentContainer.
注:子项目backend的build.gradle中已应用java插件。
解决方案
问题根源
Gradle 5.0对组件引用机制做了变更,跨项目访问组件时,直接通过components.java获取可能因子项目配置时机问题导致组件未被正确识别。
修复步骤
- 调整组件引用方式:将根项目
publishing块中from project(':backend').components.java替换为以下两种方式之一:- 安全查找组件:
from project(':backend').components.findByName('java') - 显式指定产物(更清晰,可移除原
from行):artifact project(':backend').jar artifact project(':backend').javadocJar artifact project(':backend').sourceJar
- 安全查找组件:
- 启用Gradle 5.0 Wrapper:取消注释根项目中的
wrapper配置块,确保使用指定版本的Gradle:wrapper { gradleVersion = '5.0' } - 执行
./gradlew wrapper更新Wrapper,再重新构建项目验证问题是否解决。
内容的提问来源于stack exchange,提问作者Shubham kapoor
相关产品推荐
相关产品推荐

