Maven多模块项目的参考资料

Sonatype上的教程 http://books.sonatype.com/mvnex-book/reference/multimodule.html

在这个教程里, 提供了一个多模块的maven项目例子供下载, 可以直接套用于实际项目.

IntelliJ Idea14里的创建步骤

1. File -> New -> Project -> Maven, 选择SDK后, 不要选Create from archetype, -> Next,

2. 填写GroupId, 例如 com.mydomain.myproject, 填写ArtifactId, 例如 hold-on-service 我建的是dubbo项目, 这里填个大service名称, Version 默认, -> Next

3. 填写Project name, 就用ArtifactId, 如 hold-on-service, 选好项目地址, -> Finish

4. 新建好的项目里, 删掉系统创建的src目录

5. 开始创建子模块. File -> New -> Module -> Maven, 如果是公共模块, 就不要选Create from archetype, -> Next, 如果不是公共模块, 例如是实际的service提供模块, 则根据需要选择相应模板.

6. GroupId和版本按默认, ArtifactId 根据模块类型填写, 例如 hold-on-service-api, 或者 hold-on-service-impl, 一路Next -> Finsh

7. 编辑主项目的pom.xml, 注意要指定compile的source和target, 不然每次IDEA里面reimport之后, 配置都会被重置, 每次要改很麻烦

<?xml version="1.0" encoding="UTF-8"?>
<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> <groupId>com.mydomain.holdon</groupId>
<artifactId>vk-session</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version> <name>Holdon Project: Session Service</name> <modules>
<module>session-service-api</module>
<module>session-service-impl</module>
</modules> <build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

8. 编辑公共子模块的pom.xml, 注意packaging类型

<?xml version="1.0" encoding="UTF-8"?>
<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>vk-session</artifactId>
<groupId>com.mydomain.holdon</groupId>
<version>1.0-SNAPSHOT</version>
</parent> <name>Holdon Project: Session Service API</name> <artifactId>vk-session-api</artifactId>
<packaging>jar</packaging> <dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
</dependencies> </project>

9. 编辑实体子模块的pom.xml, 注意这里要添加对公共模块的依赖, 不然每次reimport后, 依赖关系会丢失

<?xml version="1.0" encoding="UTF-8"?>
<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>vk-session</artifactId>
<groupId>com.mydomain.holdon</groupId>
<version>1.0-SNAPSHOT</version>
</parent> <name>Holdon Project: Session Service Publish</name> <artifactId>vk-session-impl</artifactId>
<packaging>war</packaging> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<org.springframework.version>3.1.1.RELEASE</org.springframework.version>
</properties> <dependencies>
<!-- Spring Dependencies Start -->
<!-- Core utilities used by other modules, Define this if you use Spring
Utility APIs(org.springframework.core.*/org.springframework.util.*) -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- Spring Dependencies End -->
......
<dependency>
<groupId>com.mydomain.holdon</groupId>
<artifactId>vk-session-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies> </project>

可以设置一个全局的pom, 把所有的模块都组织起来.一些公司里公用的dependency以及版本, 都配置在

这个pom只配置在svn和CI工具里, deploy的时候, 会自动checkout整个最新的主干, deploy到maven repository.

开发的时候, 只需要使用这个下面的大模块, pom里面的parent, maven会自动到repository下找依赖.

Update: 新建项目时, 用最顶层的pom建, 会自动变成多层模块的项目, 然后把顶层的项目delete掉, 然后第二层的module就变成顶层了, 而且顶层的pom.xml还在项目里.

Update 2017-04-08: 以上适用于使用svn仓库的项目, 不适用于git

Update 2018-10-11: 在Maven 中除了用继承parent来做版本控制以外, 还可以通过 scope=import 来做版本控制.

Maven 2.0.9 添加了一个新特性: scope = import 也就是从外部导入依赖管理的依赖配置. 使用过 DependencyManagement都知道, 多模块构建项目的时候, 为了解决各模块依赖版本一致, 统一在父pom.xml文件中统一定义各个依赖jar文件的版本, 然后子模块通过引用的方式添加需要的依赖jar, 但随着项目工程越来越大, 添加的依赖文件也越来也多, 父pom.xml的 DependencyManagement 也会越来越长, 不便于管理. 另外, 因为pom.xml 是单继承的, 如果已经有一个父pom.xml了, 想要再引用外部的pom.xml, 就只能复制到父pom.xml中了. 因此采用在 DependencyManagement 中使用scope = import的方式可以分类引入更多的管理配置, 也摆脱了单继承的限制. 举例, 在子模块的<project></project>中增加这一段用于引入其他pom.xml的依赖配置

    <dependencyManagement>
<dependencies>
<dependency>
<groupId>com.rockbb</groupId>
<artifactId>my-java-pom</artifactId>
<version>1.2-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

而这个被引入的pom, 可以按下面的例子格式编写

