Maven
Maven 是一个 Java 生态用的较多的依赖管理工具,其稳定、简单易用,缺点就是如果引入的依赖较多,比较臃肿、啰嗦,和 Java 一样,哈哈哈哈。
Maven 中有 6 种 scope:
-
compile(默认)
这是默认作用域,如果未指定,则使用该 scope。编译依赖项在项目的所有类路径中都可用。此外,这些依赖项将传播到依赖项目,在编译与打包时都会加入。
-
provided
这很像 compile ,但表示您希望 JDK 或容器在运行时提供依赖项。例如,在为 Java Enterprise Edition 构建 Web 应用程序时,您需要将对 Servlet API 和相关 Java EE API 的依赖设置为范围 provided ,因为 Web 容器提供了这些类。具有此作用域的依赖项将添加到用于编译和测试的类路径中,但不添加到运行时类路径中(打包时不加入)。它不是可传递的。
-
runtime
此范围指示编译不需要依赖项,但执行程序需要依赖。Maven 在运行时和测试类路径中包含此作用域的依赖项,但不包括编译类路径。
-
test
此范围指示依赖项不是正常使用应用程序所必需的,并且仅适用于测试编译和执行阶段。此范围不是可传递的。通常,此范围用于测试库,如 JUnit 和 Mockito。它也用于非测试库,如 Apache Commons IO,这些库用于单元测试(src/test/java)但不用于代码(src/main/java)。
-
system
此作用域类似于 provided,但是需要结合 systemPath 提供显式包含它的 JAR,即而从本地文件系统获取依赖项,不会在存储库中查找。
1
2
3
4
5
6
7<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
<scope>system</scope>
<systemPath>${basedir}/lib/mysql-connector-java.jar</systemPath>
</dependency> -
import
此作用域仅支持 POM 文件中的 dependencyManagement 部分。它表示依赖关系将被指定 POM 的 dependencyManagement 部分中的有效依赖关系列表替换。
optional
可选的,可以理解为此依赖可选,如果不需要传递某项功能,可以不引用这个包。一般而言,框架的开发者使用居多,但是随着现在 Spring Boot Starter 的流行,实际项目中我们也可以使用,尤其是有扩展模块/插件机制的项目,插件模块可以使用
自己的 jar 包安装到 maven 仓库
相信很多新手在没用 maven 之前,项目目录中都会单独使用一个文件夹存放项目使用的目录。但是使用 maven 之后就不需要了,使用 maven 管理要方便许多,那么问题来了,如果有的 jar 包在下载失败或者配置的下载源中没有怎么办?
这个时候就可以自己去官网或者 jar 包作者提供的下载方式自己下载,然后使用 maven 提供的安装命令,安装到本地的 maven 仓库,然后项目中引入即可。
比如 Oracle 的 ojdbc8.jar
,这个 jar 包当时浪子使用的阿里的下载源就没下载成功。后来去 Oracle 官网下载的 jar 包,在本地安装并引用。
食用方法,把对应的 jar 包放在使用它的项目中(其实这个不是必须的啦,maven 官方文档描述中说明:在目标 jar 包的同级目录中必须要有 pom.xml
文件),然后执行以下命令:
1 | # 安装 jar 包到本地 maven 仓库 |
-Dfile:jar 包名称,这里 jar 包是在项目根路径,所以直接写
-DgroupId、-DartifactId:坐标位置
-Dversion:版本号
上面的命令执行成功以后就可以去本地 maven 仓库中根据自己写的坐标位置找到刚才安装的 jar 包啦,这时候就可以使用 maven 引入项目使用了,刚在项目中的 jar 包也可以删除了(如果没用的话)。
Maven打包
打包之前推荐先清理(clean)再打包(package)。jar 包比较简单,SpringBoot 默认打的就是 jar 包。这里说一下 war 包的打包方式方式。
-
修改打包方式,去除内嵌的 tomcat 依赖
pom.xml 1
2
3
4
5
6<packaging>war</packaging>
...
<!-- 去除内嵌的 tomcat 依赖 -->
<scope>provided</scope> -
如果整合的是 jsp,那么使用打包的插件时,打包插件必须是
1.4.2
的版本,另外,在pom文件中加入以下内容,指定 jsp 文件的打包位置:pom.xml 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25<resources>
<!-- 打包时将 jsp 文件拷贝到 META-INF 目录下 -->
<resource>
<!-- 指定 resources 插件处理那个目录下的资源文件 -->
<directory>src/main/webapp</directory>
<!-- 指定必须要放在此目录下才能被访问到 -->
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources> -
在插件中指定入口类:
1
2
3
4
5<configuration>
<fork>true</fork>
<jvmArgument>-Dfile.encoding=UTF-8</jvmArgument>
<mainClass>com.XXX.Application.class</mainClass>
</configuration> -
在启动类中,继承
SpringBootServletInitiallizer
类,重写configure()
方法进行配置:1
2
3
4
5
6public class xxxApplication extends SpringBootServletInitializer {
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(xxxApplication.class);
}
}
注意: 打成的 war 包使用外部 Tomcat 部署时,项目配置文件中配置的端口和项目名称会失效。
后台方式启动 jar 包:nohup java -jar jar包名称 &
依赖树查询
很多时候,我们可能无意中引入了一些冲突的版本,比如一个版本高,一个版本低,这时候启动的时候就会冲突,且这些依赖不是直接引入的,而是我们引入的依赖内部包含的,这样很不便于排查,因此我们可以使用下面的方式查询依赖树。
1 | # 命令行输出 |
然后我们就可以根据依赖树进行查找,并排除不想使用的依赖版本。