Maven jar 依赖和关系

Posted

技术标签:

【中文标题】Maven jar 依赖和关系【英文标题】:Maven jar dependencies and relations 【发布时间】:2012-05-30 02:26:07 【问题描述】:

我试图搜索现有问题,但找不到任何问题 - 感觉我的问题很简单,但可能是因为它非常具体,我无法在任何地方找到答案。

无论如何 - 我有 2 个使用 Maven 的项目,其中第二个依赖/需要第一个的某些类。在某些情况下,我希望依赖于 JAR 而不是项目依赖。

我通过使用 maven-jar-plugin 创建了一个额外的 jar 来解决这个问题,我在其中包含了所需的类。 jar 已正确创建并在 $project.build.directory 中输出。但是项目 A 的 pom 位于同一目录中,这对我和项目 B 来说都是痛苦的,因为项目 A 中使用了依赖项。 (有没有办法忽略 $project.build.directory 中的 pom ??? 比如:

<dependency>
            <groupId>projectA.groupId</groupId>
            <artifactId>A</artifactId>
            <version>1x-SNAPSHOT</version>
            <classifier>classes</classifier>
                    ->  <ignorePom>true</ignorePom>
        </dependency>

)。

现在我将系统范围用于依赖项,并且在添加系统路径后它可以正常工作。尽管在任何可能的地方都必须避免使用示波器系统。 Systempath 让我很恼火,因为这不是一个好的做法,而且是绝对路径。

我知道我可以使用

将创建的 jar 安装到存储库中

mvn install:install -file

但我想尽可能地自动化这个过程,你有什么建议?

提前致谢

【问题讨论】:

【参考方案1】:

最好的解决方案是使用存储库管理器并真正发布第一个 jar,并在您需要的地方建立真正的依赖关系。

根据您所写的内容,我建议创建一个单独的 maven 项目,其中包含将由其他几个模块使用的类,然后发布它并简单地使用对该模块的依赖。这将彻底解决您的问题。

【讨论】:

感谢 khmarbaise,事实上我创建了一个单独的 maven 项目,其中包含公共类。我已经有了这个想法,但我认为可能还有其他解决方案。【参考方案2】:

Maven 不支持“依赖于 jars”。有“系统”的范围,但非常有限,可能会导致各种麻烦。如果你需要依赖一个 Jar,你需要给它分配一个唯一的 groupId 和 artifactId。如果您不想在 Maven 中构建它,可以将其部署到本地 repo 管理器(甚至使用 mvn install:install-file 部署到本地 repo)。

取决于带有分类器“工作”但不是很好的 jar,因为反应器无法正确地将它们包含在多模块项目中。

【讨论】:

【参考方案3】:

您是否阅读过任何有关Maven 的文档?如果您的项目是使用 Maven 定义的,那么您无需执行任何特殊操作即可使依赖项正常工作。

根据您的需要,您有两种选择:创建两个独立的项目,其中一个依赖于另一个,或者您可以创建一个多模块项目,其中一个模块仍然依赖于另一个。

两个独立的项目

.
 |-- A
 |   `-- pom.xml
 |   `-- src
 |       `-- main
 |           `-- java
 `-- B
     `-- pom.xml
     `-- src
         `-- main
             `-- java

A/pom.xml

<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>com.company</groupId>
    <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>
</project>

B/pom.xml

<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>com.company</groupId>
    <artifactId>B</artifactId>
    <version>2.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.company</groupId>
            <artifactId>A</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

就是这样!您对 B 中的项目/模块 A 有依赖。

您首先通过发出mvn install(并位于目录A)来构建项目A。该工件将安装在您的本地存储库中(并可用于其他项目)。

然后您通过发出mvn install(并且位于目录B 中)来构建项目B。该工件将安装在您的本地存储库中。

一个带有子模块的父项目

.
 |-- A
 |   `-- pom.xml
 |   `-- src
 |       `-- main
 |           `-- java
 `-- B
 |   `-- pom.xml
 |   `-- src
 |       `-- main
 |           `-- java
 `-- pom.xml

pom.xml

<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>com.company</groupId>
    <artifactId>parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>A</module>
        <module>B</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.company</groupId>
                <artifactId>A</artifactId>
                <version>$project.version</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

&lt;depencdencyManagement/&gt; 可以帮助子模块选择正确的版本。

A/pom.xml

<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>

    <parent>
        <groupId>com.company</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>com.company</groupId>
    <artifactId>A</artifactId>

</project>

B/pom.xml

<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>

    <parent>
        <groupId>com.company</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>com.company</groupId>
    <artifactId>B</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.company</groupId>
            <artifactId>A</artifactId>
        </dependency>
    </dependencies>
</project>

使用此解决方案,您只需将自己定位在父文件夹中并运行mvn install(或mvn package 等)。您现在将以正确的顺序构建 A 和 B,并且整个项目都可以导入到 Eclipse 中。

【讨论】:

Hallo maba,我认为您误解了这个问题:我提到“在某些情况下,我希望依赖于 JAR 而不是项目依赖。”我必须从项目 A 中创建一个 jar,否则我会遇到两个项目的公共依赖项和库的问题。

以上是关于Maven jar 依赖和关系的主要内容,如果未能解决你的问题,请参考以下文章

Maven的安装和配置

Maven查看JAR包的依赖关系

Intellij 查找排除JAR包的依赖关系(Maven Helper)

关于maven依赖关系的问题

Spring framework体系结构及内部各模块jar之间的maven依赖关系

Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图