gpt4 book ai didi

java - Gradle 忽略从工件 pom.xml 检索时提供的配置的传递依赖性

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:08:39 24 4
gpt4 key购买 nike

我基于 java 的项目是使用 gradle 构建的。构建脚本对 jar 具有编译依赖性。

dependencies {
compile 'com.group:artificat:1.2.3'
}

在工件存储库中存在以下用于 artifact-1.2.3.jar 的 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.group</groupId>
<artifactId>artifact</artifactId>
<version>1.2.3</version>
<dependencies>
<dependency>
<groupId>org.jboss.spec.javax.ejb</groupId>
<artifactId>jboss-ejb-api_3.1_spec</artifactId>
<version>1.0.2.Final-redhat-3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.servlet</groupId>
<artifactId>jboss-servlet-api_3.0_spec</artifactId>
<version>1.0.2.Final-redhat-2</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

我的项目编译需要提供配置中的那些 jar,但 gradle 在编译代码时忽略它们,因此构建失败。

当依赖不可传递时,这不会发生。

作为变通方法,我添加了这些“硬编码”的依赖项

dependencies {
provided 'org.jboss.spec.javax.ejb:jboss-ejb-api_3.1_spec:1.0.2.Final-redhat-3'
provided 'org.jboss.spec.javax.servlet:jboss-servlet-api_3.0_spec:1.0.2.Final-redhat-2'
}

这个问题有更好的解决方案吗?

最佳答案

根据 Maven POM 引用,provided 依赖是不可传递的:

provided - this is much like compile, but indicates you expect the JDK or a container to provide it at runtime. It is only available on the compilation and test classpath, and is not transitive.

您绝对应该显式声明这些依赖项(就像您所做的那样)。

根据经验,如果您的应用程序在没有工件的情况下无法编译,那么该工件应该被列为显式依赖项。

否则,当构建中不再包含传递依赖时,您就会遇到麻烦。考虑:

  1. X 取决于 Y。
  2. 您声明对 X 的依赖。
  3. 你使用来自 Y 的类。
  4. 您升级到不再依赖于 Y 的 X 的新版本。
  5. 由于您对 Y 没有明确的依赖性,因此您的构建中断了。

关于java - Gradle 忽略从工件 pom.xml 检索时提供的配置的传递依赖性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34887229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com