<?xml version="1.0" encoding="UTF-8"?>
<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> <groupId>com.rockbb</groupId>
<artifactId>my-java-pom</artifactId>
<version>1.2-SNAPSHOT</version>
<packaging>jar</packaging> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kbsjava.default.version>1.2-SNAPSHOT</kbsjava.default.version> <springboot.version>2.0.3.RELEASE</springboot.version>
<c3p0.version>0.9.5.2</c3p0.version>
<mysql.version>6.0.3</mysql.version>
<mybatis.version>3.4.1</mybatis.version>
<mybatis-spring.version>1.3.0</mybatis-spring.version>
...
<dom4j.version>2.1.1</dom4j.version>
</properties> <repositories>
<repository>
<id>...</id>
<name>...</name>
<url>https://...</url>
</repository>
</repositories> <distributionManagement>
<repository>
<id>...</id>
<name>...</name>
<url>https://...</url>
</repository>
<snapshotRepository>
<id>...</id>
<name>...</name>
<url>https://...</url>
<uniqueVersion>false</uniqueVersion>
</snapshotRepository>
</distributionManagement> <dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
...
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>${dom4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>

IntelliJ Idea14 创建Maven多模块项目的更多相关文章

  1. IntelliJ Idea14 创建Maven多模块项目,多继承,热部署配置总结(三)

    pom.xml中repositories.pluginRepository的作用 pom.xml中repositories标签的作用是: 用来配置maven项目的远程仓库.示例如下: <repo ...

  2. Maven(4)-利用intellij idea创建maven 多模块项目

    本文通过一个例子来介绍利用maven来构建一个多模块的jave项目.开发工具:intellij idea. 一.项目结构 multi-module-project是主工程,里面包含两个模块(Modul ...

  3. 使用IntelliJ IDEA创建Maven多模块项目

    转载:http://blog.csdn.net/xyw591238/article/details/52794788 使用Maven管理项目时,往往需要创建多个模块,模块之间存在相互引用的关系.对于M ...

  4. IntelliJ IDEA创建maven多模块项目

    创建完成后的目录结构如下: 一.项目主要分成3个模块,yves-parent为父模块,yves-dao和yves-web(webapp类型的模块)为子模块. 二 .Parent Project,创建y ...

  5. 在IntelliJ IDEA中创建Maven多模块项目

    在IntelliJ IDEA中创建Maven多模块项目 1,创建多模块项目选择File>New>Project 出现New Project窗口左侧导航选择Maven,勾选右侧的Create ...

  6. springboot创建maven多模块项目

    SpringBoot创建maven多模块项目 项目结构 该项目名称为springboot-maven-multi,由springboot-maven-multi.user-dao.user-domai ...

  7. 在Eclipse中创建Maven多模块项目

    在Eclipse中创建Maven多模块项目1,创建多模块项目选择File>New>Project,打开New Project窗口,选择Maven>Maven Project,选择下一 ...

  8. Maven(二)使用eclipse创建maven多模块项目

    maven作为一种自动化构建工具,在现在的企业应用开发中运用非常普遍. 企业项目一般都比较大,多采用maven管理的多模块项目,下面直接上创建步骤 一.创建一个maven项目

  9. 利用intellijidea创建maven多模块项目

    一.项目结构 multi-module-PRoject是主工程,里面包含两个模块(Module): web-app是应用层,用于界面展示,依赖于web-service参的服务. web-service ...

随机推荐

  1. 【代码笔记】iOS-改变文字输入框背景

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  2. Masonry(AutoLayout)的使用

    Masonry 仍然在维持. 如果使用 Swift 开发, 建议使用 SnapKit. Masonry 以一种简便可读的代码实现子控件自动布局 ,甚至可以实现一些动画,是一中轻量级的框架. Mason ...

  3. 【转】JavaScript 异步进化史

    前言 JS 中最基础的异步调用方式是 callback,它将回调函数 callback 传给异步 API,由浏览器或 Node 在异步完成后,通知 JS 引擎调用 callback.对于简单的异步操作 ...

  4. 哭瞎!360云盘将关停,你的几十T照片和文件该怎么办

    IDO老徐刚得到了一个非常不开心的消息,360云盘将停止个人云盘服务...进行业务转型,在网盘存储.传播内容的合法性和安全性得到彻底解决之前不再考虑恢复,之后转型企业云服务. 而且之前共享的所有资料, ...

  5. JavaScript Patterns 6.1 Classical Versus Modern Inheritance Patterns

    In Java you could do something like: Person adam = new Person(); In JavaScript you would do: var ada ...

  6. mysql metadata lock(三)

    前言 MDL锁主要用来保护Mysql内部对象的元数据,通过MDL机制保证DDL与DML以及SELECT查询操作的并发.MySQL Meta Lock(一)和MySQL Meta Lock(二)已经讲了 ...

  7. Activiti之 Exclusive Gateway

    一.Exclusive Gateway Exclusive Gateway(也称为XOR网关或更多技术基于数据的排他网关)经常用做决定流程的流转方向.当流程到达该网关的时候,所有的流出序列流到按照已定 ...

  8. 微信公众平台开发(三) 订阅事件(subscribe)处理

    一.简介 新用户关注微信公众平台,将产生一个订阅事件,即subscribe事件,默认代码中没有对这一事件进行相应回复处理. 在新用户关注公众平台后,可能想知道该平台提供了哪些功能,以及怎样使用该平台, ...

  9. strlen和sizeof的区别

    1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型.该类型保证能容纳实现所建立的最大对象的字节大小.   2.sizeof是算符,strlen是函 ...

  10. apache指定的网络名不再可用

    如果Apache的error.log还是出现大量的:Sat Dec 24 17:21:28 2006] [warn] (OS 64)指定的网络名不再可 用. : winnt_accept: Async ...