Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设置具有相互依赖关系的maven子项目?_Maven_Maven 2 - Fatal编程技术网

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

如何设置具有相互依赖关系的maven子项目?,maven,maven-2,Maven,Maven 2,我很难建立一组相互依赖的相关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 comp

我很难建立一组相互依赖的相关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
我的目标是:

  • 能够在我的机器上编译所有项目:
    • i、 e.
      mnv clean compile
      在\
  • 能够在我的机器上编译一个项目:
    • i、 e.
      mnv clean compile
      在\base\和\derived\中成功(尽管设计可能不起作用:)
      [编辑:找到了这个问题的答案:base需要在本地发布,然后才能在编译中派生:即在\base中,执行
      mvn clean compile安装
      ,而不是只执行
      mvn clean compile
      。完成后,在\derived中执行
      mvn clean compile
      ,效果很好。不过,在没有接触的情况下执行此操作还是很好的g全局状态,即无需安装base——因此,如果有人知道实现此目的的方法,请将其添加为答案]
  • 能够直接从源代码树在我的计算机上运行派生项目(mvn exec:run或同等版本):
    • i、 e.
      mvn exec:run
      in\derived\应该编译(如果需要)并运行derived.jar
  • “共享组件”用例:将基本工件推送到共享存储库,其他人可以将其作为maven依赖项(即编译时依赖项)使用:
    • i、 e.
      mvn clean compile???
      将把它推送到~/.m2/config.xml中指定的共享存储库
  • “映像目录”用例:将派生的工件及其依赖项推送到本地目录,在本地目录中可以通过“java-jar…”运行,也可以公开为ftp/http共享,供其他人获取。例如,以下用例:
    • mvn clean compile???
      将把derived.jar和依赖项(如base.jar)推到~/.m2/maven.repo/../derived或等效项,然后我可以cd~/.m2/maven.repo/../derived并运行
      java-jar-derived.jar
    • mvn clean compile???
      将base.jar推到~/.m2/maven.repo/../base(或将derived.jar推到其相应的目录),该目录已通过本地web或ftp服务器作为下载点公开
  • 我如何实现上述目标

    以下是家长pom的相关章节:

    ...
    <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>
    ...
    
    。。。
    4.0.0
    com.foo
    亲本
    0.0.1-快照
    聚甲醛
    亲本
    基础
    衍生
    ...
    
    下面是base 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>
    ...
    
    。。。
    com.foo
    亲本
    0.0.1-快照
    4.0.0
    com.foo.base
    基础
    0.0.1-快照
    罐子
    基础
    ...
    
    以下是派生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.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>
    
    ...
    
    。。。
    com.foo
    亲本
    0.0.1-快照
    4.0.0
    com.foo.com
    衍生
    0.0.1-快照
    罐子
    衍生
    com.foo
    基础
    0.0.1-快照
    ...
    

    提前感谢您的帮助。

    您的父级pom看起来不错,但您的模块/派生pom却不行:有几个问题会产生一些问题等

    首先,您正在为派生/基本模块使用不同的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包装模块:

    <modelVersion>...</...>
    ...
    <groupId>com.company.project<groupId>  
    <artifactId>parent</artifactId>
    <packaging>pom</packaging>
    <modules>
      <module>mod1</module>
      <module>mod2</module>
    </modules>
    
    仅当您以前安装过整个项目一次时,此解决方案才有效。另一个解决方案是:

    <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 -am -pl mod1
    
    要使其他人能够访问工件,最简单的解决方案是安装存储库管理器并执行以下操作:

    mvn部署


    所有其他人都可以使用和工件作为快照依赖项。

    只是为了澄清,在(1)的情况下,什么不起作用?主要原因是(1)在我的maven配置中命名不一致:我没有使用everywhere FooColorBlack,而是有时将部件还原为FooBlackColor(虚构的示例,而不是真实名称)。下面是一个示例项目说明:感谢您花时间给出如此详细的答案!其中“只有在您之前安装了整个项目一次后才能起作用”部分是我出现错误的关键。我有时会从本地回购中删除文件,作为清理和确保某种基准的一种方式(后来,我发现名称中的Snapshot被视为一个特例)这就解释了为什么有时我会失败,而另一些我不会。
    <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>
    
    <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 -am -pl mod1