Maven组织项目进行编译、部署
Maven项目基本的结构说明如下:
mazhi // 控制所有荐的编译、部署、发布
mazhi-app-parent // 项目的父项目,有一些公共的设置可以被子项目继承
mazhi-core // 基础服务项目,例如公共类等
mazhi-xxx
其中mazhi和mazhi-app-parent是pom格式,而mazhi-core是jar格式,还可以是 war等格式。
我们以新建mazhi和mazhi-core项目为例说明一下。
新建Maven-project项目,过程配置如下:
注意在“Create a simple project”前打钩。
填写Group Id,Artifact Id,选择Packaging为pom 格式后,Finish即可。
同样的方式新建mazhi-app-parent模块,不过需要指定父模块为mazhi,如下:
新建父模块mazhi下的子模块mazhi-core,选择Maven-Module,指定父类为mazhi,如下:
一路点下去即可。
项目完成新建后如下:
不过我们需要做一下调整,现在是mazhi-core直接继承了mazhi项目的配置,现在要继承mazhi-app-parent来继承配置,打开mazhi-core模块下的pom.xml文件,修改如下节点:
<parent> <groupId>org.mazhi</groupId> <artifactId>mazhi-app-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../mazhi-app-parent</relativePath> </parent>
注意添加relativePath节点。
在mazhi项目下,右键pom.xml文件,选择Run as >> Maven Install后,Eclipse输出如下信息表示一切顺利!!
项目已经Build和Install了。我们可以看上一节的内容,将mazhi-core编译为jar包后扔到Nexus私服上,以便所有人引用这个公共类。
下面来了解一下Maven模块的基本结构,如下:
下面我们就可以基于Maven来组织项目的整个结构了。
Maven项目(根目录)
|----src
| |----main
| | |----java ——存放项目的.java文件
| | |----resources ——存放项目资源文件,如spring boot, hibernate配置文件
| |----test
| | |----java ——存放所有测试.java文件,如JUnit测试类
| | |----resources ——存放项目资源文件,如spring boot, hibernate等配置文件
|----target ——项目输出位置
|----pom.xml ----Maven的配置文件
根据mazhi-core模块的pom.xml中配置说明如下:
<?xml version="1.0"?> <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> <!-- 项目的父项目 --> <parent> <groupId>org.mazhi</groupId> <artifactId>mazhi-app-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../mazhi-app-parent</relativePath> </parent> <!-- groupId: groupId:项目或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app --> <groupId>org.mazhi</groupId> <!-- artifactId: 项目的通用名称 --> <artifactId>mazhi-core</artifactId> <!-- packaging: 打包的机制,如pom, jar, maven-plugin, ejb, war, ear, rar, par --> <packaging>jar</packaging> <!-- version:项目的版本 --> <version>SNAPSHOT-0.0.1</version> <!-- 项目的名称, Maven 产生的文档用 --> <name>Mazhi Core</name> <!-- 哪个网站可以找到这个项目,提示如果 Maven 资源列表没有,可以直接上该网站寻找, Maven 产生的文档用 --> <url>http://mazhi.org</url> <!-- 项目的描述, Maven 产生的文档用 --> <description>A maven project to study maven.</description> <!-- 用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置 --> <distributionManagement> <repository> <id>nexus-releases</id> <url>http://ip:端口/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <url>http://ip:端口/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement> <!-- 依赖关系 --> <dependencies> <!-- 自动加入的依赖包,它们是通过项目坐标来找到依赖包的。所以用了maven之后就不需要再拷jar包了 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <!-- 依赖的范围:默认为compile --> <!-- test:测试范围有效。即编译和打包时不会加入该依赖包 --> <!-- compile:编译范围有效。即编译和打包时会将该依赖包一并加入 --> <!-- provided:编译和测试时有效,最后生成war包时不会加入该依赖包。比如web容器本身已包含的servlet-api.jar,再打包则会冲突 --> <!-- runtime:运行范围有效,编译时则不依赖 --> <scope>test</scope> <!-- <exclusions><exclusion></exclusion></exclusions> --> <!-- - exclusions表示只包括指定的项目,不包括相关的依赖。试想一下,两个三方jar依赖不同版本的日志包jar,项目会知道应该使用哪个吗?答案是否定的 --> </dependency> </dependencies> </project>
微服务开发之Spring Boot
我们新建一个Maven Module,父类是mazhi,然后和mazhi-core模块一样,更改父模块为mazhi-app-parent。
在mazhi项目中的pom.xml中指定一些配置,如下:
<properties> <!-- 表示项目根目录 --> <main.basedir>${basedir}/..</main.basedir> <java.version>1.7</java.version> <spring.version>4.1.4.RELEASE</spring.version> <hibernate.api.version>1.0.1.Final</hibernate.api.version> </properties>
<dependencyManagement> <dependencies> <dependency> Import dependency management from spring boot <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.2.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
这样子模块就可以引用这些属性。
在mazhi-app-parent项目中,配置spring boot集成maven的插件,如下:
<!-- 安装spring boot集成Maven的插件 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
在mazhi-service模块中引入Spring boot的包,如下:
<!-- Add typical dependencies for a web application --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
在 org.mazhi.service包中新建Application.class类,内容如下:
package org.mazhi.service; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @EnableAutoConfiguration public class Application { @RequestMapping("/") @ResponseBody String home() { return "Hello World!"; } public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } }
添加Spring boot的配置文件,放到java/main/resource下,内容如下:
# Server settings (ServerProperties) server: port: 8090 sessionTimeout: 30 # contextPath: / # Tomcat specifics tomcat: accessLogEnabled: false protocolHeader: x-forwarded-proto remoteIpHeader: x-forwarded-for basedir: backgroundProcessorDelay: 30 # secs management: address: 127.0.0.1 port: 8090 info: app: name: springtest description: spring test version: 1.0.0
注意缩近和格式,不要随便做对齐什么的操作,这是一种约定。
在这个类上右键,Run As >> Java Application,可以看到Eclipse的控制台输出如下信息,表示启动成功!!
可以用浏览器去访问一下这个服务,地址为:
http://localhost:8090/
浏览器会输出:
Hello World!
如果我们想要引用mazhi-core中的工具类,那么可以在 mazhi-service中引入,如下:
在<dependencies>节点中添加如下依赖:
<dependency> <groupId>org.mazhi</groupId> <artifactId>mazhi-core</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
如果这时候没有对mazhi-core进行build和instaling过程时,可能会报错,需要对mazhi-core模块install一下,然后进行引入即可。
Maven项目有时候本身没错,但是项目名上显示红叉,这时候只要更新一下项目即可。
项目上右键 >> Maven >> Update Project .. 即可。
或者还报错的话,需要先运行mazhi项目下的pom.xml文件,install一下,保证几个子模块成功进行了build和installing过程。