问题场景

这是一则关于我恶臭同事踩的坑:
风控需要启用新的项目来适配最新框架,依赖从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:September 8th, 2021 at 10:11 am
喵ฅฅ