都是一样的代码,为何在个人机器上能够编译执行,而在他的机器上就不行? java
为何在个人机器上能够正常打包,而配置管理员却打不出来? mysql
项目组加入了新的人员,我要给他说明编译环境如何设置,可是让我挠头的是,有些细节我也记不清楚了git
个人项目依赖一些jar包,我应该把他们放哪里?放源码库里?github
这是我开发的第二个项目,仍是须要上面的那些jar包,再把它们复制到我当前项目的svn库里吧 web
如今是第三次,再复制一次吧 —– 这样真的好吗? spring
我写了一个数据库相关的通用类,而且推荐给了其余项目组,如今已经有五个项目组在使用它了,今天我发现了一个bug,并修正了它,我会把jar包经过邮件发给其余项目组,这不是一个好的分发机制,太多的环节可能致使出现bugsql
项目进入测试阶段,天天都要向测试服务器部署一版。每次都手动部署,太麻烦了 数据库
官方网站:http://maven.apache.orgapache
本课程使用的maven的版本为3.0.5json
用户配置
4.1 听从Maven约定
src/main/java —— 存放项目的.java文件
src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件
src/test/java —— 存放全部测试.java文件,如JUnit测试类
src/test/resources —— 测试资源文件
target —— 项目输出位置
pom.xml——maven项目核心配置文件
Project
|-src
| |-main
| | |-java —— 存放项目的.java文件
| | |-resources —— 存放项目资源文件,如spring, hibernate配置文件
| |-test
| |-java ——存放全部测试.java文件,如JUnit测试类
| |-resources —— 测试资源文件
|-target —— 目标文件输出位置例如.class、.jar、.war文件
|-pom.xml ——maven项目核心配置文件
4.2 第一步:建立maven工程
首先创建MavenHelloWorld项目同时创建Maven约定的目录结构
MavenHelloWorld
|-src
| |-main
| | |-java —— 存放项目的.java文件
| | |-resources —— (暂时省略)
| |-test
| |-java ——存放全部测试.java文件,如JUnit测试类
| |-resources —— (暂时省略)
|-target —— (不手工建立)
|-pom.xml ——maven项目核心配置文件
4.3 第二步:建立HelloWorld.java
在src/main/java/cn/change/maven目录下新建文件Hello.java
package cn.change.maven;
public class HelloWorld {
public String sayHello(String name){
return "Hello World :" + name + "!";
}
}
4.4 第三步:新建测试文件HelloTest.java
在/src/test/java/cn/change/maven目录下新建测试文件HelloTest.java
package cn.change.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloWorldTest{
@Test
public void testHello(){
HelloWorld hello = new HelloWorld();
String results = hello.sayHello("maven");
assertEquals("Hello World :maven!",results);
}
}
4.5 第四步:建立pom.xml
在项目MavenHelloWorld根目录创建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.bshinfo.el</groupId>
<artifactId>ccb_el_manager</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ccb_el_manager Maven Webapp</name>
<url>http://maven.apache.org</url>
<packaging>war</packaging>
<build>
<finalName>ccb_el_manager</finalName>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- spring jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-cas</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!-- spring mvc jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!-- mybatis jar -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.1</version>
</dependency>
<!-- mybatis-paginator jar -->
<dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-paginator</artifactId>
<version>1.2.10</version>
</dependency>
<!-- mybatis-spring jar -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.4</version>
</dependency>
<!-- mysql-connector-java jar -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- 数据库链接池 jar -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<!-- log jar -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.19</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.19</version>
</dependency>
<!-- jsp Template jar -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<!-- apache servlet api jar -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>8.0.32</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.8.9</version>
</dependency>
<!-- activemq -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.13.2</version>
</dependency>
<!-- cas security -->
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.4.1</version>
</dependency>
<!-- end of cas security -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</project>
4.6 第五步:测试maven命令
4.6.1 mvn compile命令
4.6.2 mvn clean命令
4.6.3 mvn test命令
4.6.4 mvn clean compile命令
4.6.5 mvn clean test命令
4.6.6 mvn clean package命令
5.3 建立maven工程
5.3.3 第二个maven工程
第三步:点击finish完成。
5.3.3.2 修改pom文件
package cn.change.second;
import cn.change.first.First;
public class Second {
public String say(String name) {
First first = new First();
String result = first.say(name);
return result + ":second";
}
}
- 5.3.3.4 建立SecondTest.java
package cn.change.sencond;
import org.junit.Assert;
import org.junit.Test;
import cn.change.second.Second;
public class SecondTest {
@Test
public void testSay() {
Second second = new Second();
String result = second.say("张三");
Assert.assertEquals("hello 张三:first:second", result);
}
}
- 5.3.3.5 测试工程 -  - 若是maven-first工程没有安装则会出现如下错误:
[INFO] Scanning for projects…
[INFO]
[INFO] ————————————————————————
[INFO] Building maven-second 0.0.1-SNAPSHOT
[INFO] ————————————————————————
[WARNING] The POM for cn.change:maven-first:jar:0.0.1-SNAPSHOT is missing, no dependency information available
[INFO] ————————————————————————
[INFO] BUILD FAILURE
[INFO] ————————————————————————
[INFO] Total time: 0.218s
[INFO] Finished at: Fri Sep 25 15:06:00 CST 2015
[INFO] Final Memory: 4M/15M
[INFO] ————————————————————————
[ERROR] Failed to execute goal on project maven-second: Could not resolve dependencies for project cn.change:maven-second:jar:0.0.1-SNAPSHOT: Could not find artifact cn.change:maven-first:jar:0.0.1-SNAPSHOT -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
提示找不到maven-first的jar包。当系统运行时是从本地仓库中找依赖的jar包的,因此必须先将maven-first安装才能正常运行,须要在maven-first工程上运行 mvn install命令安装到本地仓库。
- 5.3.4 第三个工程 - 建立第三个工程此工程使用maven-second工程中的Second的方法,并测试。 - 5.3.4.1 建立工程 -  - 5.3.4.2 修改pom文件
<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>cn.change</groupId>
<artifactId>maven-third</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<!-- 依赖maven-first工程 -->
<dependency>
<groupId>cn.change</groupId>
<artifactId>maven-second</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
- 5.3.4.3 依赖关系 -  - 5.3.4.4 建立Third.java
package cn.change.third;
import cn.change.second.Second;
public class Third {
public String say(String name) {
Second second = new Second();
String result = second.say(name);
return result + ":third";
}
}
- 5.3.4.5 建立ThirdTest.java
package cn.change.third;
import org.junit.Assert;
import org.junit.Test;
public class ThirdTest {
@Test
public void testSay() {
Third third = new Third();
String result = third.say("张三");
Assert.assertEquals("hello 张三:first:second:third", result);
}
}
Maven的核心概念包括:坐标、依赖管理、仓库管理、生命周期、插件和目标、
聚合继承。
6.1 坐标
6.1.1 什么是坐标
6.1.2 Maven坐标主要组成
6.1.3 Maven为何使用坐标
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency>
`
6.2 依赖管理
其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系以下:
1.compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
若是Two中使用One,Three中使用Two则称Two是Three的直接依赖,而称One是Three的间接依赖。
C->B B->A
C直接依赖B
C间接依赖A
Maven生命周期就是为了对全部的构建过程进行抽象和统一。包括项目清理,初始化,编译,打包,测试,部署等几乎全部构建步骤。
生命周期能够理解为构建工程的步骤。在Maven中有三套相互独立的生命周期,请注意这里说的是“三套”,并且“相互独立”,这三套生命周期分别是:
Clean Lifecycle 在进行真正的构建以前进行一些清理工做。 Default Lifecycle
构建的核心部分,编译,测试,打包,部署等等。 Site Lifecycle 生成项目报告,站点,发布站点。
再次强调一下它们是相互独立的,你能够仅仅调用clean来清理工做目录,仅仅调用site来生成站点。固然你也能够直接运行 mvn clean
install site 运行全部这三套生命周期。
clean生命周期每套生命周期都由一组阶段(Phase)组成,咱们平时在命令行输入的命令总会对应于一个特定的阶段。好比,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:
pre-clean 执行一些须要在clean以前完成的工做 clean 移除全部上一次构建生成的文件 post-clean
执行一些须要在clean以后马上完成的工做mvn clean 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它以前的全部阶段都会被运行,也就是说,mvn
clean 等同于 mvn pre-clean clean ,若是咱们运行 mvn post-clean ,那么
pre-clean,clean 都会被运行。这是Maven很重要的一个规则,能够大大简化命令行的输入。
- 6.3.2.2 default:构建项目 -
Default生命周期Default生命周期是Maven生命周期中最重要的一个,绝大部分工做都发生在这个生命周期中。这里,只解释一些比较重要和经常使用的阶段:
validate generate-sources process-sources generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。 compile 编译项目的源代码。
process-classes generate-test-sources process-test-sources
generate-test-resources process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。 process-test-classes test
使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。 prepare-package package
接受编译好的代码,打包成可发布的格式,如 JAR 。 pre-integration-test integration-test
post-integration-test verify install 将包安装至本地仓库,以让其它项目依赖。 deploy
将最终的包复制到远程的仓库,以让其它开发人员与项目共享。运行任何一个阶段的时候,它前面的全部阶段都会被运行,这也就是为何咱们运行mvn install
的时候,代码会被编译,测试,打包。此外,Maven的插件机制是彻底依赖Maven的生命周期的,所以理解生命周期相当重要。
- 6.3.2.3 site:生成项目站点 -
Site生命周期
pre-site 执行一些须要在生成站点文档以前完成的工做
site 生成项目的站点文档
post-site 执行一些须要在生成站点文档以后完成的工做,而且为部署作准备
site-deploy 将生成的站点文档部署到特定的服务器上
这里常常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这但是Maven至关强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。
6.4 Maven插件