实战项目总结之开发环境-Maven配置
我接触Maven有好几年了,一直被他“拿来主义”(自己认为的)所吸引。传统的Java工程需要自己辛辛苦苦去找依赖库,有时候在库的版本兼容性上耗费许多功夫,项目的配置构建也相当麻烦。而使用Maven确不用过于关心这些细节省去不少麻烦事,Maven作为一个项目管理工具,不仅提供构建项目的能力:项目依赖管理、报表生成,打包部署,而且更总要的是能够将项目划分为若干个组件联系在一起,在开发每个组件是不用过分关心其他组件,“做好自己的事”,符合面向对象设计的“单一原则”。其次Maven能够和持续集成工具,代码评估工具,自动化测试,以及跨平台的多个项目联系在一起是它最强大之处。
特别说明:
本文着重说明Maven的配置,如果仅仅是参考本文需要一定的Maven基础,包括安装以及私服的搭建使用。后面我会专门用一个章节来讲述如何安装、搭建、使用Maven。
一、Settings.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 6 <!-- 7 本配置需要结合Nexus Maven私服仓库使用,如果仅使用Maven公共仓库则无需配置Settings.xml文件 8 --> 9 10 <!-- 需要激活的profile --> 11 <activeProfiles> 12 <activeProfile>public</activeProfile> 13 </activeProfiles> 14 15 <!-- 16 配置服务器ID以及用户名密码,由于Nexus私服仓库配置有访问权限, 17 因此下载、部署都需要提供用户名密码,releases、snapshots是在项目中部署时会用到 18 --> 19 <servers> 20 <server> 21 <id>releases</id> 22 <username>deployment</username> 23 <password>123456</password> 24 </server> 25 <server> 26 <id>snapshots</id> 27 <username>deployment</username> 28 <password>123456</password> 29 </server> 30 <server> 31 <id>public</id> 32 <username>deployment</username> 33 <password>123456</password> 34 </server> 35 </servers> 36 37 <profiles> 38 <!-- 公共仓库&插件仓库 --> 39 <profile> 40 <id>public</id> 41 <repositories> 42 <repository> 43 <id>public</id> 44 <url>http://192.168.1.3:8081/nexus/content/groups/public</url> 45 <releases> 46 <enabled>true</enabled> 47 </releases> 48 <snapshots> 49 <enabled>true</enabled> 50 </snapshots> 51 </repository> 52 </repositories> 53 <pluginRepositories> 54 <pluginRepository> 55 <id>public</id> 56 <url>http://192.168.1.3:8081/nexus/content/groups/public</url> 57 <releases> 58 <enabled>true</enabled> 59 </releases> 60 <snapshots> 61 <enabled>true</enabled> 62 </snapshots> 63 </pluginRepository> 64 </pluginRepositories> 65 </profile> 66 67 </profiles> 68 69 </settings>
二、pom.xml
较大的项目一般分为若干个模块,我这里主要划分为持久化组件、核心组件、各个业务WEB服务器组建,后续我会单独讲这块设计,这里简单提一下:
1.持久化组建,定义题组标准的持久化接口,提供给核心层调用,如果业务不变,那么定义的接口是不会发生变化的,在移动互联网发展项目中往往会根据用户量的增加更换不同的持久化方式,比如前期用户量少会选用一般的关系型数据库存储数据,如果用户量较大某些表往往会采用具有具有高速读写能力的NoSQL数据库。总之接口是抽象稳定的上层业务不必关心底层时如何持久化的,这一层有可能采用多种持久化方式。
2.核心业务层,实现核心业务,供Web层调用。
3.我所设计的项目中Web接口被划分到不同的Web服务器上,每种服务器的请求不同可以弹性增加或减少服务器。
综上所述:根据Maven的聚合工程特点会建立四种工程:
1.父工程,统筹聚合所有自工程,总体配置依赖、依赖关系、报表、构建方式等;
2.持久化工程,在我所设计的项目最底层的依赖工程;
3.核心工程,中间层依赖工程,可以被任何上层业务调用,比如前台Web接口,后台系统,job作业等;
4.顶层业务工程,如前台Web接口,后台系统,job作业等;
一些约定:
1.所有工程编码方式均采用UTF-8;
2.必须统一编译环境;
3.创建Maven工程均采用“Create a simple project”方式创建;
4.统一的Group Id,例如“org.hlc.demo”;
5.工程英文名称-工程性质,例如demo-parent,demo-repository,demo-core,demo-webapi;
父工程配置:
1 <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"> 2 <modelVersion>4.0.0</modelVersion> 3 <groupId>org.hlc.demo</groupId> 4 <artifactId>demo-parent</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 <packaging>pom</packaging> 7 8 <!-- 项目信息,包括项目名称,描述,主页等。 --> 9 <name>demo</name> 10 <inceptionYear>2015</inceptionYear> 11 <url>http://demo.hlc.org</url> 12 <description>用于演示的maven工程</description> 13 14 <!-- 开发组织信息 --> 15 <organization> 16 <name>HLC</name> 17 <url>http://www.hlc.org</url> 18 </organization> 19 20 <!-- 开发人员信息 --> 21 <developers> 22 <developer> 23 <id>admin</id> 24 <name>huanglicong</name> 25 <email>huanglicong@hlc.org</email> 26 <url>http://www.hlc.cn/huanglicong</url> 27 </developer> 28 </developers> 29 30 <!-- 问题跟踪系统 --> 31 <issueManagement> 32 <system>jira</system> 33 <url>http://www.hlc.org/jira/browse/demo</url> 34 </issueManagement> 35 36 <!-- 版本控制器 --> 37 <scm> 38 <!-- 描述如何连接到版本控制器 --> 39 <connection>scm:svn:https://git.oschina.net/ihlc/demo.git</connection> 40 <!-- 开发人员使用的代码仓库 --> 41 <developerConnection>scm:svn:https://git.oschina.net/ihlc/demo.git</developerConnection> 42 <!-- 只读可看的代码仓库 --> 43 <url>https://git.oschina.net/ihlc/demo.git</url> 44 <tag>master</tag> 45 </scm> 46 47 <!-- 持续集成系统 --> 48 <ciManagement> 49 <system>jenkins</system> 50 <url>http://www.hlc.org/jenkins/demo</url> 51 </ciManagement> 52 53 <!-- 工程属性,可依赖传递 --> 54 <properties> 55 <!-- 依赖属性 --> 56 <slf4j.version>1.7.5</slf4j.version> 57 <junit.version>4.11</junit.version> 58 <commons-lang3.version>3.1</commons-lang3.version> 59 <guava.version>13.0.1</guava.version> 60 <log4j-version>1.2.16</log4j-version> 61 62 <spring.version>4.0.7.RELEASE</spring.version> 63 <spring.data.jpa>1.7.0.RELEASE</spring.data.jpa> 64 <hibernate>4.3.6.Final</hibernate> 65 66 <!-- 构建属性 --> 67 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 68 <java.version>1.6</java.version> 69 </properties> 70 71 <!-- 发布地址 --> 72 <distributionManagement> 73 <repository> 74 <id>releases</id> 75 <name>Local Nexus Repository</name> 76 <url>http://develop.totoole.cn:8081/nexus/content/repositories/releases/</url> 77 </repository> 78 <snapshotRepository> 79 <id>snapshots</id> 80 <name>Local Nexus Repository</name> 81 <url>http://develop.totoole.cn:8081/nexus/content/repositories/snapshots/</url> 82 </snapshotRepository> 83 </distributionManagement> 84 85 86 <!-- 依赖库 --> 87 <dependencies> 88 <!-- logging --> 89 <dependency> 90 <groupId>org.slf4j</groupId> 91 <artifactId>slf4j-api</artifactId> 92 <version>${slf4j.version}</version> 93 <scope>provided</scope> 94 </dependency> 95 <dependency> 96 <groupId>org.slf4j</groupId> 97 <artifactId>jcl-over-slf4j</artifactId> 98 <version>${slf4j.version}</version> 99 <scope>provided</scope> 100 </dependency> 101 <dependency> 102 <groupId>org.slf4j</groupId> 103 <artifactId>slf4j-log4j12</artifactId> 104 <version>${slf4j.version}</version> 105 <scope>provided</scope> 106 </dependency> 107 <dependency> 108 <groupId>log4j</groupId> 109 <artifactId>log4j</artifactId> 110 <version>${log4j-version}</version> 111 <scope>provided</scope> 112 </dependency> 113 <dependency> 114 <groupId>com.googlecode.log4jdbc</groupId> 115 <artifactId>log4jdbc</artifactId> 116 <version>1.2</version> 117 <scope>provided</scope> 118 </dependency> 119 120 <!-- test --> 121 <dependency> 122 <groupId>junit</groupId> 123 <artifactId>junit</artifactId> 124 <version>${junit.version}</version> 125 <scope>test</scope> 126 </dependency> 127 128 <!-- utils --> 129 <dependency> 130 <groupId>com.google.guava</groupId> 131 <artifactId>guava</artifactId> 132 <version>${guava.version}</version> 133 </dependency> 134 <dependency> 135 <groupId>org.apache.commons</groupId> 136 <artifactId>commons-lang3</artifactId> 137 <version>${commons-lang3.version}</version> 138 </dependency> 139 </dependencies> 140 141 <!-- 依赖管理 --> 142 <dependencyManagement> 143 <dependencies> 144 <dependency> 145 <groupId>org.springframework.data</groupId> 146 <artifactId>spring-data-jpa</artifactId> 147 <version>${spring.data.jpa}</version> 148 </dependency> 149 <dependency> 150 <groupId>org.hibernate</groupId> 151 <artifactId>hibernate-core</artifactId> 152 <version>${hibernate}</version> 153 </dependency> 154 <dependency> 155 <groupId>org.hibernate</groupId> 156 <artifactId>hibernate-entitymanager</artifactId> 157 <version>${hibernate}</version> 158 </dependency> 159 <dependency> 160 <groupId>org.springframework</groupId> 161 <artifactId>spring-oxm</artifactId> 162 <version>${spring.version}</version> 163 </dependency> 164 <dependency> 165 <groupId>org.springframework</groupId> 166 <artifactId>spring-webmvc</artifactId> 167 <version>${spring.version}</version> 168 </dependency> 169 170 <dependency> 171 <groupId>org.hlc.demo</groupId> 172 <artifactId>demo-repository</artifactId> 173 <version>${project.version}</version> 174 </dependency> 175 <dependency> 176 <groupId>org.hlc.demo</groupId> 177 <artifactId>demo-core</artifactId> 178 <version>${project.version}</version> 179 </dependency> 180 </dependencies> 181 </dependencyManagement> 182 183 <modules> 184 <module>demo-repository</module> 185 <module>demo-core</module> 186 <module>demo-web</module> 187 </modules> 188 189 <build> 190 <plugins> 191 <plugin> 192 <groupId>org.apache.maven.plugins</groupId> 193 <artifactId>maven-resources-plugin</artifactId> 194 <version>2.6</version> 195 <configuration> 196 <encoding>UTF-8</encoding> 197 </configuration> 198 </plugin> 199 <plugin> 200 <groupId>org.apache.maven.plugins</groupId> 201 <artifactId>maven-compiler-plugin</artifactId> 202 <version>3.1</version> 203 <configuration> 204 <source>${java.version}</source> 205 <target>${java.version}</target> 206 <debug>true</debug> 207 </configuration> 208 </plugin> 209 <plugin> 210 <groupId>org.apache.maven.plugins</groupId> 211 <artifactId>maven-surefire-plugin</artifactId> 212 <version>2.15</version> 213 <configuration> 214 <argLine>-Xmx256m</argLine> 215 </configuration> 216 </plugin> 217 <plugin> 218 <groupId>org.apache.maven.plugins</groupId> 219 <artifactId>maven-source-plugin</artifactId> 220 <version>2.2.1</version> 221 <executions> 222 <execution> 223 <id>attach-sources</id> 224 <goals> 225 <goal>jar</goal> 226 </goals> 227 </execution> 228 </executions> 229 </plugin> 230 <plugin> 231 <groupId>org.apache.maven.plugins</groupId> 232 <artifactId>maven-javadoc-plugin</artifactId> 233 <version>2.9.1</version> 234 <configuration> 235 <encoding>UTF-8</encoding> 236 </configuration> 237 </plugin> 238 </plugins> 239 </build> 240 241 </project>
子工程配置:
子工程配置相对简单,更具需要配置
1 <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"> 2 <modelVersion>4.0.0</modelVersion> 3 <parent> 4 <groupId>org.hlc.demo</groupId> 5 <artifactId>demo-parent</artifactId> 6 <version>0.0.1-SNAPSHOT</version> 7 </parent> 8 <artifactId>demo-repository</artifactId> 9 10 <dependencies> 11 <dependency> 12 <groupId>org.springframework.data</groupId> 13 <artifactId>spring-data-jpa</artifactId> 14 </dependency> 15 <dependency> 16 <groupId>org.hibernate</groupId> 17 <artifactId>hibernate-core</artifactId> 18 </dependency> 19 <dependency> 20 <groupId>org.hibernate</groupId> 21 <artifactId>hibernate-entitymanager</artifactId> 22 </dependency> 23 </dependencies> 24 </project>
如果你想进一步学习,可以参考老外的项目比如一些Jar包中的Maven配置,就像看一些开源代码样有很好的学习价值。我也只是经验山的总结,所述的并不全面,因此这样的学习方法是很有用的。

浙公网安备 33010602011771号