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