(十)Maven依赖详解

1.何为依赖?

比如你是个男的,你要生孩子,呸呸呸...男的怎么生孩子,所以你得依赖你老婆,不过也不一定咯,你也可以依赖其她妹子。

我们在平时的项目开发中也是同理,你需要依赖一些东西才能实现相应的功能,但相应的功能或许也可以依赖其它的东西实现,比如数据库操作吧,你可以依赖hibernate,但你也可以通过mybatis来做。

这就是所谓的依赖关系咯。

以前我们需要手动的去找hibernate或者mybatis的jar包,系统抛异常我们还不知哪里报错,通过琢磨才明白没有引入相应的jar包,然后就去找啊找,找到了然后引入到工程当中。在这里我们就看到maven的好处了,它就是一个仓库,仓库里面有各种各样的包,想要什么就在pom.xml中依赖一下就好了,就算仓库中没有的包也可以把它扔到仓库中,想用的时候就依赖一下。

2.依赖的配置

 1 <project>
 2     <dependencies>
 3         <dependency>
 4             <groupId>junit</groupId>
 5             <artifactId>junit</artifactId>
 6             <version>3.8.1</version>
 7             <type>...</type>
 8             <scope>test</scope>
 9             <optional>...</optional>
10             <exclusions>
11                 <exclusion>
12                   <groupId>...</groupId>
13                   <artifactId>...</artifactId>
14                 </exclusion>
15           </exclusions>
16         </dependency>
17       </dependencies>
18 </project>                    

根元素下project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个依赖可以包含的元素有:

groupId,artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。

type:依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值是jar。

scope:依赖的范围,后面会进行详解。

optional:标记依赖是否可选。

exclusions:用来排除传递性依赖,后面会进行详细介绍。

大部分依赖声明只包含基本坐标,然而在一些特殊情况下,其他元素至关重要,我们来看看。

3.依赖范围说明

由于不同的包在不同的地方用到,像junit我们只有在做测试的时候会用到这个包,在我们项目发布的时候,用不到这个包;还有servlet-api,在项目编译的时候将会用到这个包,而项目发布的时候就不会用到这个包,因为一般容器已经自带这个包,如果我们导入,有可能会出现冲突,所以maven引入了依赖范围这个概念,即我们上面提到的scope来解决这个问题。Maven中有主要有以下这几种依赖范围:

1)     test:指的是测试范围有效,在编译打包、运行时都不会使用这个依赖。例如:junit jar包。

2)     compile:指的是编译范围有效,在编译、测试、打包、运行时都会将依赖存储进去。如果没有指定,就会默认使用该依赖范围。例如:hibernate jar包。

3)     provided:在编译和测试的过程有效,最后生成包时不会加入,运行时自然也没效果。例如:servlet-api,因为servlet-api,tomcat等web服务器已经存在该jar包了,如果再打包可能会有冲突。

4)     runtime:在测试、运行的时候依赖,在编译的时候不依赖。例如:JDBC驱动,项目代码只需要jdk提供的jdbc接口,只有在执行测试和运行项目的时候才需要实现jdbc的功能。

5)     system:系统依赖范围。该依赖范围与provided所表示的依赖范围一致,对于编译和测试有效,但在运行时无效。只是使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用,systemPath元素可以引用环境变量。例如:

 1 <dependency>
 2
 3          <groupId>javax.sql</groupId>
 4
 5          <artifactId>jdbc-stdext</artifactId>
 6
 7          <version>2.0</version>
 8
 9          <scope>system</scope>
10
11          <systemPath>${java.home}/lib/rt.jar</systemPath>
12
13 </dependency>

6)      import(Maven 2.0.9及以上):导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。

上述除import以外的各种依赖范围与三种classpath的关系如下:

依赖范围(scope) 测试classpath 编译classpath 运行classpath 例子
compile Y Y Y spring-core
provided   Y   servlet-api
test Y     junit
runtime Y   Y JDBC驱动实现
system Y Y   本地的,Maven仓库之外的类库文件

