Maven jar依赖关系和关系

时间:2012-05-23 14:05:30

标签: eclipse maven dependencies pom.xml maven-jar-plugin

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

无论如何 - 我有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

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

提前致谢

3 个答案:

答案 0 :(得分:1)

最好的解决方案是使用存储库管理器并对第一个jar进行实际发布,并根据需要建立真正的依赖关系。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您是否阅读过有关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>

<depencdencyManagement/>可帮助子模块选择正确的版本。

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中导入整个项目。