maven 学习

时间:2023-01-07 20:57:21

1. 认识 maven

maven 的两个作用:

  • 依赖管理:当项目所依赖的第三方包比较多的时候,自己管理依赖就会变得越来越困难
  • 可以快捷构建项目:清理、编译、测试、报告、打包和部署

maven 安装

maven 仓库

maven 仓库分为本地仓库、远程仓库和*仓库:

  • 本地仓库:远程仓库下载的依赖包所存储的位置,本地项目直接从本地仓库获取依赖
  • 远程仓库(如阿里云):本地没有的依赖,可以去远程仓库下载,可以是互联网内也可以是局域网内
  • *仓库:maven 团队自己维护的仓库,包含了世界上大部分流行的开源项目构件
<!--conf/settings.xml 远程仓库地址设置-->
<mirror>
    <id>alimaven</id>
    <mirrorOf>central</mirrorOf>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>

maven 工程的目录结构

.settings	// 工具生成的文件
src/			// 源代码
	main/
		java/	// 放入项目的源码
		resources/	// 放入配置文件
		webapp/		// 页面素材
	test/			// 单元测试
		java/	// 测试的源码
		resources/	// 测试的配置文件
target		// 编译生成的文件,项目输出位置,编译后的 class 文件输出到此目录
.classpath
.project
.tern-project
pom.xml		// maven 工具的配置文件,如坐标信息

2. maven 命令

1、编译 compile

mvn compile 编译,将 src/main/java 下的文件编译为 class 文件输出到 target/ 目录

2、测试

mvn test 测试,执行 src/test/java 下的单元测试类

3、清理 clean

mvn clean 会删除 target 目录及内容

4、打包 package

mvn package 打包 java 工程,web 项目会打包成 war

5、安装 install

mvn install 将项目打成 jar 包或 war 包发布到本地仓库

maven 指令的生命周期

maven 对项目构建过程分为三套相互独立的生命周期:

  • Clean Lifecycle:构建之前进行清理
  • Default LifeCycle:构建的核心部分,编译、测试、打包和部署等
  • Site LifeCycle:生成项目报告,站点,发布站点

3. pom.xml 文件

pom.xml 文件可以定义项目的坐标、依赖、项目信息、插件目标等

<project></project>	<!--文件根节点-->
<modelversion></modelversion>	<!--pom.xml 使用的对象模型版本-->
<name></name>	<!--项目显示名,常用语 maven 生成的文档-->
<description></description>	<!--项目描述,常用于 maven 生成的文档-->
<build></build>	<!--项目构建配置,配置编译、运行插件等-->

<!--依赖关系,坐标都放在 dependencies 标签内-->
<dependencies>
	<dependencie>
		<groupid>junit</groupid>	<!--junit 项目名称-->
		<artifactId>junit</artifactId>	<!--junit 模块名称-->
		<version>4.9</version>	<!--依赖版本 snapshot 为快照版本非正式版,release 为正式版-->
		<scope>test</scope>		<!--依赖范围:单元测试时使用 junit-->

		<!--打包类型:jar 包、war 包-->
		<packaging>jar</packaging> 
	</dependencie>
</dependencies>

坐标来源(当不知道坐标的时候可以在以下网站搜索):

  • https://search.maven.org/
  • https://mvnrepository.com/

依赖范围 scope

A 依赖 B 需要在 A 的 pom.xml 文件中添加 B 的坐标,并且需要指定依赖范围,依赖范围包括:

  • compile:编译范围,A 在编译时依赖 B,为默认范围,会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包
  • provided:只有在 JDK 或一个容器已提供该依赖后才使用,在编译和测试时需要,运行时不需要
  • runtime:在运行和测试系统时需要,编译时不需要
  • test:编译和运行时不需要,只有在测试编译和测试运行阶段时可用
  • system:与 provided 类似,但需显示地提供一个对于本地系统中 jar 文件的路径,不推荐使用

设置 JDK 编译版本

设置编译版本为 1.8:

<build> 
	<plugins> 
		<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>

4. 常用打包插件

4.1 maven-jar-plugin

<build>
    <plugins>
 
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix> <!--指定依赖包-->
                        <mainClass>com.xxg.Main</mainClass>	<!-- main 文件-->
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.10</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
 
    </plugins>
</build>

mvn package 打包后会将依赖包拷贝到 target/lib 下,可以直接 java-jar xxx.jar 执行,但是生成的 jar 太多不便于管理,不推荐

4.2 maven-assembly-plugin

<build>
    <plugins>
 
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.5.5</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.xxg.Main</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
 
    </plugins>
</build>

打包命令:mvn package assembly:single,生成一个 target/xxx-jar-with-dependencies.jar 文件,也可以使用 mvn package 命令打包,但需要加上以下配置:

<build>
    <plugins>
 
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.5.5</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.xxg.Main</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>

			<executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
					<!--表示执行打包时,执行 assembly:single-->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
 
    </plugins>
</build>

如果项目中用到Spring Framework,用这种方式打出来的包运行时会出错

4.3 maven-shade-plugin

<build>  
    <plugins>  
  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-shade-plugin</artifactId>  
            <version>2.4.1</version>  
            <executions>  
                <execution>  
                    <phase>package</phase>  
                    <goals>  
                        <goal>shade</goal>  
                    </goals>  
                    <configuration>  
                        <transformers>  
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">  
                                <mainClass>com.xxg.Main</mainClass>  
                            </transformer>  
                        </transformers>  
                    </configuration>  
                </execution>  
            </executions>  
        </plugin>  
  
    </plugins>  
</build>  

mvn package 打包会生成两个 jar 包,一个包含依赖,另外一个不包含依赖,推荐使用

参考:Maven打包三种方法和常用命令大全