4.传递性依赖和依赖范围

Maven的依赖是具有传递性的,比如A->B,B->C,那么A间接的依赖于C,这就是依赖的传递性,其中A对于B是第一直接依赖,B对于C是第二直接依赖,C为A的传递性依赖。

在平时的开发中,如果我们的项目依赖了spring-core,依赖范围是compile,spring-core又依赖了commons-logging,依赖范围也是compile,那么我们的项目对于commons-logging这一传递性依赖的范围也就是compile。第一直接依赖的范围和第二直接依赖的范围决定了传递性依赖的范围。我们通过下面这个表格来说明,其中最左边一栏是第一直接依赖,最上面那一栏为第二直接依赖。中间交叉的是传递性依赖范围。


Compile


Test


Provided


Runtime


Compile


Compile


Runtime


Test


Test


Test


Provided


Provided


Provided


Provided


Runtime


Runtime


Runtime

例如:第一直接依赖范围是Test,第二直接依赖范围是Compile,那么传递性依赖的范围就是Test,大家可以根据这个表去判断。

仔细观察一下表格,我们可以发现这样的规律:

  • 当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致;
  • 当第二直接依赖的范围是test的时候,依赖不会得以传递;
  • 当第二直接依赖的范围是provided的时候,只传递第一直接依赖的范围也为provided的依赖,且传递性依赖的范围同样为provided;
  • 当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递性依赖的范围为runtime。

5.依赖调解

下面我们来思考这样一个问题,如果A->B->C->X(1.0),A->D-X(2.0),即A间接依赖X,我们可以看到有两条路径都依赖X,那么maven将会选择哪个版本的X?maven当中有一套自己的规则,我们来说明一下,maven传递性依赖的一些规则以及如何排除依赖冲突。

Maven里面对于传递性依赖有以下几个规则:

1)         最短路径原则:如果A对于依赖路径中有两个相同的jar包,那么选择路径短的那个包,路径最近者优先,上述会选X(2.0)。

2)         第一声明优先原则:如果A对于依赖路径中有两个相同的jar包,路径长度也相同,那么依赖写在前面的优先。例如:A->B->F(1.0),A->C->F(2.0),会选F(1.0)。

3)         可选依赖不会被传递,如A->B,B->C,B->D,A对B直接依赖,B对C和D是可选依赖,那么在A中不会引入C和D。可选依赖通过optional元素配置,true表示可选。如果要在A项目中使用C或者D则需要显式地声明C或者D依赖。

6.排除依赖

传递性依赖会给项目隐式的引入很多依赖,这极大的简化了项目依赖的管理,但是有些时候这种特性也会带来问题,它可能会把我们不需要的jar包也引入到了工程当中,使项目结构变得更复杂。或者你想替换掉默认的依赖换成自己想要的jar包,这时候就需要用到依赖排除。

例如:

 1 <dependency>
 2      <groupId>org.springframework</groupId>
 3      <artifactId>spring-core</artifactId>
 4      <version>3.2.8</version>
 5      <exclusions>
 6            <exclusion>
 7                 <groupId>commons-logging</groupId>
 8                 <artifactId>commons-logging</artifactId>
 9            </exclusion>
10      </exclusions>
11 </dependency> 

例子中spring-core包依赖了commons-logging包,我们使用exclusions元素声明排除依赖,exclusions可以包含一个或者多个exclusion子元素,因此可以排除一个或者多个传递性依赖。需要注意的是,声明exclusions的时候只需要groupId和artifactId,而不需要version元素,这是因为只需要groupId和artifactId就能唯一定位依赖图中的某个依赖。换句话说,Maven解析后的依赖中,不可能出现groupId和artifactId相同,但是version不同的两个依赖。

7.把依赖归为一类

