Maven

2022-10-25 15:56:49 浏览数 (1)

一、基本概念

  1. 作用 依赖管理 一键构建(自身集成tomcat插件)
  2. 结构(约定优于配置) 项目目录:/ 用于maven的配置文件:pom.xml 源代码目录:/src 工程源代码目录:/src/main 核心代码:/src/main/java 配置文件:/src/main/resources 测试代码:/src/test/java 测试配置文件:/src/test/resources 页面资源:/src/main/webapp 输出目录:/target 编译之后的class文件:/target/classes
  3. 仓库 依据:maven工程,jar包坐标 本地仓库(local)、远程仓库(b2b,私服,局域网)、中央仓库(central,英特网)

二、常用命令

  1. mvn clean 删除编译的项目
  2. mvn compile 编译项目,放置在target目录下(有classes)
  3. mvn test 编译项目,包含test
  4. mvn package 执行test命令,并根据packageing配置打出相应的格式。
  5. mvn install 执行package命令,并把项目包放进本地仓库中。
  6. mvn deploy

三、生命周期

默认生命周期:编译(compile)、测试(test)、打包(package)、安装(install)、发布(deploy) 清理生命周期:清除编译信息(clean) 站点生命周期:

四、概念模型

  1. 项目对象模型(POM) 项目自身信息、运行时所依赖的jar包信息、运行环境信息(jdk、tomcatt)
  2. 依赖管理模型(依赖管理) jar包坐标:公司组织名称(groupId)、项目名(artifactId)、版本号(version,开发中的项目可以加上“SNAPSHOT”标记,LATEST指某个构建的最新发布,RELEASE指最后一个发布版)

packing:项目的类型,默认为jar,描述了项目打包后的输出。 classifier:不常用,分类器,生成两个单独的构件。

  1. 生命周期(一键构建) 每一个构建项目的命令都对应了maven底层的一个插件。

五、常见问题

1. 未联网时可以从本地已下载仓库中找资源:

VM Option:-DarchetypeCatalog=internal

2. Jar包冲突

代码语言:javascript复制
常见报错:
Caused by:java.lang.NoSuchMethodError
Caused by: java.lang.ClassNotFoundException

Maven默认处理策略:最短路径优先,相同则最先声明优先。 方法一: Maven Helper插件中的Dependency Analyzer可以分析冲突的jar包,找到标红jar包execute即可。mvn dependency:tree命令。 方法二:

代码语言:javascript复制
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.3.1</version>
    <exclusions>
        <exclusion>
            <groupId>jline</groupId>
            <artifactId>jline</artifactId>
        </exclusion>
    </exclusions>
</dependency>

方法三: 版本锁定原则,一般用在继承项目的父项目中,统一定义jar包版本。

方法四: 某些场景可以使用scope来避免。

代码语言:javascript复制
<!-->provied仅在编译时使用<-->
<scope>***</scope>

1.compile
默认,参与整个默认生命周期。
2.test
进参与测试代码编译,如junit。
3.runtime
无需参与项目的编译,不过后期的测试和运行周期需要其参与,类似compile除去编译阶段。
4.provided
不好含打包环境,类似compile除去打包阶段。一般其他地方会提供,只是避免编译时jar包错误。
5.system
类似provided,依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用。

3. 修改运行环境

代码语言:javascript复制
<build>
	<plugins>
		<plugin>
			<gorupId>org.apache.tomcat.maven</gorupId>
			<artifactId>tomcat7-maven-plugin</artifactId>
			<version>2.2</version>
			<configuration>
				<port>8888</port>
			</configuration>
		</plugin>
		<plugin>
			<gorupId>org.apache.maven.maven</gorupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>2.2</version>
			<configuration>
				<!-->jdk版本<-->
				<target>1.8</target>
				<!-->classes文件版本<-->
				<source>1.8</source>
				<encoding>UTF-8</encoding>
			</configuration>
		</plugin>
	</plugins>
</build>

4. sql使用

数据驱动、链接数据库的地址、数据库用户名称、数据库密码

5. 配置文件修改

代码语言:javascript复制
<localRepository>/Path/to/local/repo</localRepository>

<mirror>
   <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
</mirror>
<mirror>
    <id>alimaven</id>
    <mirrorOf>central</mirrorOf>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>

<mirror>
    <id>ibiblio</id>
    <mirrorOf>central</mirrorOf>
    <name>Human Readable Name for this Mirror.</name>
    <url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url>
</mirror>
<mirror>
    <id>jboss-public-repository-group</id>
    <mirrorOf>central</mirrorOf>
    <name>JBoss Public Repository Group</name>
    <url>http://repository.jboss.org/nexus/content/groups/public</url>
</mirror>

<mirror>
    <id>central</id>
    <name>Maven Repository Switchboard</name>
    <url>http://repo1.maven.org/maven2/</url>
    <mirrorOf>central</mirrorOf>
</mirror>
<mirror>
    <id>repo2</id>
    <mirrorOf>central</mirrorOf>
    <name>Human Readable Name for this Mirror.</name>
    <url>http://repo2.maven.org/maven2/</url>
</mirror>

六、参数介绍

1. 多项目管理

maven要求同一个工程的所有子项目都放置到同一个目录下,每一个字目录代表一个项目。 所有的子项目pom.xml都会继承父项目pom的内容,取值为子项目pom内容优先。

代码语言:javascript复制
<!-- 父项目 -->
<modules>
	<module>module1</module>
	<module>module2</module>
</modules>

<!-- 子项目 -->
<parent>
	<groupId>com.ustc.cn</groupId>
	<artifactId>module_parent</artifactId>
	<version>1.0</version>
</parent>

除了继承,maven还支持引用方式。

代码语言:javascript复制
<project>
	<description>...</description>
	...
	<dependencies>
		...
		<dependency>
			<groupId>com.ustc.cn</groupId>
			<artifactId>module3</artifactId>
			<version>1.0</version>
		</dependency>
	</dependencies>
</project>
  1. 参数 (1)groupId:必须。 (2)artifactId:必须。

(3)version 可以使用区间表达式来表示。 例如:(2.0,)表示>2.0,[2.0,3.0)表示2.0<=version<3.0;多个条件之间用逗号分隔[1,3),[5,7]。

(4)scope:作用域限制。 (5)type:一般在pom引用依赖时出现,其他时候不用。

(6)optional 是否可选依赖。maven认为程序对外部的依赖会随着所处的阶段和应用场景而变化,所以maven中的依赖关系有作用域scope的限制。scope又如下取值: 1)compile:编译范围 默认的范围,在所有的classpath中可用,同时它们也会被打包。 2)provided:已提供范围 只有在当JDK或一个容器已提供该依赖之后才使用,在编译classpath可用。 3)runtime:运行时范围 只有在运行和测试系统的时候需要,在编译的时候不需要。如:在编译时不需要JDBC API JAR,,而只有在运行时才需要JDBC驱动实现。 4)test:测试范围 在一般的编译和运行时都不需要,只有在测试编译和测试运行阶段时可用。 5)system:系统范围 和provided类似,但是必须显示的提供一个对本地系统中JAR文件的路径。即必须同时提供一个systemPath元素。

0 人点赞