一、maven介绍及环境搭建
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。常用来管理依赖。
可以到Maven官网下载页面下载Maven: http://maven.apache.org/download.cgi
下载解压之后进入目录apache-maven-3.6.1\bin,这个目录下包含mvn的运行脚本(可执行的脚本命令):
m2.conf # 配置文件
mvn #
mvn.cmd # mvn的运行脚本
mvnDebug #
mvnDebug.cmd #
mvnyjp #
目录apache-maven-3.6.1\boot 包含一个类加载器的框架,Maven使用它来加载自己的类库:
plexus-classworlds-2.6.0.jar
目录apache-maven-3.6.1\conf是Maven配置文件目录
│ settings.xml
│ toolchains.xml
│
└─logging
simplelogger.properties
目录apache-maven-3.6.1\lib包含了Maven项目运行时所用到的所有类库。
Maven项目查找jar包的过程:
构件:maven中,任何一个依赖、插件、项目构建的输出都可以称之为构件,所有构件通过坐标作为其唯一标识。
Maven默认中央仓库地址:https://repo.maven.apache.org/maven2
可在apache-maven-3.6.1\lib\maven-model-builder-3.6.1.jar
中找到,解压jar包,找到org/apache/maven/model/pom-4.0.0.xml
中找到:
Maven的两大核心
- 依赖管理:对jar包管理过程
- 项目构建:项目在编码完成后,对项目进行编译、测试、打包、部署等一系列的操作都通过mvn命令来实现。
一个栗子——通过Maven命令将Web项目发布到Tomcat:
> cd my_project_dir
my_project_dir> mvn tomcat:run
二、Maven环境变量配置
- 新建变量名:
M2_HOME
,变量值指向Maven的解压目录,比如:D:\maven\apache-maven-3.6.1
- 在
Path
变量中增加;%M2_HOME%\bin
注:确保JDK环境变量配置:JAVA_HOME存在,且JDK不低于1.8
查看Maven版本,验证配置是否成功:
D:\> mvn -v
D:\
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T03:00:29+08:00)
Maven home: D:\maven\apache-maven-3.6.1\bin\..
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_191\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
D:\>
打印出的信息可以查看到Maven版本号、java的版本号以及系统信息等等。至此Maven配置成功。
三、Maven项目创建
1、Maven项目结构
src
- main
- jave
- package
- resources # 存放项目需要的配置文件
- webapp # 存放页面相关的素材文件,资源文件
- test
- java # 单元测试类
- package
- resources # 存放资源文件、配置文件
- target # 并不属于Maven项目,存放项目经过编译的字节码文件和测试报告
- pom.xml # 项目对象模型,是Maven项目的核心配置文件
2、编写文件
└─maven_p_demo
│ pom.xml
│
└─src
├─main
│ └─java
│ └─top
│ └─onefine
│ └─maven_p_demo
│ └─model
│ HelloWorld.java
│
└─test
└─java
└─top
└─onefine
└─maven_p_demo
└─model
HelloWorldTest.java
HelloWorld.java文件编写:
package top.onefine.maven_p_demo.model;
public class HelloWorld {
public String sayHello() {
return "Hello World!";
}
}
HelloWorldTest.java文件编写:
package top.onefine.maven_p_demo.model;
import org.junit.Test;
import org.junit.Assert;
public class HelloWorldTest {
@Test
public void testHello() {
Assert.assertEquals("Hello World!", new HelloWorld().sayHello());
}
}
pom.xml文件编写:
<?xml version="1.0" encoding="UTF-8"?>
<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><!--maven的版本-->
<!--指定项目所在位置-->
<groupId>top.onefine.maven_p_demo</groupId><!--groupId的值是项目的包名-->
<artifactId>maven01-model</artifactId><!--artifactId的值是模块名-->
<version>0.0.1SNAPSHOT</version><!--项目的版本,SNAPSHOT指这是一个快照(测试)版本-->
<!--依赖相关的包-->
<dependencies>
<dependency>
<groupId>junit</groupId><!--groupId的值是项目的包名-->
<artifactId>junit</artifactId><!--artifactId的值是模块名-->
<version>4.10</version><!--项目的版本,SNAPSHOT指这是一个快照版本-->
</dependency>
</dependencies>
</project>
3、编译此项目
进入项目所在目录并编译:
> cd project\maven_p_demo
> mvn compile # 编译项目
运行测试用例:
> mvn test # 测试
生成JAR:
> mvn package # 打包项目
4、Eclipse导入Maven项目
常用工具:
勾选自动编译:
四、常用的构建命令
Maven常用的构建命令
mvn -v # 查看maven版本
clean # 删除项目目录下的target文件夹及其里面所有文件——这个文件存放项目经过编译的字节码文件和测试报告
compile # 编译
test # 单元测试——直接执行mvn test 即可对项目中的所有测试用例进行单元测试,执行测试用例之前会自动编译测试文件
package # 将项目打包——将会自动执行是编译->测试->打包
install # 将项目打包之后的jar包发布到本地仓库中,解决本地多个项目公用一个jar包。自动执行编译->测试->打包->安装。
注意:
1、单元测试类名有要求,类似XxxxTest.java
,即必须以Test结尾。
将项目根目录下src/test/java
目录下的单元测试类都会执行。
2、打包在项目根目录下taget目录里面,打包的格式由项目来决定:
- web project ---- war包
- java project -----jar包
Maven项目的生命周期
在maven中存在“三套”生命周期,每一套生命周期相互独立,互不影响;在一套生命周期内,执行后面的命令前面操作会自动执行。
1、CleanLifeCycle:清理生命周期
- 命令:clean
2、defaultLifeCycle:默认生命周期
- 命令:compile,test,package,install,deploy
3、siteLifeCycle:站点生命周期
- 命令:site
实例
新建maven_p_demo2项目,目录结构与maven_p_demo一致。
编写maven_p_demo2\src\main\java\top\onefine\maven_p_demo2\util\Speak.java文件:
package top.onefine.maven_p_demo2.util;
import top.onefine.maven_p_demo.model.HelloWorld;
public class Speak {
public String sayHi() {
return new HelloWorld().sayHello();
}
}
编写maven_p_demo2\src\test\java\top\onefine\maven_p_demo2\util\SpeakTest.java文件:
package top.onefine.maven_p_demo2.util;
import org.junit.Test;
import org.junit.Assert;
public class SpeakTest {
@Test
public void testSayHi() {
Assert.assertEquals("Hello World!", new Speak().sayHi());
}
}
编写maven_p_demo2\pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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><!--maven的版本-->
<!--指定项目所在位置-->
<groupId>top.onefine.maven_p_demo2</groupId><!--groupId的值是项目的包名-->
<artifactId>maven02-util</artifactId><!--artifactId的值是模块名-->
<version>0.0.1SNAPSHOT</version><!--项目的版本,SNAPSHOT指这是一个快照版本-->
<!--依赖相关的包-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>top.onefine.maven_p_demo</groupId>
<artifactId>maven01-model</artifactId>
<version>0.0.1SNAPSHOT</version>
</dependency>
</dependencies>
</project>
编译Maven项目:
> cd cd maven_p_demo2
> mvn compile
结果:
> mvn compile
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for top.onefine.maven_p_demo2:maven02-util:jar:0.0.1SNAPSHOT
[WARNING] 'version' uses an unsupported snapshot version format, should be '*-SNAPSHOT' instead. @ line 10, column 14
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ---------------< top.onefine.maven_p_demo2:maven02-util >---------------
[INFO] Building maven02-util 0.0.1SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[WARNING] The POM for top.onefine.maven_p_demo:maven01-model:jar:0.0.1SNAPSHOT is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.671 s
[INFO] Finished at: 2019-04-19T20:11:11+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project maven02-util: Could not resolve dependencies for project top.onefine.maven_p_demo2:maven02-util:jar:0.0.1SNAPSHOT: Could not find artifact top.onefine.maven_p_demo:maven01-model:jar:0.0.1SNAPSHOT -> [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_p_demo项目,将项目打包之后的jar包发布到本地仓库中:
> mvn install
重新编译maven_p_demo2,结果:
> mvn compile
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for top.onefine.maven_p_demo2:maven02-util:jar:0.0.1SNAPSHOT
[WARNING] 'version' uses an unsupported snapshot version format, should be '*-SNAPSHOT' instead. @ line 10, column 14
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ---------------< top.onefine.maven_p_demo2:maven02-util >---------------
[INFO] Building maven02-util 0.0.1SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven02-util ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\maven\project\maven_p_demo2\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven02-util ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[INFO] Compiling 1 source file to D:\maven\project\maven_p_demo2\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.149 s
[INFO] Finished at: 2019-04-19T20:18:25+08:00
[INFO] ------------------------------------------------------------------------
>
成功!
查找顺序:本地仓库(包括私服) > 远程中央仓库
概念模型
两个核心:
依赖管理:对jar包管理
项目构建:通过命令进行项目构建
五、配置Maven本地仓库
1.仓库类型:本地仓库、私服、中央仓库
2. 配置本地仓库
仓库位置:Maven从远程仓库中下载的构件默认存放在当前用户目录下,比如:C:\Users\username\.m2\repository
将bos_repository.zip
包解压到适当的位置(比如D:\maven
下面)。
更改仓库默认位置,让maven程序知道仓库在哪:找到Maven解压位置(比如D:\maven
),找到D:\maven\apache-maven-3.6.1\conf\settings.xml
文件,打开,找到下面一行,复制到注释之外:
在注释下面配置本地仓库路径:
<localRepository>D:/maven/bos_repository</localRepository>
注:
D:\maven\bos_repository
是bos_repository.zip
包解压的路径- 关于jar包仓库压缩包
bos_repository.zip
,需要的留下邮箱
同时,将settings.xml文件拷贝一份到D:\maven\bos_repository目录下,这样当Maven版本更新之后就不用再重新配置settings.xml文件了。
3.镜像仓库
一旦配置了镜像仓库,所有针对原仓库的访问都会转向镜像仓库,原仓库将不能够再直接访问。
修改镜像仓库位置:
apache-maven-3.6.1\conf\settings.xml文件<mirrors>
标签中新建:
<mirror>
<id>maven.aliyun.com</id> <!--镜像仓库的id-->
<mirrorOf>central</mirrorOf> <!--表示为哪个仓库配置镜像,默认的中央仓库的名称就叫central,这里也可以使用 * 匹配所有的镜像-->
<name>central mirror in china.</name>
<url>https://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
六、Maven自动创建目录骨架 - archetype插件
archetype插件用于创建符合maven规定的目录骨架。
创建目录的两种方式:
1、按照提示进行选择
> mkdir maven_p_demo3
> cd maven_p_demo3
maven_p_demo3> mvn archetype:generate
2、一次性设置完所有的属性
maven_p_demo3> mvn archetype:generate
-DgroupId=top.onefine.maven04 # groupId是组织名称,通常是公司网址的反写+项目名
-DartifactId=maven04-demo # 当前Maven项目在组织中的唯一标识,通常是项目名+模块名
-Dversion=1.0.0SNAPSHOP # 版本号
-Dpackage=top.onefine.maven04.demo # 代码所存在的包
解决Maven构建项目速度太慢的解决办法
参考: https://blog.csdn.net/codercaicai/article/details/51917522
原因:所有archetype构建信息,maven通过archetype插件构建项目骨架时会远程访问页面。
保存archetype-catalog.xml本地:
$ curl http://repo1.maven.org/maven2/archetype-catalog.xml > archetype-catalog.xml
将下载的archetype-catalog.xml
文件放置到maven的默认路径下,这个路径是mvn运行时默认的存放repository的路径,具体路径在maven安装目录/config/settings.xml
中有配置,第一个框是默认位置,第二个是配置过的本地仓库的位置:
然后在构建时,在archetype:generate后加上 -DarchetypeCatalog=local参数,如:
maven_p_demo3> mvn archetype:generate -DarchetypeCatalog=local
一个栗子:
maven_p_demo3> mvn archetype:generate
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
# ...省略
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1349: # ...手动回车
Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
7: 1.3
8: 1.4
Choose a number: 8: 8
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.4/maven-archetype-quickstart-1.4.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.4/maven-archetype-quickstart-1.4.pom (1.6 kB at 3.1 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-bundles/1.4/maven-archetype-bundles-1.4.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-bundles/1.4/maven-archetype-bundles-1.4.pom (4.5 kB at 9.3 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/33/maven-parent-33.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/33/maven-parent-33.pom (44 kB at 86 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/apache/21/apache-21.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/apache/21/apache-21.pom (17 kB at 36 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.4/maven-archetype-quickstart-1.4.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.4/maven-archetype-quickstart-1.4.jar (7.1 kB at 14 kB/s)
Define value for property 'groupId': top.onefine.maven03
Define value for property 'artifactId': maven03-service
Define value for property 'version' 1.0-SNAPSHOT: : 1.0.0SNAPSHOT
Define value for property 'package' top.onefine.maven03: : top.onefine.maven03.service
Confirm properties configuration:
groupId: top.onefine.maven03
artifactId: maven03-service
version: 1.0.0SNAPSHOT
package: top.onefine.maven03.service
Y: : y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: maven-archetype-quickstart:1.4
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: top.onefine.maven03
[INFO] Parameter: artifactId, Value: maven03-service
[INFO] Parameter: version, Value: 1.0.0SNAPSHOT
[INFO] Parameter: package, Value: top.onefine.maven03.service
[INFO] Parameter: packageInPathFormat, Value: top/onefine/maven03/service
[INFO] Parameter: package, Value: top.onefine.maven03.service
[INFO] Parameter: version, Value: 1.0.0SNAPSHOT
[INFO] Parameter: groupId, Value: top.onefine.maven03
[INFO] Parameter: artifactId, Value: maven03-service
[INFO] Project created from Archetype in dir: D:\maven\project\maven_p_demo3\maven03-service
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 05:57 min
[INFO] Finished at: 2019-04-24T20:25:09+08:00
[INFO] ------------------------------------------------------------------------
D:\maven\project\maven_p_demo3>
创建的目录结果如下:
D:\maven\project\maven_p_demo3> tree /f
D:.
└─maven03-service
│ pom.xml
│
└─src
├─main
│ └─java
│ └─top
│ └─onefine
│ └─maven03
│ └─service
│ App.java
│
└─test
└─java
└─top
└─onefine
└─maven03
└─service
AppTest.java
D:\maven\project\maven_p_demo3>
另一个栗子:
D:\maven\project\maven_p_demo3>mvn archetype:generate -DgroupId=top.onefine.maven04 -DartifactId=maven04-demo -Dversion=1.0.0SNAPSHOP -Dpackage=top.onefine.maven04.demo
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: remote -> am.ik.archetype:maven-reactjs-blank-archetype (Blank Project for React.js)
# ...省略
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1349: # ...手动回车
Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
7: 1.3
8: 1.4
Choose a number: 8: 8
[INFO] Using property: groupId = top.onefine.maven04
[INFO] Using property: artifactId = maven04-demo
[INFO] Using property: version = 1.0.0SNAPSHOP
[INFO] Using property: package = top.onefine.maven04.demo
Confirm properties configuration:
groupId: top.onefine.maven04
artifactId: maven04-demo
version: 1.0.0SNAPSHOP
package: top.onefine.maven04.demo
Y: : y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: maven-archetype-quickstart:1.4
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: top.onefine.maven04
[INFO] Parameter: artifactId, Value: maven04-demo
[INFO] Parameter: version, Value: 1.0.0SNAPSHOP
[INFO] Parameter: package, Value: top.onefine.maven04.demo
[INFO] Parameter: packageInPathFormat, Value: top/onefine/maven04/demo
[INFO] Parameter: package, Value: top.onefine.maven04.demo
[INFO] Parameter: version, Value: 1.0.0SNAPSHOP
[INFO] Parameter: groupId, Value: top.onefine.maven04
[INFO] Parameter: artifactId, Value: maven04-demo
[INFO] Project created from Archetype in dir: D:\maven\project\maven_p_demo3\maven04-demo
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 37.314 s
[INFO] Finished at: 2019-04-24T20:34:18+08:00
[INFO] ------------------------------------------------------------------------
D:\maven\project\maven_p_demo3>
两种方式创建的目录结构:
D:\maven\project\maven_p_demo3>tree /f
D:.
├─maven03-service
│ │ pom.xml
│ │
│ └─src
│ ├─main
│ │ └─java
│ │ └─top
│ │ └─onefine
│ │ └─maven03
│ │ └─service
│ │ App.java
│ │
│ └─test
│ └─java
│ └─top
│ └─onefine
│ └─maven03
│ └─service
│ AppTest.java
│
└─maven04-demo
│ pom.xml
│
└─src
├─main
│ └─java
│ └─top
│ └─onefine
│ └─maven04
│ └─demo
│ App.java
│
└─test
└─java
└─top
└─onefine
└─maven04
└─demo
AppTest.java
D:\maven\project\maven_p_demo3>
七、配置Eclipse中Maven环境
1、配置m2e插件,Eclipse一般自带maven插件
2、配置maven程序
3、配置userSetting:让Eclipse知道Maven仓库位置
修改为:
4、构建索引,提高Maven检索jar包的速度:
接着,在下方会出现Local Repositories:
右键选择构建索引:
如果不成功,尝试检查settings.xml文件配置和重试上面的步骤并刷新:
八、Maven整合Web项目——servlet和struts2
使用Maven整合servlet
Maven项目创建:
1、创建普通Maven项目或父工程
注意勾选第一个,跳过原型选择,创建Maven项目目录结构相对完整。
解释:
Group id:公司名称
Artifact id:项目名称
Version:项目版本
- SNAPSHOP:测试版本
- RELEASRS:正式版本
前三个构成坐标信息。
Packaging:项目打包方式
- jar:java project
- war:web project
- pom:父工程
项目新建完成之后报错:
1.1、web.xml
文件缺失。
在src/main/webapp文件夹创建WEB-INF目录,新建web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>maven01_helloWorld</display-name>
<servlet>
<servlet-name>validate</servlet-name>
<servlet-class>servlet.validate</servlet-class>
</servlet>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>
1.2、jdk版本默认1.5,手动配置pom.xml
指定编译版本
在pom.xml
文件中添加项目jdk编译文件:
<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>top.onefine</groupId>
<artifactId>maven01_helloWorld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<!-- 添加项目jdk编译插件 -->
<build>
<plugins>
<!-- 设置编译版本为1.8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
保存之后更新Maven项目:选中项目,右键Maven->Update Project->选中项目->OK
更改完成之后:
至此,Maven项目创建完成!
整合Servlet
在src/main/java
右击,NEW->other:
next之后,填写java package和class name信息:
然后在生成的java文件缺失servlet-api-xxx.jar包:
解决:在pom.xml
中添加依赖:
ok->保存pom.xml
文件。发现java文件不再报错。
并且看到项目已经从本地仓库中引入了jar包:
同理,在pom.xml中引入junit依赖,而不再手动添加junit的jar包:
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
jar包依赖范围
依赖范围 | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行时classpath有效 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
test | - | Y | - | Junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动 |
system | Y | Y | - | 本地的,Maven仓库之外的类库 |
添加依赖范围默认是compile
,provided
的意思是运行部署到tomcat不在需要(因为tomcat中自带这个jar包)。如果将servlet-api.jar
设置为compile,则打包后包含serlvet-api.jar
,war包部署到tomcat跟tomcat中存在servlet-api.jar
包冲突。导致运行失败。
解决:如果使用到tomcat自带jar包,将项目中依赖作用范围设置为:provided,其他可以默认。
一个栗子:更改servlet-api.jar
的依赖范围:
或者在文本模式下添加<scope>provided</scope>
:
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
这样,项目打包之后就不会包含serlvet-api.jar
。
注意:添加依赖时候,注意到tomcat目录下查找是否存在此jar包,经常使用的jar包有以下两个,一定要将依赖范围改为provided
:
Maven项目的运行调试
修改HelloMaven.java文件:
package top.onefine.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloMaven extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;chartset=utf-8");
response.getWriter().write("hello Maven!");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
运行Maven项目:
右键项目名->Run As->。。。中没有直接运行项目的命令,所以选择Maven build...
自己手动输入命令。
注意上一个选项——Maven build
是执行maven命令的历史记录
编译出错解决
中文描述:此环境中未提供编译器,你可能使用jre运行而不是jdk。
引发原因:Eclipse默认在jre上运行,maven install 编译需要jdk中的编译器,而jre中并没有
问题解决:
Window–>preferences–>Java–>Installed JREs中,重新添加jdk
参考: https://www.jianshu.com/p/1ed0ec397575
重新执行 tomcat:cat
:
执行结果:
调试Maven项目
右键项目名->Debug As->Maven build…`自己手动输入命令。
关联源码:
注意如果出现端口本占用,检查是否还有项目在运行。
加上断点:
执行http://localhost:8080/maven01_helloWorld/HelloMaven
:
至此,断点已经切入进来。
整合Struts2
新建项目和整合servlet一样,关于web.xml文件也可以通过工具来生成:
选中项目右键->Java EE Tools->Generate Deployment Descriptor Stub,生成的文件如下:
关于插件的添加也可以通过工具来生成:
pom.xml视图中右键->Maven->Add Plugin,后面的操作如图:
然后就会自动生成插件配置:
但是插件的详细信息得自己添加:
<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>top.onefine</groupId>
<artifactId>maven02_struts2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<!-- 设置插件详细信息 -->
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置完成后更新项目:
选中项目右键->Maven->Update Project->选择项目名称。
添加struts2的依赖:
pom.xml视图中右键->Maven->Add Dependency,后面的操作如图:
然后可以查看到struts core的所有依赖也给添加进来了:
创建struts.xml
文件:
快捷键Ctrl+Shift+R(或者Navigate->Open Resource…)打开Open Resource,查找其他项目的struts.xml
文件:
我这里没有struts项目,使用我直接复制struts.xml
文件到src/main/resources下面:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
</struts>
创建一个action类:
编写action类:
package top.onefine.web.action;
import com.opensymphony.xwork2.ActionSupport;
public class CustomerAction extends ActionSupport {
public String save() throws Exception {
System.out.println("CustomerAction中的save方法被调用了");
// return super.execute(); // 返回SUCCESS
return SUCCESS;
}
}
在web.xml中配置struts2框架的核心过滤器:
<!-- 配置struts2框架的核心过滤器 -->
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:只有.action
结尾或者空白的请求(比如http://localhost:8080/index
)才会经过过滤器。
配置struts.xml
文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo" namespace="/" extends="struts-default">
<action name="customerAction_*" class="top.onefine.web.action.CustomerAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
新建index.jsp页面(webapp下):
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/html; chartset=UTF-8">
<title>主页面</title>
</head>
<body>
<h1>我是通过action的转发过来的! </h1>
</body>
</html>
然后JSP页面顶端出现“红色”的报错信息:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
。
解决:在pom.xml
中添加下面代码来下载servlet-api:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
另外,配置tomcat:
<!-- tomcat配置 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
然后更新项目!
tomcat7:run
(重点,tomcat7啊啊啊啊啊啊啊啊啊啊)启动项目,输入 http://localhost:8080/maven02_struts2/customerAction_save
附: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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>top.onefine</groupId>
<artifactId>maven02_struts2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<plugins>
<!-- 编码和编译和JDK版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<!-- 设置插件详细信息 -->
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
<!-- tomcat配置 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>9000</port>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.24</version>
</dependency>
</dependencies>
</project>