在项目开发中往往会引入同一个项目中的多个jar包,比如最常见的spring,如果我们项目中用到很多关于Spring Framework的依赖,它们分别是spring-core-3.2.8.RELEASE, spring-beans-3.2.8.RELEASE,spring-context-3.2.8.RELEASE,它们都是来自同一项目的不同模块。因此,所有这些依赖的版本都是相同的,而且可以预见,如果将来需要升级Spring Framework,这些依赖的版本会一起升级。因此,我们应该在一个唯一的地方定义版本,并且在dependency声明引用这一版本,这一在Spring Framework升级的时候只需要修改一处即可。

首先使用properties元素定义Maven属性,实例中定义了一个<springframework.version>子元素,其值为3.2.8.RELEASE,有了这个属性定义之后,Maven运行的时候会将pom.xml中所有的${springframework.version}替换成实际的值:3.2.8.RELEASE。也就是可以使用$和{}的方式引用Maven的属性。然后将所有springframework依赖的版本替换成<version>${springframework.version}</version>这个样子,就和在Java代码中定义了一个不变的常量一样,以后要升级版本就只需要把这个值改了。

给大家一个完整的Maven配置实例,如果有在使用maven+spring+springMVC+Mybatis+Oracle数据库的朋友可以直接拿去改造成自己项目所需的父pom,配置如下:

  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
  4     <groupId>com.uidp</groupId>
  5     <artifactId>UidpParent</artifactId>
  6     <version>0.0.1-SNAPSHOT</version>
  7     <packaging>pom</packaging>
  8
  9     <name>UidpParent</name>
 10     <url>http://maven.apache.org</url>
 11
 12     <properties>
 13         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 14
 15         <repository-url>http://192.168.0.70:8081/content/groups/public/</repository-url>
 16
 17         <maven-compiler-plugin.version>3.1</maven-compiler-plugin.version>
 18         <maven-war-plugin.version>2.4</maven-war-plugin.version>
 19         <maven-javadoc-plugin.version>2.9.1</maven-javadoc-plugin.version>
 20         <maven-release-plugin.version>2.4.1</maven-release-plugin.version>
 21         <maven-deploy-plugin.version>2.7</maven-deploy-plugin.version>
 22
 23
 24
 25         <junit.version>4.11</junit.version>
 26         <oracle.version>10.2.0.4</oracle.version>
 27         <springframework.version>3.2.8.RELEASE</springframework.version>
 28         <mybatis.version>3.2.2</mybatis.version>
 29         <mybatis-spring.version>1.2.0</mybatis-spring.version>
 30         <mysql-driver.version>5.1.25</mysql-driver.version>
 31         <aspectjweaver.version>1.7.3</aspectjweaver.version>
 32
 33         <commons-dbcp.version>1.4</commons-dbcp.version>
 34         <commons-pool.version>1.5.5</commons-pool.version>
 35         <commons-fileupload.version>1.2.2</commons-fileupload.version>
 36
 37         <log4j.version>1.2.17</log4j.version>
 38         <slf4j-api.version>1.7.5</slf4j-api.version>
 39         <slf4j-log4j12.version>1.7.5</slf4j-log4j12.version>
 40
 41         <freemarker.version>2.3.19</freemarker.version>
 42
 43         <jackson-core.version>2.5.0</jackson-core.version>
 44         <jackson-mapper-asl.version>1.9.7</jackson-mapper-asl.version>
 45
 46         <javax.servlet-api.version>3.0.1</javax.servlet-api.version>
 47         <jsp-api.version>2.2</jsp-api.version>
 48         <kryo.version>1.04</kryo.version>
 49         <snakeyaml.version>1.8</snakeyaml.version>
 50         <jedis.version>2.0.0</jedis.version>
 51         <commons-lang.version>2.6</commons-lang.version>
 52
 53
 54         <mockito-core.version>1.8.5</mockito-core.version>
 55         <powermock-core.version>1.4.9</powermock-core.version>
 56         <powermock-api-mockito.version>1.4.9</powermock-api-mockito.version>
 57         <powermock-module-junit4.version>1.4.9</powermock-module-junit4.version>
 58
 59
 60     </properties>
 61
 62     <dependencyManagement>
 63         <dependencies>
 64
 65             <dependency>
 66                 <groupId>junit</groupId>
 67                 <artifactId>junit</artifactId>
 68                 <version>${junit.version}</version>
 69                 <scope>test</scope>
 70             </dependency>
 71
 72             <!-- spring jar begin -->
 73             <dependency>
 74                 <groupId>org.springframework</groupId>
 75                 <artifactId>spring-web</artifactId>
 76                 <version>${springframework.version}</version>
 77             </dependency>
 78
 79             <dependency>
 80                 <groupId>org.springframework</groupId>
 81                 <artifactId>spring-webmvc</artifactId>
 82                 <version>${springframework.version}</version>
 83             </dependency>
 84
 85             <dependency>
 86                 <groupId>org.springframework</groupId>
 87                 <artifactId>spring-beans</artifactId>
 88                 <version>${springframework.version}</version>
 89             </dependency>
 90
 91             <dependency>
 92                 <groupId>org.springframework</groupId>
 93                 <artifactId>spring-context</artifactId>
 94                 <version>${springframework.version}</version>
 95             </dependency>
 96
 97             <dependency>
 98                 <groupId>org.springframework</groupId>
 99                 <artifactId>spring-context-support</artifactId>
100                 <version>${springframework.version}</version>
101             </dependency>
102
103             <dependency>
104                 <groupId>org.springframework</groupId>
105                 <artifactId>spring-core</artifactId>
106                 <version>${springframework.version}</version>
107             </dependency>
108
109             <dependency>
110                 <groupId>org.springframework</groupId>
111                 <artifactId>spring-jdbc</artifactId>
112                 <version>${springframework.version}</version>
113             </dependency>
114
115             <dependency>
116                 <groupId>org.springframework</groupId>
117                 <artifactId>spring-tx</artifactId>
118                 <version>${springframework.version}</version>
119             </dependency>
120
121             <dependency>
122                 <groupId>org.springframework</groupId>
123                 <artifactId>spring-test</artifactId>
124                 <version>${springframework.version}</version>
125             </dependency>
126
127             <dependency>
128                 <groupId>org.springframework</groupId>
129                 <artifactId>spring-expression</artifactId>
130                 <version>${springframework.version}</version>
131             </dependency>
132
133             <dependency>
134                 <groupId>org.springframework</groupId>
135                 <artifactId>spring-aop</artifactId>
136                 <version>${springframework.version}</version>
137             </dependency>
138             <!-- spring jar end -->
139
140             <dependency>
141                 <groupId>org.mybatis</groupId>
142                 <artifactId>mybatis</artifactId>
143                 <version>${mybatis.version}</version>
144             </dependency>
145
146             <dependency>
147                 <groupId>org.mybatis</groupId>
148                 <artifactId>mybatis-spring</artifactId>
149                 <version>${mybatis-spring.version}</version>
150             </dependency>
151
152             <dependency>
153                 <groupId>mysql</groupId>
154                 <artifactId>mysql-connector-java</artifactId>
155                 <version>${mysql-driver.version}</version>
156             </dependency>
157
158             <dependency>
159                 <groupId>com.oracle</groupId>
160                 <artifactId>ojdbc14</artifactId>
161                 <version>${oracle.version}</version>
162             </dependency>
163
164             <dependency>
165                 <groupId>org.aspectj</groupId>
166                 <artifactId>aspectjweaver</artifactId>
167                 <version>${aspectjweaver.version}</version>
168             </dependency>
169
170
171             <dependency>
172                 <groupId>commons-dbcp</groupId>
173                 <artifactId>commons-dbcp</artifactId>
174                 <version>${commons-dbcp.version}</version>
175             </dependency>
176             <dependency>
177                 <groupId>commons-pool</groupId>
178                 <artifactId>commons-pool</artifactId>
179                 <version>${commons-pool.version}</version>
180             </dependency>
181             <dependency>
182                 <groupId>commons-fileupload</groupId>
183                 <artifactId>commons-fileupload</artifactId>
184                 <version>${commons-fileupload.version}</version>
185             </dependency>
186
187
188             <!-- log jar -->
189             <dependency>
190                 <groupId>log4j</groupId>
191                 <artifactId>log4j</artifactId>
192                 <version>${log4j.version}</version>
193             </dependency>
194             <dependency>
195                 <groupId>org.slf4j</groupId>
196                 <artifactId>slf4j-api</artifactId>
197                 <version>${slf4j-api.version}</version>
198             </dependency>
199             <dependency>
200                 <groupId>org.slf4j</groupId>
201                 <artifactId>slf4j-log4j12</artifactId>
202                 <version>${slf4j-log4j12.version}</version>
203             </dependency>
204
205             <!-- freemarker -->
206             <dependency>
207                 <groupId>org.freemarker</groupId>
208                 <artifactId>freemarker</artifactId>
209                 <version>${freemarker.version}</version>
210             </dependency>
211
212
213             <!-- jackson -->
214             <dependency>
215                 <groupId>com.fasterxml.jackson.core</groupId>
216                 <artifactId>jackson-core</artifactId>
217                 <version>${jackson-core.version}</version>
218             </dependency>
219             <dependency>
220                 <groupId>org.codehaus.jackson</groupId>
221                 <artifactId>jackson-mapper-asl</artifactId>
222                 <version>${jackson-mapper-asl.version}</version>
223             </dependency>
224
225             <dependency>
226                 <groupId>javax.servlet</groupId>
227                 <artifactId>javax.servlet-api</artifactId>
228                 <version>${javax.servlet-api.version}</version>
229                 <scope>provided</scope>
230             </dependency>
231
232             <dependency>
233                 <groupId>javax.servlet.jsp</groupId>
234                 <artifactId>jsp-api</artifactId>
235                 <version>${jsp-api.version}</version>
236                 <scope>provided</scope>
237             </dependency>
238
239             <dependency>
240                 <groupId>com.googlecode</groupId>
241                 <artifactId>kryo</artifactId>
242                 <version>${kryo.version}</version>
243             </dependency>
244
245             <dependency>
246                 <groupId>org.yaml</groupId>
247                 <artifactId>snakeyaml</artifactId>
248                 <version>${snakeyaml.version}</version>
249             </dependency>
250
251             <dependency>
252                 <groupId>redis.clients</groupId>
253                 <artifactId>jedis</artifactId>
254                 <version>${jedis.version}</version>
255             </dependency>
256
257             <dependency>
258                 <groupId>commons-lang</groupId>
259                 <artifactId>commons-lang</artifactId>
260                 <version>${commons-lang.version}</version>
261             </dependency>
262
263
264             <dependency>
265                 <groupId>org.mockito</groupId>
266                 <artifactId>mockito-core</artifactId>
267                 <version>${mockito-core.version}</version>
268                 <scope>test</scope>
269             </dependency>
270
271             <dependency>
272                 <groupId>org.powermock</groupId>
273                 <artifactId>powermock-core</artifactId>
274                 <version>${powermock-core.version}</version>
275                 <scope>test</scope>
276             </dependency>
277
278             <dependency>
279                 <groupId>org.powermock</groupId>
280                 <artifactId>powermock-api-mockito</artifactId>
281                 <version>${powermock-api-mockito.version}</version>
282                 <scope>test</scope>
283             </dependency>
284
285             <dependency>
286                 <groupId>org.powermock</groupId>
287                 <artifactId>powermock-module-junit4</artifactId>
288                 <version>${powermock-module-junit4.version}</version>
289                 <scope>test</scope>
290             </dependency>
291
292
293         </dependencies>
294     </dependencyManagement>
295
296     <distributionManagement>
297         <repository>
298             <id>releases</id>
299             <name>public</name>
300             <url>http://59.50.95.66:8081/nexus/content/repositories/releases</url>
301         </repository>
302         <snapshotRepository>
303             <id>snapshots</id>
304             <name>Snapshots</name>
305             <url>http://59.50.95.66:8081/nexus/content/repositories/snapshots</url>
306         </snapshotRepository>
307     </distributionManagement>
308
309
310
311 <build>
312     <plugins>
313
314         <plugin>
315             <groupId>org.apache.maven.plugins</groupId>
316             <artifactId>maven-compiler-plugin</artifactId>
317             <version>${maven-compiler-plugin.version}</version>
318             <configuration>
319                 <source>1.7</source> <!-- 源代码使用的开发版本 -->
320                 <target>1.7</target> <!-- 需要生成的目标class文件的编译版本 -->
321             </configuration>
322         </plugin>
323
324         <plugin>
325             <groupId>org.apache.maven.plugins</groupId>
326             <artifactId>maven-javadoc-plugin</artifactId>
327             <version>${maven-javadoc-plugin.version}</version>
328         </plugin>
329
330
331         <plugin>
332             <groupId>org.apache.maven.plugins</groupId>
333             <artifactId>maven-release-plugin</artifactId>
334             <version>${maven-release-plugin.version}</version>
335         </plugin>
336
337         <plugin>
338             <groupId>org.apache.maven.plugins</groupId>
339             <artifactId>maven-deploy-plugin</artifactId>
340             <version>${maven-deploy-plugin.version}</version>
341             <configuration>
342                 <updateReleaseInfo>true</updateReleaseInfo>
343             </configuration>
344         </plugin>
345
346
347
348     </plugins>
349 </build>
350
351
352     <pluginRepositories>
353         <pluginRepository>
354             <id>nexus</id>
355             <name>nexus</name>
356             <url>${repository-url}</url>
357             <releases>
358                 <enabled>true</enabled>
359             </releases>
360             <snapshots>
361                 <enabled>true</enabled>
362             </snapshots>
363         </pluginRepository>
364     </pluginRepositories>
365
366
367 </project>

