2010-07-26 67 views
6

示例场景:我有2个项目“common-project”和“application-project”。应用程序项目取决于common-project提供的API。这两个项目也有第三方的罐子(例如番石榴)。使用m2eclipse进行多个项目设置的最佳实践

我想转换到使用maven和m2eclipse,但我不清楚最好的方法。目前,我的maven-free安装程序已将第三方jar添加为common-project中的库,并标记为“已导出”。这样它们就被应用程序项目继承了,我不必在应用程序项目中将它们明确地添加为库。这两个项目都在积极开发之中,因此我宁愿不必首先构建一个common-project jar,然后在我可以在应用程序项目中使用新功能之前将其“安装”到我的本地存储库。

这种类型的项目布局的推荐方法是什么?我看到下面的线程大致触及的话题: Project in Eclipse that builds a jar used by another project in Eclipse

感谢

回答

0

快速,每个项目在POM的<dependencies>元素的依赖关系。

然后,m2eclipse插件会自动从pom.xml中选择这些插件,并将它们作为库引用添加到Eclipse中的构建路径中。

如果application-project依赖于common-project,那么它也会继承它的依赖关系 - 不需要在application-project的pom.xml中第二次列出两个公共依赖关系。

0

假设你已经在你的计算机上安装了maven,然后下载m2eclipse pluging安装它并重新启动eclipse。

记住maven构建的目标是生成可以分发和重用的构件,如果在您拥有某种稳定版本的“common-project”API之前不想制作mvn install,尽管在开发过程中没有任何错误。

对于你的情况,你可以做下列操作之一:

  1. 如果common-project API是绝对必要的,并往往不是只能在application-project的范围使用,那么构建项目作为多模块项目并将common-project声明为您的application project的模块。 Here is an example of how to do this.
  2. 如果否则common-project将更多的时候不是一个共享的工件,然后建立每个独立的项目,并在它们的pom.xml文件中声明两者的依赖关系.eclipse应该能够找出两者之间的依赖关系。
  3. 您可以首先开发common-project的部分实现,然后将其打包,然后声明application-project中的依赖关系,<scope>system<scope>指定它位于的文件系统中的哪个位置,不要在任何存储库中查看它;尽管做一个mvn install会比你想要避免的更优雅。

问候。

+0

谢谢 - 我想我应该让common-project成为一个共享的工件,并看看它是如何工作的。看起来我仍然可以使用eclipse设置项目依赖关系,这样重构仍然可以应用于多个项目。 – MavenN00b 2010-07-26 20:00:04

+0

我完全反对使用'system'范围的依赖关系,这是一个非常糟糕的做法,不应该鼓励,人们只是滥用它。 – 2010-07-26 21:33:51

4

示例场景:我有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-projectcommon-project,则前者将被配置为取决于common-project(取决于广告瓶)的。使用此设置时,对common-project所做的更改将立即可见。

这应该解决您在IDE内部的问题。在IDE之外,在顶部项目上运行反应堆构建。

+0

感谢您的全面回应,我一定会对此进行调查。 – MavenN00b 2010-07-27 21:10:12

+0

@ MavenN00b:不客气。应该很容易适应你的真实项目。随意问你是否需要澄清。 – 2010-07-27 21:17:05