Java FileNotFoundException:mybatis配置,映射器

Java FileNotFoundException:mybatis配置,映射器,java,maven,mybatis,Java,Maven,Mybatis,这是我的第一个部署maven项目。 我是根据Netty和myBatis开发的 编辑: 这在src目录树下 ├─main │ ├─java │ │ └─kr │ │ └─stocktalk │ │ ├─chat │ │ │ ├─bean │ │ │ ├─client │ │ │ ├─codec │ │ │ ├─common │ │ │ └─lib │

这是我的第一个部署maven项目。 我是根据Netty和myBatis开发的

编辑:

这在
src
目录树下

├─main
│  ├─java
│  │  └─kr
│  │      └─stocktalk
│  │          ├─chat
│  │          │  ├─bean
│  │          │  ├─client
│  │          │  ├─codec
│  │          │  ├─common
│  │          │  └─lib
│  │          ├─cloudmessage
│  │          ├─db
│  │          │  ├─clients
│  │          │  └─dynamo
│  │          │      └─mappers
│  │          ├─handler
│  │          │  ├─chat
│  │          │  └─page
│  │          └─mybatis
│  │              ├─bean
│  │              ├─mapper
│  │              └─sql
│  └─resources
│      ├─error
│      ├─html
│      │  └─test
│      ├─mybatis
│      │  └─sql
│      └─snippet
└─test
    ├─java
    └─resources
这是我的
target
目录
mvn编译的结果

pom.xml
targets
├─classes
│  └─kr
│      └─stocktalk
│          ├─chat
│          │  ├─bean
│          │  ├─client
│          │  ├─codec
│          │  ├─common
│          │  ├─handler
│          │  └─lib
│          ├─cloudmessage
│          ├─db
│          │  ├─clients
│          │  └─dynamo
│          │      └─mappers
│          ├─handler
│          │  └─page
│          └─mybatis
│              ├─bean
│              ├─mapper
│              └─sql
├─generated-sources
│  └─annotations
├─resources
│  ├─error
│  ├─html
│  │  └─test
│  ├─mybatis
│  │  └─sql
│  └─snippet
└─test-classes
我想将
mybatis-conf.xml
放在
resources/mybatis
具有mybatis配置信息的下面

SqlSessionFactoryManager
类中, 我写了这样的代码

String resource = System.getProperty("user.dir") 
                + "/target/resources/mybatis/mybatis-conf.xml";
Reader reader = Resources.getResourceAsReader(resource);

if (sqlSessionFactory == null) {

    sqlSessionFactory = new SqlSessionFactoryBuilder()
                        .build(reader);
}
...
但是错误发生了

java.io.IOException:找不到资源d:\workspace\stocktalk chat/target/resources/mybatis/mybatis-conf.xml

当我试图用绝对路径加载
mybatis-conf.xml
时, 那么交一份文件就可以了,很好。好。。现在我看到了另一个问题

该错误可能存在于mybatis/sql/User.xml中
原因:org.apache.ibatis.builder.BuilderException:解析SQL映射器配置时出错。原因:java.io.IOException:找不到资源mybatis/sql/User.xml

为什么
getResourceAsReader
找不到我的配置文件?
如何使用相对路径加载
mybatis-conf.xml

如果
mybatis-conf.xml
位于main/resources下,那么在您的代码中可以这样做,而不必担心物理路径:

new SqlSessionFactoryBuilder().build(super.getClass().getClassLoader().getResourceAsStream("mybatis-conf.xml")) 
mybatis-conf.xml
将在类路径上找到。如果您确实想在
main/resources/mybatis
下使用它,您可以执行以下操作:

新建SqlSessionFactoryBuilder().build(super.getClass().getClassLoader().getResourceAsStream(“mybatis/mybatis-conf.xml”)


运行Maven应用程序时,目标资源文件夹应该是类路径的一部分,所以不需要在中指定资源。此外,您的
User.xml
应该位于
main/resources/mybatis/sql/User.xml
下,如果
mybatis-conf.xml
位于main/resources下,那么在您的代码中,您可以这样做,而不必担心物理路径:

new SqlSessionFactoryBuilder().build(super.getClass().getClassLoader().getResourceAsStream("mybatis-conf.xml")) 
mybatis-conf.xml
将在类路径上找到。如果您确实想在
main/resources/mybatis
下使用它,您可以执行以下操作:

新建SqlSessionFactoryBuilder().build(super.getClass().getClassLoader().getResourceAsStream(“mybatis/mybatis-conf.xml”)


运行Maven应用程序时,目标资源文件夹应该是类路径的一部分,所以不需要在中指定资源。另外,您的
User.xml
应该存在于
main/resources/mybatis/sql/User.xml
下,我认为您在项目中使用maven。因此,当maven项目包(mvn包或mvn编译)时,如果您不配置构建元素,然后maven只会默认地将类文件移动到目标。。。。。要将文件设置为目标,必须在build元素下配置resources元素 例如:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>

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

org.apache.maven.plugins
maven编译器插件
3.6.0
1.8
1.8
src/main/java
**/*.xml
**/*.物业

如果你看文件(mybatis config.xml)是你的路径,它实际上并不存在。

我认为你在项目中使用maven。因此,当maven项目包(mvn包或mvn编译)时,如果你不配置build元素,那么maven只会默认地将类文件移动到目标。因此,如果你想打包*.properties*.xml*。。。。。要将文件设置为目标,必须在build元素下配置resources元素 例如:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>

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

org.apache.maven.plugins
maven编译器插件
3.6.0
1.8
1.8
src/main/java
**/*.xml
**/*.物业

如果您查看文件(mybatis config.xml)就是您的路径,它实际上并不存在。

我认为您的代码中有错误:

String resource = System.getProperty("user.dir") 
            + "/target/resources/mybatis/mybatis-conf.xml";

/
应该是
\

我认为您的代码中有错误:

String resource = System.getProperty("user.dir") 
            + "/target/resources/mybatis/mybatis-conf.xml";

/
应该是
\

我认为回顾一下Maven的工作原理会有所帮助

您不应该在代码中引用
target
文件夹,因为这是maven用来放置不同构建过程的结果和构建最终工件的阶段的文件夹,并且很可能不会出现在您的最终部署环境中。理想情况下,您不需要手动修改此文件夹

现在回答您的问题,mybatis配置和映射器配置文件通常被视为代码和最终应用程序的一部分。这就是为什么它们被放置在
src
中的
resources
文件夹中,这样它们最终将成为最终构建工件的一部分,并在最终部署应用程序时成为类路径的一部分。您应该通过类路径访问它们

下面是关于如何读取mybatis的xml配置的示例:

String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
在您的情况下,第一行应该是:
String resource=“mybatis/mybatis-conf.xml”

至于映射器位置,需要在
mybatis-conf.xml

示例来自(滚动至底部):


我认为回顾一下Maven的工作原理会有所帮助

您不应该在代码中引用
target
文件夹,因为这是maven用来放置不同构建过程的结果和构建最终工件的阶段的文件夹,并且很可能不会出现在您的最终部署环境中。理想情况下,您不需要手动修改此文件夹

现在让我们来谈谈ans