结束语:日月如梭,光阴似箭。不知不觉马上就要到2017年了,很多时候真的觉得不是我们年轻人不想做的更好,大多数时候是被前面的人给压迫的越来越油条了,所谓前人如此,却要求后人如何如何,其实想想也觉得蛮搞笑的。前人尽情的挥洒着智慧,玩着小心思不断的在压榨着年轻人,年轻人无奈的在这么个环境中挣扎求存。本以为离开了一个坑会迎来一个美好的未来,没想到的是不知不觉又跳入了一个更深的大坑,甚至有些坑还是隐形的,没有点特异功能还真不一定能够发现。不过话虽如此,作为新一代的年轻人,一定要经得过惊涛骇浪,何况是这点小风小浪,不见得我们每个人都能成为一方人物,但也得和马云一样,万千年轻人中总得冒一两个人出来才对得住我们新的一代。如果我能认识这么一位人物并成为朋友,我想这辈子也就够了,不是因为他有多厉害多有钱,只是觉得能够从底层走到这种地步的人,他的思想境界是值得我们去学习和深思的。所以论企业家,我只服马云,会不会被打?

时间: 2024-12-20 02:41:44

(十)Maven依赖详解的相关文章

elasticSearch+spring 整合 maven依赖详解

摘自:http://www.mayou18.com/detail/nTxPQSyu.html [Elasticsearch基础]elasticSearch+spring 整合 maven依赖详解 Maven依赖   <!-- elasticsearch package -->        <dependency>             <groupId>fr.pilato.spring</groupId>             <artifact

