参考:http://www.cnblogs.com/lonelyxmas/p/5397422.html
http://www.ctolib.com/docs-IntelliJ-IDEA-c--159047.html(IDEA 使用教程,写的不错哟~~)
孔老师的《SpringMVC视频教程》
记录: 本节主要完成 使用 maven 管理 spring + 项目 包,搭建 maven+spring 的 web 项目平台。
前提: 已安装并配置好
- Intellij IDEA 16.3.5 Ultimate
- JDK 1.8.0_45
- Maven 3.3.9
- Tomcat 8.5.12
- MySql 5.7
- Spring 4.0.0
- Bootstrap 3.3.5 (可有可无)
不清楚的可参考
1. 创建 Maven 项目
对于不使用Maven的开发者,可以直接建一个简单的Web项目。使用Maven的话,请按照图进行操作。
(1)File->New Project 可进入以下界面:首先选择左边栏Maven,再配置JDK(一般如果之前添加了JDK的话会自动填充,如未添加的话点击旁边的New将JDK目录导入即可)。勾选“Create from archetype“,然后选中4处蓝色位置webapp,点Next。
(2)Next 后进入如下界面:这里需要填写GroupId和ArtifactId还有Version,这三个属性目的是标识你的项目的唯一性,比如Tomcat的GroupId是org.apache,即它是apache组织的项目,ArtifactId是tomcat,项目名为tomcat,而我当前使用的Version是7.0.68。这些只在发布时有用,在此可以随便填写,填好后点Next。
(3)Next 后,进入如下界面(配置 maven ):打开Maven home directory,可以发现IntelliJ IDEA已经集成了Maven 2和Maven 3两个版本,如果使用默认集成的maven的话,选择Buldled(Maven 3),直接点击Next。
我们也可以导入本地新安装的较新的Maven版本,点击蓝色箭头右边的 ... 按钮将Maven路径导入即可,点击Next:
(4)Next 后进入如下界面:填写项目名(可与上面 ID 相同,也可不同),选择项目保存路径,点击Finish:
说明:(1)相比较于多 Module 项目,小项目就无需搞得这么复杂。只有一个 Module 的结构 IntelliJ IDEA 也是支持的,并且 IntelliJ IDEA 创建项目的时候,默认就是单 Module 的结构的。
(2) 如上图,在输入 Project name 的时候,Module name 和 Module file Location 自动进行改变,同时 Project location 和 Module file Location 完全一样,这也就表示,Project 目录和 Module 目录是同一个,所以此时 Project 目录下就会有 src 目录,但是我们应该明白其本质还是 Module 的目录。
(5)finish 后,进入如下界面,maven会在后台生成web项目,这需要等待一定的时间,视网络环境而定,经验发现用较新版本的maven项目生成更快,使用IDEA集成的maven可能会等待很长一段实践。
左边红框中展示了该项目的文件结构。可以发现:
(1)如上图标注 1 所示,.idea 即为 Project 的配置文件目录。
如上图标注 2 所示,.iml 即为 Module 的配置文件目录。
- 通过上面的了解我们也知道 IntelliJ IDEA 项目的配置变动都是以这些 XML 文件的方式来表现的,所以我们也可以通过了解这些 XML 文件来了解 IntelliJ IDEA 的一些配置。也因为此特性,所以如果在项目协同中,我们要保证所有的项目配置一致,就可以考虑把这些配置文件上传到版本控制中。如果把这些文件加入到版本控制之后,那又有一点是需要考虑的,那就是协同者 Checkout 项目下来之后,按自己的需求进行项目配置的之后,项目的 XML 文件也会跟着变化。此时协同者的这些变化的文件就不应该再上传到版本控制中。至于如何更好地控制这些不想随时提交的文件,在接下来的版本控制专讲中会进行详细讲解。
(2)在src/main下创建了以下文件夹:
recources文件夹:一般用来存放一些资源文件
webapp文件夹:用来存放 web 配置文件以及 jsp 页面等,这已经组成了一个原始的 web 应用。
注意:选择 右边红框 的 Enable-Auto-Import,可以在每次修改 pom.xml 后,自动的下载并导入 jar 包,这一点在后面详述。
2. 新建 source 文件夹并命名为 Java,并设置:
(1) 按 ctrl+alt+shift+s,或者File->Project Structure,或点击如下:查看项目结构
出现如下图:
(2)选择Modules,在SpringMVCDemo的src\main文件夹中新建一个文件夹,取名为java:
接着,选中java文件夹,点击上面的 Make as:Sources,该文件夹就会变成蓝色,用以保存java代码,按OK,结束配置。
3.Maven自动导入jar包(添加项目包):包括 Spring 包(使用 spring 框架),测试包,日志包 等...
既然我们要用 SpringMVC 开发,那肯定少不了 SpringMVC 的相关 jar 包。如果不使用 Maven 的话,那就需要去官网下载相关的jar包,然后导入到项目中。现在使用 maven 的话,就不需要上网找jar包了。具体容我一一道来。
Maven所做的工作其实很简单,就是自动把你需要的jar包下载到本地,然后关联到项目中来。maven的所有jar包都是保存在几个中央仓库里面的,其中一个最常用的是Maven Repository,即,你需要什么 jar 包,它就会从仓库中拿给你。那么如何告诉 maven 需要什么 jar 包呢?我们看看工程目录,能找到一个 pom.xml 文件(这个文件在刚创建好项目时就已经展现在了大家面前),maven 就是靠它来定义需求的,代码如下:
<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.example</groupId> <artifactId>testWeb</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>testWeb Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>testWeb</finalName> </build> </project>
我们可以看到这个文件包含了我们之前定义的本项目的gropId等信息,这些信息是该项目的标识,我们不要去改动它们。
重点看<dependencies>标签,翻译过来是”依赖“的意思,也就是说把对每个包的需求都称为一个依赖<depedency>,定义在<dependencies>中。在每个<depedency>中,你需要提供的是所需 jar包的 groupId、artifactId、version 这三个必要信息。比如上面我们看到引入可一个 junit 包,格式如下:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency>
这是单元测试包,提供了三个基本信息,第4个 scope 对其他包来说是非必需的。所有jar包的引入都要满足这个格式。那么如何查看这些 jar 包的3个信息呢,可能刚接触是开发者还不是很熟悉,这个时候就需要查阅仓库了。比如我们需要引入 Spring 核心 jar 包 spring-core,打开Maven Repository,搜索spring-core,进入如下界面:
点击进入红框选中的 Spring Core,如下所示,可以看到各版本的使用情况:
选择使用最多版本 4.3.7.RELEASE,可以看到其dependency写法如下红框所示:
我们将其复制到 pom.xml 中的 <dependencies> 中:
这样,Maven 就会开始自动下载 jar 包到本地仓库,然后关联到你的项目中,下载完成后,我们展开工程目录中 External Libraries:
可以发现,虽然我们只写了一个依赖,但是它导入了两个jar包,也就是说,导入某个jar包时,与它密切相关的 jar 包也会同时被导入进来。
除了 spring-core,我还要 spring-context,复制 spring-core 的 <dependency>,将 spring-core 改为 spring-context,如下:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.7.RELEASE</version> </dependency>
下载完成后,查看External Libraries,会不会发现,瞬间导入了好多jar包(当然不是瞬间,这得看你的网速了)呢:
这就是 Maven 的强大之处,如果你需要使用 testWeb 开发网站的话,只需记住几个重要的包的名字,就可以轻松将所有包导入项目中。
长话短说,现在我们要进行 testWeb 的开发,请把你的 pom.xml 变成下面的样子,当然不要改你的 grupId 等信息(从modelVersion 到 url 都不要动):
(1) 添加公用版本信息(可以不添加,直接将版本写入即可)
<properties> <spring.version>4.3.7.RELEASE</spring.version> <hibernate.version>5.2.10.Final</hibernate.version> </properties>
(2)接着,请在<dependencies>中加入以下依赖:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.11.1.RELEASE</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency>
将<build>改成如下形式:
<build> <finalName>springmvcdemo</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <!-- 此处的 1.8 指的是 JDK 的版本,目前一般为 1.7 或 1.8 --> <target>1.8</target> </configuration> </plugin> </plugins> </build>
我的 完整的 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.example</groupId> <artifactId>testWeb</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>testWeb Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <spring.version>4.3.7.RELEASE</spring.version> <hibernate.version>5.2.10.Final</hibernate.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.11.1.RELEASE</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency> </dependencies> <build> <finalName>testWeb</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
我们可以发现,除了导入了spring相关jar包,还有一些其他的包,这些包都是有作用的,我们后面慢慢说。如果不使用Maven请自行下载spring、hibernate、mysql、jstl等相关jar包然后导入到工程中。至此,jar包的导入就完成了
此处补充下 Maven 快速排查依赖包冲突
(1)如下图,点击 箭头所指按钮,
- 出现左边的项目依赖结构图,通过此图我们可以很好的观察项目的依赖依赖情况。
- 如下标注1 所示,我们可以直接在依赖结构图上编辑依赖,常用的就是此排除功能。
(2)如下图所描述,一般我们出现红色线的时候是都要进行排除的,防止出现因为版本不同的依赖包造成无法编译。
(另开一文,见Java EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring)