【问题标题】:Inherit child-dependencies from maven dependency从 maven 依赖继承子依赖
【发布时间】:2021-02-12 02:33:19
【问题描述】:

我有两个独立的 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 用于构建和部署到存储库。

项目一个 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:
我已经取得了一些进展。由于在添加注释后我没有更改项目 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 中的注释类。知道为什么现在失败了吗?

【问题讨论】:

    标签: maven maven-2 maven-3


    【解决方案1】:

    您自动继承annotations,无需配置。

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

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

    【讨论】:

    • 我的部署是我构建的一个单独步骤,只有在其他步骤没有失败的情况下才会在最后执行。但这些是我构建中唯一的 Maven 步骤。我只是把它们写在一起,这样更容易理解。那我看看范围,谢谢。
    • deploy 已经包含package,因此运行package 然后deploy 有效运行package 两次。
    • 我猜compile 会代替package 步骤。 mvn dependency:tree 打印 [INFO] \- org.jetbrains:annotations:jar:20.1.0:compile 我认为这意味着它的范围是 compile,根据文档是 propagated to dependent projects。这不应该意味着项目 B 也应该自动包含它吗?
    • 你在projectB上运行dependency:tree了吗?
    • 项目 B 仅列出项目 A 的依赖项,范围 compileannotations 根本没有列出。
    【解决方案2】:

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

    所以基本上这是由于我的项目版本控制不佳,这干扰了我的本地 maven 存储库。

    【讨论】:

      猜你喜欢
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 2021-10-29
      • 2013-04-01
      • 2023-03-28
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多