我的第一个部署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 compile
目录结果
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
置于具有mybatis配置信息的resources/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 Mapper配置时出错。原因:java.io.IOException:找不到资源mybatis / sql / User.xml
为什么getResourceAsReader
无法找到我的配置文件?
如何加载mybatis-conf.xml
相对路径?
答案 0 :(得分:2)
我认为你在项目中使用maven。因此,当maven项目包(mvn包或mvn编译)时,如果你没有配置build元素,那么maven只默认移动类文件到target.So如果你想要将* .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>
如果您查看文件(mybatis-config.xml)是您的路径,它确实不存在。
答案 1 :(得分:1)
我认为回顾 Maven 的工作原理会有所帮助。
您不应在代码中引用 target
文件夹,因为这是 maven 用来放置不同构建过程和构建最终工件的阶段的结果的文件夹,并且很可能不会出现在您的最终部署环境中。理想情况下,您不需要手动修改此文件夹。
现在回答你的问题,mybatis的配置文件和mapper配置文件一般都被认为是你的代码和最终应用的一部分。这就是它们被放置在 resources
中的 src
文件夹中的原因,因此它们最终会成为最终构建工件的一部分,并在最终部署应用程序时成为类路径的一部分。您应该通过类路径访问它们。
下面是mybatis doc website中如何读取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
中的类路径资源
来自 mybatis doc website 的示例(滚动到底部):
<!-- 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
:
<mappers>
<mapper resource="mybatis/sql/User.xml"/>
</mappers>
答案 2 :(得分:0)
如果mybatis-conf.xml
位于main / resources下,那么在您的代码中,您可以执行此操作而不用担心物理路径:
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
应该存在。
答案 3 :(得分:0)
我认为您的代码中有错误:
String resource = System.getProperty("user.dir")
+ "/target/resources/mybatis/mybatis-conf.xml";
/
应该是\
。