我正在开发一个使用MyBatis的示例多模块maven项目。我唯一的依赖是我自己的模块和mybatis它自己。
在我的持久层上,我在pom.xml
上创建了以下内容:
<properties>
<!-- JDBC -->
<jdbc.url>jdbc:postgresql://localhost:5432/kpi?autoReconnect=true</jdbc.url>
<jdbc.driverClassName>org.postgresql.Driver</jdbc.driverClassName>
<jdbc.username>postgres</jdbc.username>
<jdbc.password>postgres</jdbc.password>
<jdbc.initConnections>15</jdbc.initConnections>
<jdbc.maxActive>40</jdbc.maxActive>
<jdbc.maxIdle>5</jdbc.maxIdle>
</properties>
然后,在mybatis-config.xml
src/main/resources
内,我执行了以下操作:
<environments default='development'>
<environment id='development'>
<transactionManager type='JDBC'/>
<dataSource type='POOLED'>
<property name='driver' value="${jdbc.driverClassName}"/>
<property name='url' value="${jdbc.url}"/>
<property name='username' value="${jdbc.username}"/>
<property name='password' value="${jdbc.password}"/>
</dataSource>
</environment>
毕竟,当我尝试运行应用程序时,我收到以下错误:
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${jdbc.driverClassName}
但是,当我更改上面的代码时,显式地从jdbc键入信息,它可以工作:
<environments default='development'>
<environment id='development'>
<transactionManager type='JDBC'/>
<dataSource type='POOLED'>
<property name='driver' value="org.postgresql.Driver"/>
<property name='url' value="jdbc:postgresql://localhost:5432/kpi?autoReconnect=true"/>
<property name='username' value="postgres"/>
<property name='password' value="postgres"/>
</dataSource>
</environment>
</environments>
那么,是否可以使用我放在pom.xml
中的信息来使其工作?我尝试使用<properties resource='pom.xml'/>
标记,但没有成功。
提前致谢。
答案 0 :(得分:3)
首先,从技术上讲,当MyBatis运行时你不能在POM中读取属性,因为POM是编译中使用的东西,当MyBatis运行时,它已经是已经通过编译的运行时。因此从POM读取数据是不合理的(除非你的MyBatis配置是构建过程中自动化测试的一部分,但似乎不是你的情况)
您可以通过使用Maven的资源过滤机制来实现类似的效果,mybatis-config.xml
中的占位符将替换为构建过程中在Maven中定义的属性。
http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html
您的POM中可能有一些设置会停止在您的资源目录上过滤,这会导致您的问题。在构建应用程序后,请检查JAR / WAR中是否正确替换了属性。
但是,我个人不建议你这样做。这种属性是特定于环境的,不应在结果工件中“硬编码”。您应该考虑更新您的设计,以便在运行应用程序时提供配置文件或提供命令行参数,这样您就不需要再次构建应用程序来应对其他环境。
答案 1 :(得分:0)
您希望在哪个maven任务中读取pom.xml?
在你执行mvn compile的时候? mvn包?或者其他?