如何设置具有相互依赖关系的maven子项目?
我很难建立一组相互依赖的相关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
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.
在\base\和\derived\中成功(尽管设计可能不起作用:)mnv clean compile
[编辑:找到了这个问题的答案:base需要在本地发布,然后才能在编译中派生:即在\base中,执行
,而不是只执行mvn clean compile安装
。完成后,在\derived中执行mvn clean compile
,效果很好。不过,在没有接触的情况下执行此操作还是很好的g全局状态,即无需安装base——因此,如果有人知道实现此目的的方法,请将其添加为答案]mvn clean compile
- i、 e.
in\derived\应该编译(如果需要)并运行derived.jarmvn exec:run
- i、 e.
将把它推送到~/.m2/config.xml中指定的共享存储库mvn clean compile???
将把derived.jar和依赖项(如base.jar)推到~/.m2/maven.repo/../derived或等效项,然后我可以cd~/.m2/maven.repo/../derived并运行mvn clean compile???
java-jar-derived.jar
将base.jar推到~/.m2/maven.repo/../base(或将derived.jar推到其相应的目录),该目录已通过本地web或ftp服务器作为下载点公开mvn clean compile???
...
<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