从Maven依赖继承子依赖

时间:2020-10-29 15:52:22

标签: maven maven-2 maven-3

我有两个独立的Maven项目。
项目A包含实用程序类和类似的东西。它还在某些界面中使用jetbrains批注将参数标记为Nullable和NotNullable。

<dependency>
    <groupId>org.jetbrains</groupId>
    <artifactId>annotations</artifactId>
    <version>20.1.0</version>
</dependency>

项目B使用项目A的某些实用程序。它作为我存储库中的依赖项包括在内。

<dependency>
    <groupId>org.test.group</groupId>
    <artifactId>Utilities</artifactId>
    <version>1.0</version>
</dependency>

我可以从我的实用程序依赖项中访问类。但是我看不到参数上的任何注释。我也无法在我在那里的任何课程中访问项目B中的jetbrains注释。我也必须在项目B中添加jetbrains依赖项。

是否可以继承其他依赖项的依赖项?
我查看了其他问题,发现了this similar one。他的解决方案是将可选参数设置为false,我什至没有使用。也许还需要在Maven构建中进行配置?当前,我正在使用目标clean package deploy运行我的构建,而没有任何特殊的附加配置。
我知道gradle构建允许implementationapi依赖关系,其中一个将依赖关系转发给其他包含该依赖关系的项目,而另一个则不。

编辑:这里是我项目的完整配置
在包含我的工件的localhost:8081下运行的本地关系。在localhost:8080下运行的本地TeamCity用于构建和部署到存储库。

项目A 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>

    <groupId>org.test.group</groupId>
    <artifactId>Utilities</artifactId>
    <version>1.0</version>

    <name>Utilities</name>

    <dependencies>
        <dependency>
            <groupId>org.jetbrains</groupId>
            <artifactId>annotations</artifactId>
            <version>20.1.0</version>
        </dependency>
    </dependencies>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <distributionManagement>
        <repository>
            <id>local_nexus</id>
            <name>Deployment</name>
            <url>http://localhost:8081/repository/org.test.group/</url>
        </repository>
    </distributionManagement>
</project>

项目B 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>

    <groupId>org.test.group</groupId>
    <artifactId>TestProject</artifactId>
    <version>1.0</version>
    <name>TestProject</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.test.group</groupId>
            <artifactId>Utilities</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>local_nexus</id>
            <name>Deployment</name>
            <url>http://localhost:8081/repository/org.test.group/</url>
        </repository>
    </repositories>

    <distributionManagement>
        <repository>
            <id>local_nexus</id>
            <name>Deployment</name>
            <url>http://localhost:8081/repository/org.test.group/</url>
        </repository>
    </distributionManagement>

</project>

编辑2:
我已经取得了一些进展。由于添加注释后我没有更改Project A的版本,因此我的本地存储库未获取新版本。使用mvn dependency:purge-local-repository清除后,可以使用1.0版的更新状态。
mvn dependency:tree立即打印

[INFO] org.test.TestProject:jar:1.0
[INFO] \- org.test:Utilities:jar:1.0:compile
[INFO]    \- org.jetbrains:annotations:jar:20.1.0:compile

我的IDE(Intellij)仍然无法识别TestProject中的注释类。知道为什么现在失败了吗?

2 个答案:

答案 0 :(得分:1)

您自动继承了annotations,不需要进行配置。

如果它属于范围provided,则您不会继承它。查看mvn dependency:tree,以了解annotations库的位置和范围。

顺便说一句:mvn clean package deploy是浪费时间,只需使用mvn clean deploy

答案 1 :(得分:0)

问题是由我的本地Maven存储库引起的。由于我没有更改Project A工件的版本(始终为1.0),所以我的本地存储库一直为我提供1.0版的旧状态。
使用mvn dependency:purge-local-repository,我可以清理旧的1.0并加载新的1.0。我的IDE仍然拒绝导入annotations依赖项。此时,它已被mvn dependency:tree列出。
经过一段时间的IDE调试后,我决定将版本更新为1.1。一旦构建了Project A的1.1,并且将Project B的依赖项更新为1.1,就可以使用。

因此,基本上,这是由于我的项目版本控制不佳造成的,这干扰了我的本地Maven存储库。

相关问题