示例场景:我有2个项目,“common-project”和“application-project”。应用程序项目取决于common-project提供的API。这两个项目也有第三方的罐子(例如番石榴)。
我将创建3个Maven项目:一个parent
聚集模块,common-project
模块和application-project
模块根据common-project
并宣布番石榴为parent
模块(这样子项目将继承它)的依赖。事情是这样的:
$ tree Q3337426
Q3337426
├── application-project
│ ├── pom.xml
│ └── src
│ ├── main
│ └── ...
│ └── test
│ └── ...
├── common-project
│ ├── pom.xml
│ └── src
│ ├── main
│ └── ...
│ └── test
│ └── ...
└── pom.xml
当母体的pom.xml如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stackoverflow.Q3337426</groupId>
<artifactId>Q3337426</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>Q3337426 - Root</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>r05</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<modules>
<module>common-project</module>
<module>application-project</module>
</modules>
</project>
为共同项目的pom.xml中:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>Q3337426</artifactId>
<groupId>com.stackoverflow.Q3337426</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>common-project</artifactId>
<name>Q3337426 - Common Project</name>
<dependencies/>
</project>
pom.xml中的应用项目:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>Q3337426</artifactId>
<groupId>com.stackoverflow.Q3337426</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>application-project</artifactId>
<name>Q3337426 - Application Project</name>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>common-project</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
这是Maven组织这样一个项目的方式,并且允许从根项目触发反应堆构建来构建一切。
(...)这两个项目都在积极开发中,所以我宁愿不必首先构建一个common-project jar,然后“安装”到我的本地存储库,然后才能使用新的应用程序项目中的功能。
m2eclipse插件可以从工作区项目解决依赖(这实际上是默认行为)。因此,如果您同时导入application-project
和common-project
,则前者将被配置为取决于common-project
(取决于广告瓶)的源。使用此设置时,对common-project
所做的更改将立即可见。
这应该解决您在IDE内部的问题。在IDE之外,在顶部项目上运行反应堆构建。
谢谢 - 我想我应该让common-project成为一个共享的工件,并看看它是如何工作的。看起来我仍然可以使用eclipse设置项目依赖关系,这样重构仍然可以应用于多个项目。 – MavenN00b 2010-07-26 20:00:04
我完全反对使用'system'范围的依赖关系,这是一个非常糟糕的做法,不应该鼓励,人们只是滥用它。 – 2010-07-26 21:33:51