我很难设置一组相互依赖的相关 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
我的目标是:
- 能够在我的机器上编译所有项目:
- 即
mnv clean编译
在\ 中成功
- 即
- 能够在我的机器上编译一个项目:
- 即
mnv cleancompile
在\base\和\categories\中成功(尽管这可能无法按设计工作: Inter Project Dependencies in Maven )
[编辑:找到了这个问题的答案:在编译派生之前需要在本地发布基础:即在\base 中,执行mvn cleancompile install
而不是仅仅执行mvn clean 编译
。完成此操作后,在\categories 中执行mvn cleancompile
就可以正常工作。尽管如此,在不触及全局状态的情况下做到这一点还是很棒的,即无需安装基础 - 所以如果有人知道实现此目的的方法,请将其添加为答案]
- 即
- 能够直接从源代码树在我的机器上运行派生项目(mvn exec:run 或等效项):
- 即\provider\中的
mvn exec:run
应该编译(如果需要)并运行导出的.jar
- 即\provider\中的
- “共享组件”用例:将基本 Artifact 推送到共享存储库,其他人可以将其作为 Maven 依赖项(即编译时依赖项)使用:
- 即
mvn cleancompile???
会将其推送到 ~/.m2/config.xml 中指定的共享存储库
- 即
- “图像目录”用例:将派生 Artifact 及其依赖项推送到本地目录,可以通过“java -jar ...”运行它,也可以将其公开为其他人的 ftp/http 共享为拿到它,为实现它。即,像这样的用例:
mvn cleancompile???
会将衍生的.jar 和依赖项(如 base.jar)推送到 ~/.m2/maven.repo/.../衍生或等效的,然后我可以 cd ~/.m2/maven.repo/.../driven 并运行java -jar returned.jar
来运行它。mvn cleancompile???
会将base.jar推送到~/.m2/maven.repo/.../base(或derive.jar到其相应的目录),该目录已经通过本地网络或 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>
...
这是基础 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>
...
这是派生的 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>
...
预先感谢您的帮助。
最佳答案
您的父 pom 看起来不错,但您的模块/派生 pom 则不然:有几个问题会产生一些问题等。
首先,您为派生/基础模块使用不同的 groupId。如果您有multi-module构建你不应该这样做。此外,派生/基的版本由父级继承,不应显式设置,这意味着您应该具有如下所示的内容:
<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>
groupId 通常是继承的。但有时您有大量的模块,这些模块可能是子模块的子模块,这会导致如下结构:
+--- parent (pom.xml)
+--- mod1 (pom.xml)
+--- mod11 (pom.xml)
+--- mod12 (pom.xml)
+--- mod2 (pom.xml)
在这种情况下,mod1本身就是一个pom包装模块:
<modelVersion>...</...>
...
<groupId>com.company.project<groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<modules>
<module>mod1</module>
<module>mod2</module>
</modules>
mod1:
<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>
mod11:
<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 清理包
将编译等。如果您只想编译单个项目,您可以通过(从父级)执行此操作:
mvn -pl mod1
仅当您之前安装过整个项目一次时,该方法才有效。另一种解决方案是:
mvn -am -pl mod1
要使其他人可以访问 Artifact ,最简单的解决方案是安装存储库管理器并执行以下操作:
mvn 部署
所有其他人都可以使用和 Artifact 作为 SNAPSHOT 依赖项。
关于maven - 如何设置具有相互依赖关系的 Maven 子项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12223754/