Java 使用m2eclipse进行多项目设置的最佳实践
示例场景:我有两个项目,“公共项目”和“应用程序项目”。应用程序项目依赖于common project提供的API。两个项目都使用第三方JAR(例如番石榴) 我正在尝试使用maven和m2eclipse,但不清楚最佳方法。目前,我的maven free安装程序将第三方JAR添加为公共项目上的库,并标记为“导出”。通过这种方式,它们被应用程序项目继承,我不必显式地将它们作为库添加到应用程序项目中。这两个项目都在积极开发中,所以我不希望首先构建一个普通项目的jar,然后将其“安装”到本地存储库中,然后才能使用applicationproject中的新功能 这类项目布局的推荐方法是什么?我看到下面的帖子大致涉及了这个话题:Java 使用m2eclipse进行多项目设置的最佳实践,java,eclipse,maven-2,m2eclipse,Java,Eclipse,Maven 2,M2eclipse,示例场景:我有两个项目,“公共项目”和“应用程序项目”。应用程序项目依赖于common project提供的API。两个项目都使用第三方JAR(例如番石榴) 我正在尝试使用maven和m2eclipse,但不清楚最佳方法。目前,我的maven free安装程序将第三方JAR添加为公共项目上的库,并标记为“导出”。通过这种方式,它们被应用程序项目继承,我不必显式地将它们作为库添加到应用程序项目中。这两个项目都在积极开发中,所以我不希望首先构建一个普通项目的jar,然后将其“安装”到本地存储库中,然
感谢在POM的
元素中表达每个项目的依赖关系
然后,m2eclipse插件将自动从pom.xml中提取这些内容,并将它们作为库引用添加到Eclipse中的构建路径中
如果
应用程序项目
依赖于公共项目
,那么它也将继承它的依赖关系-假设您的计算机中已经安装了maven,则无需在应用程序项目
的pom.xml中再次列出两者之间的公共依赖关系,然后下载m2eclipse插件,安装它并重新启动eclipse
请记住,maven构建的目标是生成可分发和重用的构件,如果您不想在拥有“common project”API的某个稳定版本之前进行mvn安装
,也可以,尽管在开发过程中这样做没有错
对于您的案例,您可以执行以下操作之一:
公共项目
API是绝对必要的,并且不仅仅是在应用程序项目
的范围内使用,那么将您的项目构建为多模块项目,并声明公共项目
是应用程序项目
的一个模块李>
公共项目的部分实现
,将其打包,然后在应用程序项目
中声明为依赖项,并使用系统
指定其在文件系统中的位置,这将告诉maven依赖项总是存在的,它不会在任何存储库中查找它;尽管进行mvn安装
会比这更优雅,但您要尽量避免这种情况父项目
聚合模块、一个公共项目
模块和一个应用项目
模块,具体取决于公共项目
,并在父项目
模块中将番石榴声明为依赖项(以便子项目将继承它)。大概是这样的:
$ tree Q3337426
Q3337426
├── application-project
│ ├── pom.xml
│ └── src
│ ├── main
│ └── ...
│ └── test
│ └── ...
├── common-project
│ ├── pom.xml
│ └── src
│ ├── main
│ └── ...
│ └── test
│ └── ...
└── 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>
$tree Q3337426
Q3337426
├── 应用项目
│ ├── pom.xml
│ └── src
│ ├── 主要的
│ └── ...
│ └── 测试
│ └── ...
├── 共同项目
│ ├── pom.xml
│ └── src
│ ├── 主要的
│ └── ...
│ └── 测试
│ └── ...
└── pom.xml
其中父pom.xml如下所示:
$ tree Q3337426
Q3337426
├── application-project
│ ├── pom.xml
│ └── src
│ ├── main
│ └── ...
│ └── test
│ └── ...
├── common-project
│ ├── pom.xml
│ └── src
│ ├── main
│ └── ...
│ └── test
│ └── ...
└── 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>
4.0.0
com.stackoverflow.Q3337426
Q3337426
聚甲醛
1.0-快照
Q337426-根目录
http://maven.apache.org
番石榴
番石榴
r05
朱尼特
朱尼特
3.8.1
测试
共同项目
应用项目
通用项目的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>
<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>
4.0.0
Q3337426
com.stackoverflow.Q3337426
1.0-快照
共同项目
Q337426-通用项目
应用程序项目的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>
<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>
4.0.0
Q3337426
com.stackoverflow.Q3337426
1.0-快照
应用项目
Q337426-应用项目
${project.groupId}
共同项目
${project.version}
这是组织这样一个项目的Maven方式,允许从根项目触发反应堆构建来构建一切
(…)这两个项目都在积极开发中,所以我不希望首先构建一个通用项目的jar,然后将其“安装”到本地存储库中,然后才能使用applicationproject中的新功能
m2eclipse插件可以解析来自工作区项目的依赖关系(这实际上是默认行为)。因此,如果同时导入应用程序项目
和公共项目
,则前者将被配置为依赖于公共项目
的源(而不是依赖于jar)。使用此设置时,对公共项目所做的更改将立即可见
这应该可以解决IDE内部的问题。在IDE之外,在顶层项目上运行一个reactor build。谢谢-我想我应该让公共项目成为一个共享工件,看看它是如何工作的。看起来我仍然可以使用eclipse设置项目依赖项,这样重构仍然可以应用于m