如何设置具有相互依赖关系的maven子项目?

问题描述 投票:15回答:1

我很难设置一组相关的maven项目,它们之间存在相互依赖关系。

这是我的简化案例:

pom.xml     -- parent pom
\base\
    pom.xml
    src\main\java\Base.java     -- this is just a simple class
\derived\
    pom.xml
    src\main\java\Derived.java  -- this is a simple class that needs Base class to compile successfully, and has a main function

我的目标是:

  1. 能够在我的机器上编译所有项目: 即mnv clean compile成功的\
  2. 能够在我的机器上编译一个项目: 即mnv clean compile在\ base \和\ derived \中成功(尽管这可能不适用于设计:Inter Project Dependencies in Maven) [编辑:找到了这个问题的答案:base需要在编译之前在本地发布:即在\ base中,执行mvn clean compile install而不是仅仅执行mvn clean compile。完成后,在\ derived中执行mvn clean compile工作正常。尽管如此,在没有触及全局状态的情况下这样做会很棒,即无需安装基础 - 所以如果有人知道实现这一点的方法,请将其添加为答案]
  3. 能够直接从源树上运行我的机器上的派生项目(mvn exec:run或等效): I.S. qazxsw poi在\ derived \中应编译(如果需要)并运行derived.jar
  4. “共享组件”用例:将基础工件推送到共享存储库,其他人可以将其作为maven依赖项(即编译时依赖性)使用它: 即mvn exec:run会将其推送到〜/ .m2 / config.xml中指定的共享存储库
  5. “图像目录”用例:将派生的工件及其依赖项推送到本地目录,在那里它可以通过“java -jar ...”运行,或者它可以作为ftp / http共享公开给其他人来获取它。即,用例如下: mvn clean compile ???会将derived.jar和dependencies(如base.jar)推送到〜/ .m2 / maven.repo /.../派生或等效,然后我可以cd~ / .m2 / maven.repo /.../派生并运行mvn clean compile ???来运行它。 java -jar derived.jar将base.jar推送到〜/ .m2 / maven.repo /.../ base(或derived.jar到其相应的dir),它已经通过本地web或ftp服务器公开为下载点。

我如何实现上述目标?

这是父母pom的相关部分:

mvn clean compile ???

这是基本pom.xml的相关部分:

...
<modelVersion>4.0.0</modelVersion>
<groupId>com.foo</groupId>
<artifactId>parentpom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<name>parentpom</name>

<modules>
    <module>base</module>
    <module>derived</module>
</modules>
...

这是派生的pom.xml的相关部分:

...
<parent>
    <groupId>com.foo</groupId>
    <artifactId>parentpom</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>
<groupId>com.foo.base</groupId>
<artifactId>base</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>base</name>
...

预先感谢您的帮助。

maven maven-2
1个回答
27
投票

你的父pom看起来不错,但你的模块/派生的poms却没有:有几个问题会产生一些问题等等。

首先,您对派生/基本模块使用不同的groupId。如果你有... <parent> <groupId>com.foo</groupId> <artifactId>parentpom</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.foo.derived</groupId> <artifactId>derived</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>derived</name> <dependencies> <dependency> <groupId>com.foo</groupId> <artifactId>base</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> ... 构建,你不应该这样做。此外,派生/基础的版本由父项继承,不应设置为显式,这意味着您应该具有以下内容:

multi-module

groupId通常是继承的。但有时你有更多的模块可能是子模块的子模块,导致这样的结构:

<modelVersion>...</...>
...
<parent>
    <groupId>com.foo</groupId>
    <artifactId>parentpom</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>base</artifactId>
<packaging>jar</packaging>

<name>base</name>

在这种情况下,mod1本身就是一个pom包装模块:

+--- parent (pom.xml)
       +--- mod1 (pom.xml)
              +--- mod11 (pom.xml)
              +--- mod12 (pom.xml)
       +--- mod2 (pom.xml)

MOD1:

<modelVersion>...</...>
...
<groupId>com.company.project<groupId>  
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<modules>
  <module>mod1</module>
  <module>mod2</module>
</modules>

MOD11:

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

<groupId>com.company.project.mod1</groupId>
<artifactId>mod1</artifactId>
<packaging>pom</packaging>

<modules>
  <module>mod11</module>
  <module>mod12</module>
</modules>

如果您需要在模块之间建立依赖关系,那么解决方案是:

<parent>
    <groupId>com.company.project.mod1</groupId>
    <artifactId>mod1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>mod11</artifactId>
<packaging>pom</packaging>

<modules>
  <module>mod11</module>
  <module>mod12</module>
</modules>

要编译包含所有子模块的整个项目,只需转到父文件夹,然后:

mvn清洁包

将编译等。如果您只想编译一个项目,您可以通过(来自父项)来完成:

<parent>
    <groupId>com.company.project.mod1</groupId>
    <artifactId>mod1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>mod11</artifactId>
<packaging>jar</packaging>

<dependencies>
  <dependency>
    <!-- This shouldn't be a dep which is packaging: pom -->
    <groupId>${project.groupId}</groupId>
    <artifactId>mod2</artifactId>
    <version>${project.version}</version>
  </dependency>

</dependencies>    

只有在您之前安装过整个项目时才会有效。另一种解决方案是

mvn -pl mod1

为了使其他人可以访问工件,最简单的解决方案是安装存储库管理器并执行:

mvn部署

所有其他人都可以使用和artifact作为SNAPSHOT依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.