Springboot打包jar在本地终端运行java -jar后说未找到Mybits映射文件?

新手上路,请多包涵

Springboot打包jar在本地终端运行java -jar后说未找到Mybits映射文件,

2024-06-14 17:06:50.588  INFO 29408 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to 1 default profile: "default"
2024-06-14 17:06:51.246  WARN 29408 --- [           main] o.m.s.mapper.ClassPathMapperScanner      : No MyBatis mapper was found in '[com.example.demo]' package. Please check your configuration.
2024-06-14 17:06:51.336  INFO 29408 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2024-06-14 17:06:51.358  INFO 29408 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7 ms. Found 0 JPA repository interfaces.
2024-06-14 17:06:51.491  WARN 29408 --- [           main] o.m.s.mapper.ClassPathMapperScanner      : No MyBatis mapper was found in '[com.example.demo]' package. Please check your configuration.

但是我在IDEA里面运行是没错的,这是我的项目结构:
image.png
之后我又检查了一下打包后的jar文件,发现目录demo-0.0.1-SNAPSHOT\BOOT-INF\classes\com\example\demo\demos\web的所有文件夹里面都没有我的代码Dao,Entity还有controller和service那些,只有三个其他文件,我不知道是不是全部整合进来了?image.png

之后我打开那三个文件看了一下,发现好像也不是
BasicController:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.example.demo.demos.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class BasicController {
    public BasicController() {
    }

    @RequestMapping({"/hello"})
    @ResponseBody
    public String hello(@RequestParam(name = "name",defaultValue = "unknown user") String name) {
        return "Hello " + name;
    }

    @RequestMapping({"/user"})
    @ResponseBody
    public User user() {
        User user = new User();
        user.setName("theonefx");
        user.setAge(666);
        return user;
    }

    @RequestMapping({"/save_user"})
    @ResponseBody
    public String saveUser(User u) {
        return "user will save: name=" + u.getName() + ", age=" + u.getAge();
    }

    @RequestMapping({"/html"})
    public String html() {
        return "index.html";
    }

    @ModelAttribute
    public void parseUser(@RequestParam(name = "name",defaultValue = "unknown user") String name, @RequestParam(name = "age",defaultValue = "12") Integer age, User user) {
        user.setName("zhangsan");
        user.setAge(18);
    }
}

PathVariableController:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.example.demo.demos.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class PathVariableController {
    public PathVariableController() {
    }

    @RequestMapping(
        value = {"/user/{userId}/roles/{roleId}"},
        method = {RequestMethod.GET}
    )
    @ResponseBody
    public String getLogin(@PathVariable("userId") String userId, @PathVariable("roleId") String roleId) {
        return "User Id : " + userId + " Role Id : " + roleId;
    }

    @RequestMapping(
        value = {"/javabeat/{regexp1:[a-z-]+}"},
        method = {RequestMethod.GET}
    )
    @ResponseBody
    public String getRegExp(@PathVariable("regexp1") String regexp1) {
        return "URI Part : " + regexp1;
    }
}

我的pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.1</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>provided</scope>
            <optional>true</optional>
            <version>2.7.18</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>1.18.30</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <version>2.7.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.7.18</version>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.8.1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-site-plugin</artifactId>
            <version>2.4</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.7.18</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.6.0</version>
            </plugin>
        </plugins>
    </build>
    <packaging>war</packaging>
</project>

我的application.yml:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://47.93.153.170:3306/ren?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL
    username: ren
    password: 123456789
  web:
    resources:
      static-locations: classpath:/templates/, classpath:/static/
logging:
  level:
    org.springframework.data.jpa: DEBUG
    com.zaxxer.hikari: DEBUG

我该怎么解决这个?是没有打包进来吗?还是全在另外三个文件里面了?还是我pom.xml配置有问题吗?

阅读 947
avatarAI BotBETA

根据你提供的信息和错误日志,你的Spring Boot应用在打包成JAR后运行时找不到MyBatis的映射文件。这通常是因为MyBatis在尝试扫描映射文件时没有找到预期的路径或文件。以下是一些可能的原因和解决方案:

  1. 检查映射文件的位置

    • 确保MyBatis的映射文件(.xml文件)位于正确的目录下。通常,它们应该放在与Mapper接口相同的路径下,或者在mybatis.configuration.mapperLocations配置中指定的路径下。
    • 当你运行IDEA时,可能IDE已经正确配置了资源路径,但在打包成JAR后,这些路径可能发生了变化。
  2. 检查pom.xml中的资源配置

    • 确保pom.xml中的build部分包含了正确的资源目录配置。Spring Boot Maven插件通常会自动包含src/main/resources目录下的所有资源,但如果你有特殊的需求,可能需要手动配置。
  3. 检查MyBatis配置

    • 查看你的MyBatis配置(可能是application.yml或其他配置文件),确保mapperLocations属性(或其他相关的路径配置)正确指向了映射文件的位置。
  4. 检查打包后的JAR

    • 使用jar tf your-app.jar命令来查看JAR文件的内容,确认映射文件是否确实被打包进去了。
  5. 检查MyBatis扫描路径

    • 根据你的错误日志,MyBatis尝试在com.example.demo包下扫描Mapper,但这可能不是你映射文件所在的位置。检查你的Mapper接口和映射文件是否位于同一包下,或者是否配置了正确的扫描路径。
  6. 清理和重新构建

    • 有时候,旧的构建文件或缓存可能会导致问题。尝试清理项目(例如,使用Maven的mvn clean命令)并重新构建。
  7. 检查Spring Boot版本兼容性

    • 你的pom.xml中包含了多个不同版本的Spring Boot依赖项,这可能会导致版本冲突或不一致的行为。尝试统一所有Spring Boot相关依赖的版本号。
  8. 使用Maven插件的正确版本

    • 你的pom.xmlspring-boot-maven-plugin的版本是2.6.0,而你的Spring Boot父POM版本是2.7.1。这可能会导致插件与你的Spring Boot版本不兼容。尝试将Maven插件的版本更新为与Spring Boot父POM相同的版本。

综上所述,你需要确保映射文件的位置和配置正确,并且它们确实被打包进了JAR文件中。同时,检查你的pom.xml配置和Spring Boot版本兼容性,确保没有版本冲突或不一致。最后,清理并重新构建项目,看看问题是否得到解决。

2 个回答

原因应该是和楼上说的差不多,你使用IDEA的时候把源文件夹、资源文件夹和测试文件夹搞错了,你图中代码所在文件夹(绿色标识)是测试文件夹,当然不会被打包进war包里了,这是一个正确的目录示范:
image.png
蓝色的java目录是源文件夹,要打包的代码应该写在这下面
绿色的java目录是测试文件夹,本地编译启动的时候也能正常编译运行,但是不会被打包

如何设置这些文件夹的类型?

点击文件->项目结构->模块->->点击文件夹->选择标记为xxx类型文件夹
当然你也可以选择把你测试文件夹目录下的文件直接剪切到源目录下

有几个地方可以检查一下。
1.pom文件中,packaging标签一般都是用jar,但是你是war,是要放入tomcat中吗。

2.一般IDEA的项目的源码结构应该是

src
   main
       java
       resources

正常打包后,java和resources目录中的内容应该都要被打包进入jar,你进入这个jar中,也是能看到每个文件的。

但是你图片中的好像是

src
   java
   main
       java
       resources

和main同一层的那个java目录,看颜色是个测试目录,我记的IDEA创建的项目,测试目录默认不是这种结构的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题