eclipse里面构建maven项目详解(转载)

本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1       环境安装及分配 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.Maven主要服务于基于java平台的项目构建.依赖管理和项目信息管理,无论是小型的开源类库项目,还是大型的企业级应用,maven都能大显身手. 置于maven的安装过程及在eclipse里面配置maven,请看我在

TestNg依赖详解(一)------简单的依赖(单一方法依赖)

TestNg依赖测试之简单方法依赖,通过dependsOnMethods属性来配置依赖方法 Java code: /** * * <p> * Title: TestngDependencies * </p> * * <p> * Description: Testng提供了两种依赖实现 * * 1.强制依赖:某个测试用例之前需要执行的依赖链中如果有一个失败,那么接下来所有的测试都不会被执行 * 2.顺序依赖(软依赖):顺序依赖的用处更多是用来检测一个测试链是否按照正确的顺

Maven使用详解

什么是Maven? 如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包.一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败. 以往开发项目时,程序员往往需要花较多的精力在引用Jar包搭建项目环境上,而这一项工作尤为艰难,少一个Jar包.多一个Jar包往往会报一些让人摸不着头脑的异常. 而Maven就是一款帮助程序员构建项目的工具,我们只

Maven入门详解以及Eclisp的集成

1.首先要安装Maven到操作系统上 Maven的下载页面:http://maven.apache.org/download.html Maven跟Tomcat很像,下载下来后直接解压在指定的目录就安装成功了,不过Maven比Tomcat多了一项环境变量配置 当前版本3.0.3.解压缩下载的文件, 首先创建一个系统变量M2HOME,变量值指向maven的解压目录,如图所示: 将其中的bin目录设置到windows Path环境变量中.就是把%M2HOME%\bin加到path系统变量中,如图所示

面向对象编程(十六)——内部类详解

一.内部类(innerclasses) 一般情况,我们把类定义成独立的单元.有些情况下,我们把一个类放在另一个类的内部定义,称为内部类. 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类. 1. 内部类的作用 内部类提供了更好的封装,只能让外部类直接访问,不允许同一个包中的其他类直接访问. 内部类可以直接访问外部类的私用属性.内部类被当成其外部类的成员.但是外部类不能访问内部类的

maven搭建详解

1, 下载 官方下载地址: maven_download, 最新版 apache-maven-3.0.5-bin.tar.gz 官方地址: maven 2, 解压 tar zxvf apache-maven-3.0.5-bin.tar.gz (例如安装目录为: /home/homer/Apache-maven/apache-maven-3.0.5) 3, 安装 1) 编辑 /etc/profile sudo vi /etc/profile 2) 配置 配置maven安装目录: export MA

.Net 缓存依赖详解

缓存命名空间的讲解流程 16.1  System.Web.Caching简介 本节从缓存命名空间的总体简介和组成结构入手,从整体上对System.Web.Caching进行概述. 16.1.1  System.Web.Caching概述 System.Web.Caching 是用来管理缓存的命名空间.缓存就是将服务器端的数据暂时保存在客户端,方便用户的读取.缓存命名空间的父级空间是“System.Web”,由此可以看 出,缓存通常用于Web网站的开发,包括在B/S项目中的开发.缓存的设计主要是考

十四、详解事务

本篇内容 什么是事务,它有什么用? 事务的几个特性 事务常见操作指令详解 事务的隔离级别详解 脏读.不可重复读.可重复读.幻读详解 演示各种隔离级别产生的现象 关于隔离级别的选择 一.什么是事务? 数据库中的事务是指对数据库执行一批操作,这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况. 二.事务的几个特性(ACID) 原子性(Atomicity) 事务的整个过程如原子操作一样,最终要么全部成功,或者全部失败,这个原子性是从最终结果来看的,从最终结果来看这个过程是不可分割的.