Loading...

问题场景

这是一则关于我恶臭同事踩的坑:
风控需要启用新的项目来适配最新框架,依赖从JDemo中迁移。而JDemo结构如下:

│ pom.xml │ ├─jdemo-api │ │ pom.xml │ │ │ └─src.main.java.cn.taqu.demo.api // 空模板 │ └─jdemo-provider │ pom.xml │ ├─src.main.java.cn.taqu.demo // 具体Demo样例 │ │ │ │ │ └─resources │ │ │ application-dev.yml │ │ │ application-prod.yml │ │ │ application-test.yml │ │ │ application.yml │ │ │ logback-spring.xml │ │ │ │ │ ├─mapper │ │ │ │ │ └─templates │ │ ├─common │ │ ├─error │ │ ├─index │ │ └─jpa │ │ │ └─test.java.cn.taqu.demo // 测试Demo │ └─target
<project ...> <parent> <groupId>cn.taqu</groupId> <artifactId>xy-framework</artifactId> <version>3.0.14-SNAPSHOT</version> </parent> <artifactId>jdemo</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <modelVersion>4.0.0</modelVersion> <modules> <module>jdemo-api</module> <module>jdemo-provider</module> </modules> <properties> <java.version>1.8</java.version> <project.encoding>UTF-8</project.encoding> <kafka.version>2.3.0</kafka.version> <xy.framework.version>3.0.14-SNAPSHOT</xy.framework.version> </properties> <dependencyManagement> <dependencies> ... </dependencies> </dependencyManagement> <build> <plugins> ... </plugins> </build> </project>
<project ...> <parent> <groupId>cn.taqu</groupId> <artifactId>jdemo</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <artifactId>jdemo-provider</artifactId> <modelVersion>4.0.0</modelVersion> <dependencies> ... </dependencies> <build> <finalName>jdemo</finalName> <plugins> ... </plugins> </build> </project>

其中最外围的 pom.xml作为父工程(或者叫聚合工程)打包成 pom类型并定义了项目中需要的依赖和版本,用来做jar包的版本控制。而具体项目的开发和运行只是其 jdemo-provider子模块,它所使用的正是父工程这个‘jar’。
子模块没有定义 packaging所以默认为 jar形式,因而 recourses静态资源也能被打包。(注意这里的target是在 jdemo-provider模块下)

而新项目则没有做模块化,所以直接copy了这两份 pom.xml带上了 pom的打包类型,所以 recourses下的所有静态资源都没有被打包,导致启动失败。

解决方案

<packaging>jar</packaging>

原理分析

  1. pom工程:用在父级工程或聚合工程中。用来做jar包的版本控制。
  2. war工程:将会打包成war,发布在服务器上的工程,如网站或服务。所以service通常打包成war包。
  3. jar工程:将会打包成jar用作jar包使用。maven通过install将本地工程打包成jar包,放入到本地仓库中,再通过pom.xml配置依赖引入到当前工程。

具体看这里:maven的三种工程pom、jar、war的区别

Last modification:August 22, 2022
喵ฅฅ