Maven
1,Maven 简介
项目构件管理工具,提供了一种简洁的方式来定义项目结构、构建过程和依赖管理。
2,常用命令
1. install 安装 jar 包
mvn install:install-file -DgroupId=org.slf4j -DartifactId=slf4j-simple -Dversion=2.0.0 -Dpackaging=jar -Dfile=D:\gaox\software\slf4j-simple-2.0.0.jar
2. 跳过测试
mvn install -DskipTests mvn install -Dmaven.test.skip=true
3,pom 文件
1,常用 pom 标签
1. packing
打包类型:pom,jar,war
- pom:父类型
- jar:内部调用或者作服务使用(默认)
- war:打包用在服务器上部署项目
父项目必须是 pom
<packaging>pom</packaging>
2. scope
在dependency标签下有一个scope标签,该标签的作用是可以设置依赖在项目的使用阶段,通常来说,项目包含:编译、运行、测试、打包这些不同的阶段
-
compile:编译依赖范围,默认值,适用于所有阶段,编译、运行、测试、打包都会包含项目中,并且会传递依赖。
-
test:测试依赖范围,只在测试时使用,不会随项目发布,比如 junit,只有在测试代码中可以使用该依赖提供的资源。
将依赖 scope 改为 test
<!--market-common--> <dependency> <groupId>org.example</groupId> <artifactId>market-common</artifactId> <scope>test</scope> </dependency>
此时正常 src/main 下的无法找到依赖中的资源
测试可以通过
- provided:已提供范围依赖,表示环境中(JDK 或者容器)会提供该支持,可以通过编译、测试阶段,打包均能通过,但是打包不会将该依赖打进 war 包,但是运行到该依赖的内容时,需要容器提供,否则会无法找到资源。例如servlet.jar,这个包在 tomcat 容器中 lib 目录已经提供了,因此打包时servlet.jar 无需包含在项目中,当然自己把 jar 包放进 tomcat 的 lib 目录中也是可以的(测试过)。以上针对 war 包,jar 包的时候不知道是不是将依赖打进了内置的容器,运行时依然会通过(测试过)。
<dependency> <groupId>org.example</groupId> <artifactId>myPackage</artifactId> <version>1.0-SNAPSHOT</version> <scope>provided</scope> </dependency>
在 idea 中,由于 provided 会导致运行需要环境提供,所以可能导致 ClassNotFoundException,需要设置一下。
-
runtime:运行时范围依赖,在运行的时候才会用到该依赖,适用运行和测试阶段,编译无法通过。典型的例子时 JDBC 驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。既然运行时也要使用 scope 设为 runtime 的依赖,所以 scope 为 runtime 的依赖在项目打部署包的时候(即构建 artifact)会被一起打包,会放在 WEB-INF/lib 目录下。用的不多,不做深究。
-
system:类似 provided,需要显式提供包含依赖的 jar 的路径(使用 systemPath 标签),Maven 不会在仓库中查找它,而是根据 systemPath 提供的路径去寻找。
当 scope=system 时候依赖不会自动打包进去,需要添加参数:
这个 scope 不推荐使用,不做深究,使用的话可以参考打包方式 2.1 项目引入第三方 jar 包和本地 jar 包
- import:这个跟上述几个不同,是和
一起用于导入 pom 配置。由于 maven 是单根继承机制,也就是只能有一个 parent 标签,而POM文件的parent标签一般都是继承spring-boot-starter-parent。当我们还想继承其他的父类或者让父类的依赖更加清晰和好管理时,可以通过 scope=import 来实现。scope=import 只能用在 dependencyManagement 里面,且仅用于 type=pom 的 dependency。它的作用就是相当于引入了某个 pom 文件,然后我们可以选择性的使用该 pom 文件下的哪个依赖
以 spring-cloud 依赖举例:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- 这里引入上面 pom 文件中的某个依赖,可以不指定版本,因为在上面import的文件中已经定义了版本号 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
Scope 总结表格:
2,pom 文件示例
1) 父 pom
<!-- 1,xml 版本 2,编码 --> <?xml version="1.0" encoding="UTF-8"?> <!-- project是pom文件的根元素 是标签:根标签,表示对当前工程进行配置、管理 --> <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"> <!-- 描述pom文件遵循从哪个版本的项目描述符 modelVersion 标签:从Maven 2 开始就固定为4.0.0 --> <modelVersion>4.0.0</modelVersion> <!-- 描述坐标信息 groupId:项目组织唯一标识 artifactId:项目唯一标识 version:版本 --> <groupId>org.example</groupId> <artifactId>market</artifactId> <version>1.0-SNAPSHOT</version> <!-- 描述信息 name:项目名称,仅是描述标识 url:链接地址 description: 描述信息 --> <name>market</name> <url>http://www.baidu.com</url> <description>管理系统</description> <!-- 子模块信息 --> <modules> <module>market-gateway</module> <module>market-config</module> </modules> <!-- 打包类型 --> <packaging>pom</packaging> <!-- 一些自定义属性,一般用来定义依赖版本,使用 ${} 引用 --> <properties> <spring-cloud.version>Hoxton.SR9</spring-cloud.version> <servlet-version>3.1.0</servlet-version> <jackson-version>2.11.1</jackson-version> <webflux-version>2.3.2.RELEASE</webflux-version> </properties> <!-- 引入的依赖 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit}</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>${springboot.version}</version> <!--依赖作用范围--> <scope>test</scope> <!-- 引入时需要排除的依赖 --> <exclusions> <exclusion> <artifactId>junit</artifactId> <groupId>junit</groupId> </exclusion> <exclusion> <artifactId>junit-jupiter-api</artifactId> <groupId>org.junit.jupiter</groupId> </exclusion> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> </dependencies> <!--声明依赖但不引入,一般在父 pom 中才有--> <dependencyManagement> <dependencies> <dependency> <groupId>org.example</groupId> <artifactId>market-common</artifactId> <version>${project.version}</version> </dependency> <!-- MySql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
2)子 pom
<?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/xsd/maven-4.0.0.xsd"> <!-- 父 pom 依赖 --> <parent> <artifactId>market</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <!--打包方式--> <packaging>war</packaging> <modelVersion>4.0.0</modelVersion> <!--定位信息默认继承父 pom--> <artifactId>market-gateway</artifactId> <properties> <failOnMissingWebXml>false</failOnMissingWebXml> </properties> <!-- 1,默认会继承父 pom 的 dependencies 标签的依赖包,当然也可以在这里覆盖掉 2,如果引用父 pom 的 dependencyManager 声明的依赖,可以忽略版本,使用父 pom 声明的版本,这样就做到版本同一管理 --> <dependencies> <!-- MySql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> </dependencies> <build> <!-- 打包插件 --> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
4. 远程仓库配置
<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url> http://maven.aliyun.com/nexus/content/groups/public </url> </mirror> <mirror> <id>ibiblio</id> <mirrorOf>central</mirrorOf> <name>ibiblio Mirror of [http://repo1.maven.org/maven2/](http://repo1.maven.org/maven2/) </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>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url> http://repo2.maven.org/maven2/ </url> </mirror> <mirror> <id>ui</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url> http://uk.maven.org/maven2/</url> </mirror>
/conf/settings.xml 文件配置远程仓库,这里修改成阿里云的。
参考文件
Maven 和 Git 学习笔记
阿里云仓库:https://developer.aliyun.com/mvn/guide
本文作者:primaryC
本文链接:https://www.cnblogs.com/cnff/p/16935964.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2023-08-07 Springboot-Cache-缓存