「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」。
😠问题
你是否也遇到过这类情况:执行 mvn clean package 后,仍然在 target 目录下找不到 resources 编译后的文件呢?
你是否也在启动 Spring Boot 项目后,收到 FileNotFoundException: class path resource [xxx.xml] cannot be opened because it does not exist 报错信息呢?
😁解决方法
问题就出在 pom.xml 文件中!
⭐如果 maven 的 module 的 pom.xml 中 <packaging></packaging> 类型设为 pom 是不会同步 resources 目录下的资源文件到打包后的 target 目录的!
⭐打包类型为 pom 类型的项目会在项目打包时聚合其他所有子模块,比如新建一个 module 用于打包 jar 类型项目,则这个 module 的 <packaging> 设为 pom,其他的 modules 则用默认的 <packaging>jar</packaging> 打包。
如果你足够细心,在上图中可以察觉到该项目的打包方式是 pom:
关于项目模块聚合 (模块管理) 的更多内容,详见:juejin.cn/post/699103…
<!--定义该工程用于进行模块管理-->
<packaging>pom</packaging>
所以只需将打包方式更改为 jar 类型即可:
<!--项目默认的打包方式:JAR-->
<packaging>jar</packaging>
重新打包后 mvn clean package,target 目录下终于出现了编译后的 resources 目录!
🏆Maven 之 <packaging> 类型
项目的打包方式有三种:
jarwarpom
项目中一般使用 maven 进行模块管理,每个模块下对应都有一个 pom.xml 文件,pom.xml 文件中维护了各模块之间的依赖和继承关系。项目模块化可以将通用的部分抽离出来,方便重用;修改一部分代码不再是 build 整个项目,缩短了 build 时间;此外各模块都有自己的 pom.xml 文件,结构更清晰。
⭐使用 maven 进行模块划分管理,一般都会有一个父级项目,pom.xml 文件除了 GAV (groupId, artifactId, version) 是必须要配置的,另一个重要的属性就是 packaging 打包类型,所有的父级项目的 packaging 都为 pom,packaging 默认是 jar 类型,如果不作配置,maven 会将该项目打成 jar 包。
⭐作为父级项目,还有一个重要的属性,那就是 modules,通过 <modules> 标签将项目的所有子项目引用进来,在 build 父级项目时,会根据子模块的相互依赖关系整理一个 build 顺序,然后依次 build。
⭐而对于各个子项目,需要在其对应的 pom.xml 文件开头声明对父级项目的引用,通过 GAV 实现。对于子项目自己的 GAV 配置,GV 如果不配置,则会从父级项目的配置继承过来。子模块可通过 <dependencies> 标签来添加自己的依赖,此外子类项目的 packaging 值只能是 war 或者 jar,前面已经说过,packaging 默认是 jar 类型。🌹 如果是需要部署的项目,则需要打包成 war 类型(除非是 Spring Boot 项目,则可以直接打成 jar 包,因为 spring-boot-starter-web 内嵌 Tomcat);如果只是内部调用或者是作服务使用,则推荐打包成 jar 类型。
🌹/target 目录
- /out 目录存放的是该项目下所有 module 的编译结果,即一个项目仅一个 /out
- /target 存放的是单个 module 的编译结果,所以每个 module 中都包含 /target
- 如果为某个 module 指定了编译结果的路径,则不会再输出到 /out 目录下
/target 目录是默认的编译路径,用于存放项目编译后的文件;对比如下编译前/后的 src 目录与 target 目录就会明白编译后的文件存放的位置:
⭐/src/main/java 目录与 /src/main/resources 目录都被编译到 /target/classes 目录下!
⭐/src/test 目录则被编译到 /target/test-classes 目录下!
💖Maven 常用命令
在了解 /target 目录后,再联系 maven 常用的命令就可以对项目构建过程有一个较为清晰的轮廓了。
clean 命令
mvn clean:该命令用来对 Maven 项目进行清理,会清除 target 目录,相当于将项目编译后的文件删除。
compile 命令
mvn compile:该命令用来对项目进行编译,编译后就会再次生成 target 目录。
test 命令
mvn test:该命令用来进行测试,必须要编写测试类才可以,并且该测试类的类名必须是 xxxTest.java 才可以;运行该命令后会运行所有的测试。
package 命令
mvn package:该命令用来对项目进行打包。如果你的项目是一个 web 工程会打包成一个 war 包,如果是一个 Java 工程就会打成一个 jar 包。
install 命令
mvn install:如果本地多个项目使用到这个项目,则可以通过该命令将此项目打成一个 jar 包,然后发布到 Maven 仓库中,供其他项目使用。
希望本文对你有所帮助🧠
欢迎在评论区留下你的看法🌊,我们一起讨论与分享🔥