一.常用命令
#将以前编译得到的旧的 class 字节码文件删除
mvnclean
#编译,将 Java 源程序编译成 class 字节码文件
mvncompile
#测试,并生成测试报告
mvntest
#打包,动态 web工程打 war包,Java工程打 jar 包
mvnpakage
#将项目生成 jar 包放在仓库中,以便别的模块调用
mvninstall
#打成jar包,并且抛弃测试用例打包
mvncleaninstall-Dmaven.test.skip=true
#动态 web工程打 war包,Java工程打 jar 包 ,并且抛弃测试用例打包
mvncleanpakage-Dmaven.test.skip=true
## 二.下载地址
1.依赖包
http://www.mvnrepository.com/
http://mvnrepository.com/
http://findjar.com
http://sourceforge.net/
2.jar 下载
2.1.方式一
2.2.方式二
https://repo1.maven.org/maven2/
3.配置
三.依赖说明
1.dependencyManagement
- 在该元素下声明的依赖不会实际引入到模块中,只有在 dependencies 元素下同样声明了该依赖,才会引入到模块中。该元素能够约束 dependencies 下依赖的使用
- 即 dependencies 声明的依赖若未指定版本,则使用 dependencyManagement 中指定的版本,否则将覆盖 dependencyManager 中的版本
- dependencyManager 可以传递给子模块,所以在子模块中可以引用父模块 dependencyManagement 定义好的依赖
<!--在dependencyManagement 声明的依赖不会实际引入到模块中 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.5</version>
</dependency>
</dependencies>
</dependencyManagement>
如果需要使用该依赖,则应该在 dependencies 中重新声明该依赖
<!--如果需要使用,在dependencies中声明该依赖,无须指定版本-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
如果是在子类中,需要先引入父模块,再引用依赖
<!--引入父模块, parent标签可以理解为java中的继承关系-->
<parent>
<groupId>父类 groupId</groupId>
<artifactId>父类 artifactId</artifactId>
<version>父类 version</version>
</parent>
<!--如果需要使用,在dependencies中声明该依赖,无须指定版本-->
<dependencies>
<dependency>
<!--如果指定了版本号,则会覆盖父模块 dependencyManagement 定义的版本(不建议这
做,dependencyManagement的作用本来就是用来统一版本,防止依赖冲突)-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
使用 dependencyManagement 可以统一声明依赖版本,进行集中管理,避免依赖冲突
2.distributionManagement
distributionManagement 的作用是"分发构件至远程仓库":
mvn install 会将项目生成的构件安装到本地 Maven 仓库,mvn deploy 用来将项目生成的构件分发到远程 Maven 仓库。本地 Maven 仓库的构件只能供当前用户使用,在分发到远程 Maven 仓库之后,所有能访问该仓库的用户都能使用你的构件。
我们需要配置 POM 的 distributionManagement 来指定 Maven 分发构件的位置。给出 Maven 部署当前项目的构件到远程库时,关于远程库的配置。
<distributionManagement>
<repository>
<id>随便起</id>
<url>你自己maven环境下setting文件里面的私有库</url>
</repository>
<snapshotRepository>
<id>随便起t</id>
<url>你自己maven环境下setting文件里面的快照库</url>
</snapshotRepository>
</distributionManagement>
3.使用总结
- modules 中的 module 标签顺序,随意放置就好,不用按照子模块依赖顺序来设置,maven 会自动按照依赖顺序为你打包
- modules 中的 module 标签作用:modules 只能在模块的打包方式是 pom 的时候才能使用,比如 packaging 设置为 pom,modeule 标签中的名称是其他模块 artifactId 名称,无论该模块是否打包方式为 pom 模块的子模块,都是可以的;在对父模块进行 mvn clean install 的时候,所有在 module 标签中的模块都会自动按照模块之间的依赖顺序进行 mvn clean install
- 当我们从 maven 私服中下载子模块 jar 包的时候,该子模块 jar 包会去寻找用到的父模块 jar 包,主要目的是确定用到依赖的版本,所以我们把子模块 jar 包发布到 maven 仓库的时候,也一定要同步把父模块 jar 包发布到 maven 仓库,这样在下载子模块的时候才不会报错
- 发布打包方式为 pom 的父模块到 maven 仓库的时候,我们可以删除父模块的 module 标签吗,我认为是可以的,因为 module 标签的作用在上面 2 中已经说明了,所以它只和打包方式为 pom 的模块进行 mvn clean install 的时候有关,也就是说只和开发的时候 mvn clean install 有关,和其他的地方没啥关系
四.常见问题
1.maven 打包异常
1.1.问题描述
No compiler is provided in this environment. Perhaps you are running on a JRE。
1.2.添加配置
添加配置指定 maven 打包的 java 环境,可以解决问题,但是因为开发人员每个人配的不一样,这样的配置不利于团队开发,也就是治标不治本,要找到问题的根本原因
<build>
<plugins>
<plugin>
<!-- 指定maven编译的jdk版本 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<!--你的jdk地址-->
<executable>/Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home/bin/javac</executable>
</configuration>
</plugin>
</plugins>
</build>
1.3.检查配置
java --version #可以正常显示mvn --version #可以正常显示
使用 mvn -version runtime 检查 maven 的运行环境
mvn -version runtime
查看 java 的环境配置
vim ~/.bash_profile
source ~/.bash_profile
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home
PATH=$JAVA_HOME/bin:$PATH:.
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
export JAVA_HOME
export PATH
export CLASSPATH
1.4.java_home
执行下面的命令,如图,可以看到 2 个 home 目录,maven 使用的正是 JavaAppletPlugin.plugin 的 java_home,我们需要删除 JavaAppletPlugin.plugin 这个插件
/usr/libexec/java_home -V
1.5.删除插件
进入目录,需要使用 sudo 权限删除插件
cd /Library
cd Internet\ Plug-Ins
sudo rm -rf JavaAppletPlugin.plugin
检查 maven 的运行环境,和配置的 java 环境一致
mvn -version runtime
再次执行 maven 的打包命令,顺利打包.
2.jar 瘦身
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<minimizeJar>true</minimizeJar>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
3.环境配置
<profiles>
<profile>
<id>dev</id>
<properties>
<!--内部版本-->
<tag.common.version>1.0.0-SNAPSHOT</tag.common.version>
<tag.api.version>1.0.0-SNAPSHOT</tag.api.version>
<tag.provider.version>1.0.0-SNAPSHOT</tag.provider.version>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<!--内部版本-->
<tag.common.version>1.0.0-SNAPSHOT</tag.common.version>
<tag.api.version>1.0.0-SNAPSHOT</tag.api.version>
<tag.provider.version>1.0.0-SNAPSHOT</tag.provider.version>
</properties>
</profile>
<profile>
<id>uat</id>
<properties>
<!--内部版本-->
<tag.common.version>1.0.0</tag.common.version>
<tag.api.version>1.0.0</tag.api.version>
<tag.provider.version>1.0.0</tag.provider.version>
</properties>
</profile>
<profile>
<id>prd</id>
<properties>
<!--内部版本-->
<tag.common.version>1.0.0</tag.common.version>
<tag.api.version>1.0.0</tag.api.version>
<tag.provider.version>1.0.0</tag.provider.version>
</properties>
</profile>
</profiles>