首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FileNotFoundException :黑线莲配置,映射器

FileNotFoundException :黑线莲配置,映射器
EN

Stack Overflow用户
提问于 2016-04-21 07:09:50
回答 4查看 4K关注 0票数 0

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

编辑:

这是在src目录树下。

代码语言:javascript
运行
复制
├─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 compile的结果

代码语言:javascript
运行
复制
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下面,它有resources/mybatis的配置信息。

SqlSessionFactoryManager类中,我编写了如下代码

代码语言:javascript
运行
复制
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);
}
...

但是错误会发生。

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

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

此错误可能存在于mybatis/sql/User.xml中。 原因: org.apache.ibatis.builder.BuilderException:解析SQL配置时出错。原因: java.io.IOException:未能找到资源myb提斯/sql/User.xml

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

EN

回答 4

Stack Overflow用户

发布于 2017-09-22 08:26:53

我认为在您的project.so中使用maven,当maven项目包( mvn包或mvn编译),如果您不配置构建元素,那么maven默认的类文件只能移动到target.So,如果您想要打包*.properties *.xml *.要针对目标文件,必须配置build元素下的资源元素,例如:

代码语言:javascript
运行
复制
<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>

如果您查看该文件(mybati-config.xml)是您的路径,那么它实际上并不存在。

票数 2
EN

Stack Overflow用户

发布于 2021-04-13 18:49:36

我认为这将有助于审查Maven的工作方式。

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

现在,为了回答您的问题,mybatis配置和mapper配置文件通常被认为是代码和最终应用程序的一部分。这就是为什么它们被放置在resources文件夹中的原因,以便它们最终成为最终构建工件的一部分,并在应用程序最终部署时作为类路径的一部分。你应该通过类路径来访问它们。

下面是来自黑线莲网站的一个示例,说明如何读取mybatis的xml配置:

代码语言:javascript
运行
复制
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中将其再次配置为类路径资源。

黑线莲网站中的示例(滚动到底部):

代码语言:javascript
运行
复制
<!-- Using classpath relative resources -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

<!-- Using url fully qualified paths -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

<!-- Using mapper interface classes -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

<!-- Register all interfaces in a package as mappers -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

因此,在您的情况下,如果您只使用xml,并且从您发布的消息中添加以下内容到您的mybatis-conf.xml

代码语言:javascript
运行
复制
<mappers>
  <mapper resource="mybatis/sql/User.xml"/>
</mappers>
票数 1
EN

Stack Overflow用户

发布于 2016-06-06 15:45:36

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

代码语言:javascript
运行
复制
new SqlSessionFactoryBuilder().build(super.getClass().getClassLoader().getResourceAsStream("mybatis-conf.xml")) 

mybatis-conf.xml会在类路径上找到。如果您确实希望在main/resources/mybatis下执行此操作,则可以:

new SqlSessionFactoryBuilder().build(super.getClass().getClassLoader().getResourceAsStream("mybatis/mybatis-conf.xml"))

在运行Maven应用程序时,目标资源文件夹应该是类路径的一部分,因此不必指定资源。而且,您的User.xml应该存在于main/resources/mybatis/sql/User.xml下。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36762200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档