项目管理利器——Maven入门

版权声明:本文为 [onefine] 原创文章,转载请注明出处: https://blog.csdn.net/jiduochou963/article/details/89402828

一、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>

注:

  1. D:\maven\bos_repositorybos_repository.zip包解压的路径
  2. 关于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仓库之外的类库

添加依赖范围默认是compileprovided的意思是运行部署到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>
2、创建父工程下面的子模块

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/jiduochou963/article/details/89402828