0

我正在开发一个使用 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'/>标签但没有成功。

提前致谢。

4

2 回答 2

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 中的属性是否正确替换。

但是,我个人不建议您这样做。此类属性是特定于环境的,不应在您的结果工件中“硬编码”。您应该考虑更新您的设计,以便您可以在运行应用程序时提供配置文件或提供命令行参数,这样您就不需要为了应对另一个环境而重新构建应用程序。

于 2013-09-25T03:01:41.683 回答
0

您希望在哪个 maven 任务中读取 pom.xml?

在执行 mvn compile 的地方?mvn 包?还是其他?

于 2013-09-25T01:19:21.387 回答