Maven 项目编译后中无法将 resources 目录同步到 /targer/classes 目录❓

3,622 阅读4分钟

「这是我参与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> 类型

项目的打包方式有三种:

  • jar
  • war
  • pom

项目中一般使用 maven 进行模块管理,每个模块下对应都有一个 pom.xml 文件,pom.xml 文件中维护了各模块之间的依赖和继承关系。项目模块化可以将通用的部分抽离出来,方便重用;修改一部分代码不再是 build 整个项目,缩短了 build 时间;此外各模块都有自己的 pom.xml 文件,结构更清晰。

使用 maven 进行模块划分管理,一般都会有一个父级项目,pom.xml 文件除了 GAV (groupId, artifactId, version) 是必须要配置的,另一个重要的属性就是 packaging 打包类型,所有的父级项目的 packaging 都为 pompackaging 默认是 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 仓库中,供其他项目使用。

希望本文对你有所帮助🧠
欢迎在评论区留下你的看法🌊,我们一起讨论与分享🔥