maven打包时, 资源文件没有被打包进来的问题

本文总结了Mybatis中三种Mapper的加载方式,包括通过resource、class和package标签,并指出在使用package加载时,需要配置pom.xml以包含src/main/java下的XML文件。当mapper接口和XML文件在src/main/java下时,不正确配置会导致调用接口报错。解决方案是在maven的build标签内添加resources资源配置,确保打包时同时包含java源码和resources目录下的文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题起因
我们系统使用Mybatis作为持久层框架,这里不详细描述Mybatis框架的使用方法,我们讲述三种加载mapper的方式总结:

  1. <mapper resource="" />加载普通的xml文件,传入xml的相对路径(相对于类路径)
  2. <mapper class="" />使用mapper接口的全限定名来加载,若mapper接口采用注解方式,则不需要xml;若mapper接口没有采用注解方式,则mapper接口和xml文件的名称要相同,且在同一个目录
  3. <package name="" />扫描指定包下的所有mapper,若mapper接口采用注解方式,则不需要xml;若mapper接口没有采用注解方式,则mapper接口和xml文件的名称要相同,且在同一目录。

使用第三种方式时,这样就会自动加载com.yogurt.mapper包下的所有mapper,这种方式需要将mapper接口文件和mapper.xml文件都放在com.yogurt.mapper包下,且接口文件和xml文件的文件名要一致注意,在IDEA的maven开发环境下,maven中还需配置<resources>标签,否则maven打包不会将java源码目录下的xml文件打包进去,怎么配置?请继续看下去。

<mappers>
    <package name="com.yogurt.mapper"/>
</mappers>

此时会存在两种情况:

  1. 将mapper.xml文件配置在src/main/resources下
  2. 将mapper.xml文件配置在src/main/java目录下。注意,因为src/main/java被设定为了源码目录,默认只会将其中的Java文件进行编译打包。

问题出现

上述第二种方式,在调用接口报错如下

image-20200527205657457

 解决方案

解决方案呢?当然有,手动将src/main/resources也添加到配置就可以了。按如下的pom.xml配置,maven打包时,既能包含src/main/java下的XML文件,也能包含资源目录src/main/resources)下面的资源文件

<build>
    <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*</include>
                </includes>
            </resource>
        </resources>
</build>

看都看到这里了,给个赞吧~

<think>好的,我现在需要回答用户关于Maven打包如何附带文件问题。首先,我得回想一下Maven的基本结构和打包机制。Maven默认的打包行为是将src/main/resources目录下的资源文件复制到生成的JAR或WAR包中,但用户可能需要包含其他目录下的文件,或者有特定的资源需要包含进来。 首先,我应该考虑用户可能需要将哪些类型的文件包含进包中。例如配置文件、静态资源、数据文件等。然后,用户可能不知道如何在pom.xml中配置资源目录,或者需要包含非标准目录下的文件。 接下来,我需要回忆Maven的资源插件配置方式。在pom.xml的<build>部分,可以通过<resources>和<resource>标签来指定额外的资源目录。每个<resource>可以指定目录路径和包含/排除的文件模式。例如,添加一个额外的资源目录src/extra-resources,并包含其中的所有.properties文件。 然后,用户可能需要将文件包含到特定的输出路径下,比如类路径下的某个子目录。这候需要配置<targetPath>,例如将文件放到config目录下,这样在JAR包中就会存在config/目录及其中的文件。 另外,用户可能需要处理测试资源,这候要配置<testResources>部分,类似主资源的处理方式,但影响的是测试阶段的资源。 还有,用户可能想要在打包包含其他目录下的文件,比如项目根目录下的某个文件。这候需要正确设置<directory>路径,并且可能需要使用通配符来匹配文件。例如,将根目录下的LICENSE文件包含到META-INF目录下。 此外,Maven Assembly插件和Maven Shade插件是处理更复杂打包需求的工具。例如,Assembly插件可以生成包含依赖、模块和其他文件的发布包,而Shade插件则用于创建可执行的uber JAR,并处理依赖冲突。需要简要介绍这两个插件的用途,并给出基本配置示例。 还要注意,用户可能会遇到资源过滤的问题,即替换资源文件中的变量。这需要启用资源过滤,并在<resource>中设置<filtering>为true,同定义相应的属性。 最后,需要总结一下常见的配置步骤,并提醒用户根据具体需求选择合适的插件和配置方式。确保回答结构清晰,分步骤说明,每个部分都有示例配置,方便用户理解和应用。</think>在Maven打包附带额外文件,可通过以下步骤实现: --- ### 一、默认资源目录 Maven默认会将`src/main/resources`目录下的所有文件自动打包到最终产物中(JAR/WAR包路径为`/`根目录)。 ```text 项目结构 ├── src │ └── main │ ├── java │ └── resources # 默认资源目录 ``` --- ### 二、添加额外资源目录 如果需包含其他目录(如`src/extra-resources`)中的文件: ```xml <build> <resources> <!-- 默认资源目录 --> <resource> <directory>src/main/resources</directory> </resource> <!-- 新增资源目录 --> <resource> <directory>src/extra-resources</directory> <includes> <include>**/*.properties</include> <!-- 仅包含.properties文件 --> </includes> <excludes> <exclude>test-*.properties</exclude> <!-- 排除测试文件 --> </excludes> <targetPath>config</targetPath> <!-- 输出到JAR包内的config目录 --> </resource> </resources> </build> ``` --- ### 三、包含非资源目录文件 将`src/main/java`中的`.txt`文件打包到类路径: ```xml <resource> <directory>src/main/java</directory> <includes> <include>**/*.txt</include> </includes> </resource> ``` --- ### 四、包含根目录文件 将项目根目录下的`LICENSE`文件打包到`META-INF`目录: ```xml <resource> <directory>${project.basedir}</directory> <includes> <include>LICENSE</include> </includes> <targetPath>META-INF</targetPath> </resource> ``` --- ### 五、处理测试资源 配置`src/test/extra-resources`中的测试资源: ```xml <testResources> <testResource> <directory>src/test/extra-resources</directory> </testResource> </testResources> ``` --- ### 六、高级打包需求 #### 1. Maven Assembly插件 生成包含依赖、脚本和配置的完整发布包: ```xml <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.Main</mainClass> </manifest> </archive> </configuration> </plugin> ``` 执行命令: ```bash mvn clean package assembly:single ``` #### 2. Maven Shade插件 创建包含依赖的Uber JAR: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.example.Main</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> ``` --- ### 七、资源过滤 启用变量替换(如`${project.version}`): ```xml <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <!-- 开启过滤 --> </resource> ``` --- ### 常见问题排查 1. **文件打包** ➔ 检查`<directory>`路径是否正确 2. **路径错误** ➔ 确认`<targetPath>`是否符合预期 3. **过滤失效** ➔ 确保`<filtering>true</filtering>`已配置 根据具体需求选择合适的配置方式即可实现灵活的文件打包
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颓了呀

收到你温暖的礼物,超开心,感激

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值