gradle 不会从我在 build.gradle 中指定的库中的依赖版本中的父属性中解析占位符
Posted
技术标签:
【中文标题】gradle 不会从我在 build.gradle 中指定的库中的依赖版本中的父属性中解析占位符【英文标题】:gradle doesn't resolve placeholder from parent properties in dependency version that is inside library that I specified in build.gradle 【发布时间】:2021-07-20 00:18:36 【问题描述】:我有一个关于通过 gradle 解决依赖版本的有趣问题。这是我的情况。我将我的库部署到了 nexus。在这个过程中,我使用了 flatten-maven-plugin 和 resolveCiFriendliesOnly flattenMode。结果我在nexus中有父pom文件和子pom文件。
来自源的父 pom 文件:
<groupId>ru.example</groupId>
<artifactId>example-parent</artifactId>
<version>$revision$changelist</version>
<packaging>pom</packaging>
<properties>
<revision>0.0.1</revision>
<changelist>-SNAPSHOT</changelist>
<version.base>$revision$changelist</version.base>
<example-child.version>$version.base</example-child.version>
<example-child-dependency.version>$version.base</example-child-dependency.version>
</properties>
来自源的子 pom 文件
<parent>
<groupId>ru.example</groupId>
<artifactId>example-parent</artifactId>
<version>$revision$changelist</version>
<relativePath>..</relativePath>
</parent>
<artifactId>example-child</artifactId>
<version>$example-child.version</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>ru.example</groupId>
<artifactId>example-child-dependency</artifactId>
<version>$example-child-dependency.version</version>
</dependency>
</dependencies>
nexus 的父 pom 文件
<groupId>ru.example</groupId>
<artifactId>example-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<version.base>0.0.1-SNAPSHOT</version.base>
<revision>0.0.1</revision>
<changelist>-SNAPSHOT</changelist>
<example-child.version>$version.base</example-child.version>
<example-child-dependency.version>$version.base</example-child-dependency.version>
<properties>
nexus 的子 pom 文件
<parent>
<groupId>ru.example</groupId>
<artifactId>example-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<groupId>ru.example</groupId>
<artifactId>example-child</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>ru.example</groupId>
<artifactId>example-child-dependency</artifactId>
<version>$example-child-dependency.version</version>
</dependency>
</dependencies>
之后我尝试使用 gradle 构建 java 应用程序。在这个应用程序的 build.gradle 文件中,我有这样一行:
dependencies
implementation("ru.example:example-child:0.0.1-SNAPSHOT")
构建失败并出现错误:
> Task :java_application:compileJava
Resolving global dependency management for project 'java_application'
Errors occurred while build effective model from /u01/jenkins_slave/.gradle/caches/modules-
2/files-2.1/ru.example/example-child/0.0.1-
SNAPSHOT/809129e53f76bfb7b6a141e9aeb8ffb1a692e76c/example-child-0.0.1-SNAPSHOT.pom:
'dependencies.dependency.version' for ru.example:example-child-dependency:jar must be a
valid version but is '$example-child-dependency.version'. in ru.example:example-
child:0.0.1-SNAPSHOT
为什么 gradle 不解析子项目依赖的占位符?
【问题讨论】:
【参考方案1】:gradle
似乎没有评估$example-child-dependency.version
,您可能必须使用mvn
构建才能为gradle
生成消耗/静态*.pom
。我的意思是,mvn
很可能会评估 *.pom
,而 gradle
不会。
那可能是:
<artifactId>example-child-dependency</artifactId>
<version>$version.base</version>
【讨论】:
嗨,马丁。谢谢你的答案。我使用了“example-child-dependency.version”,因为将来这些子项目的版本可能会有所不同。以上是关于gradle 不会从我在 build.gradle 中指定的库中的依赖版本中的父属性中解析占位符的主要内容,如果未能解决你的问题,请参考以下文章
gradle 中的 shadow 插件不起作用 - gradle build 不会构建胖 jar
如何防止Android studio格式化build.gradle