我很难设置一组相关的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
Run Code Online (Sandbox Code Playgroud)
我的目标是:
mnv clean compile成功mnv clean compile在\ base \和\ derived \中成功(虽然这可能不适用于设计:Maven中的Inter Project Dependencies)
mvn clean compile install而不是做mvn clean compile.完成后,mvn clean compile在\ derived中进行工作正常.尽管如此,在没有触及全局状态的情况下这样做会很棒,即无需安装基础 - 所以如果有人知道实现这一目标的方法,请将其添加为答案]mvn exec:run在\ derived \中应编译(如果需要)并运行derived.jarmvn clean compile ???将它推送到〜/ .m2/config.xml中指定的共享存储库mvn clean compile ???将derived.jar和依赖项(如base.jar)推送到〜/ .m2/maven.repo /.../派生或等效,然后我可以cd~/.m2/maven.repo /.../派生并运行java -jar derived.jar以运行它.mvn clean compile ??? 将base.jar推送到〜/ .m2/maven.repo /.../ base(或derived.jar到其对应的dir),它已经通过本地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>
...
Run Code Online (Sandbox Code Playgroud)
这是基本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>
...
Run Code Online (Sandbox Code Playgroud)
这是派生的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>
...
Run Code Online (Sandbox Code Playgroud)
预先感谢您的帮助.
khm*_*ise 33
你的父pom看起来不错,但你的模块/派生的poms却没有:有几个问题会产生一些问题等等.
首先,您对派生/基本模块使用不同的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>
Run Code Online (Sandbox Code Playgroud)
groupId通常是继承的.但有时你有更多的模块可能是子模块的子模块,导致这样的结构:
+--- parent (pom.xml)
+--- mod1 (pom.xml)
+--- mod11 (pom.xml)
+--- mod12 (pom.xml)
+--- mod2 (pom.xml)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,mod1本身就是一个pom包装模块:
<modelVersion>...</...>
...
<groupId>com.company.project<groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<modules>
<module>mod1</module>
<module>mod2</module>
</modules>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
如果您需要在模块之间建立依赖关系,那么解决方案是:
<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>
Run Code Online (Sandbox Code Playgroud)
要编译包含所有子模块的整个项目,只需转到父文件夹,然后:
mvn清洁包
将编译等.如果您只想编译一个项目,您可以通过(来自父项)来完成:
mvn -pl mod1
Run Code Online (Sandbox Code Playgroud)
只有在您之前安装过整个项目时才会有效.另一种解决方案是
mvn -am -pl mod1
Run Code Online (Sandbox Code Playgroud)
为了使其他人可以访问工件,最简单的解决方案是安装存储库管理器并执行:
mvn部署
所有其他人都可以使用和artifact作为SNAPSHOT依赖项.
| 归档时间: |
|
| 查看次数: |
24419 次 |
| 最近记录: |