【问题标题】:How to configure C3p0.properties file in a jar file's classpath to read C3P0-config.xml outside the classpath如何在 jar 文件的类路径中配置 C3p0.properties 文件以读取类路径外的 C3P0-config.xml
【发布时间】:2014-02-12 18:21:55
【问题描述】:

可能是我错误地表达了这个问题,但这就是问题所在。我有一个名为 util 的库,在 util 中我们有一个数据库类,它将使用 C3P0 进行数据库连接。这个 util 库被团队中的不同开发人员使用。

因为我们有一个模块化系统,所以为了让每个人的生活更轻松,系统中的每个模块都可以指定它自己的数据库连接和属性,因为它认为适合他们的模块。我们这样做的唯一原因是因为调用执行查询的方法都在这个库中定义,所以与其让每个人都一遍又一遍地重写相同的代码,不如使用具有该功能的共享库非常有效。

当前的设置是我的 util 库类路径中有 C3P0.properties 文件,并且在其中我定义了 C3P0-config.xml 文件的路径,如下所示。

com.mchange.v2.c3p0.cfg.xml=./conf/c3p0-config.xml

然后我构建 jar 并将其提供给其他开发人员。然后他们在他们的应用程序中创建一个 conf 目录并添加 c3p0-config.xml。 目录的结构如下所示

Parent directory - module name {

Sub directories

-lib  -> {Util.jar & other jars}

-conf -> {c3p0-config.xml & other config files}

-logs

-modulename.jar

}

在执行 jar 文件时出现错误

2014-02-12 20:50:59 INFO  MLog:124 - MLog clients using log4j logging.
2014-02-12 20:50:59 DEBUG MLog:101 - Could not find resource path text file for path '/com/mchange/v2/cfg/vmConfigResourcePaths.txt'. Skipping.
2014-02-12 20:50:59 DEBUG MLog:101 - Added paths from resource path text file at '/mchange-config-resource-paths.txt'
2014-02-12 20:50:59 DEBUG MLog:101 - Reading VM config for path list /com/mchange/v2/log/default-mchange-log.properties, /mchange-commons.properties, /c3p0.properties, hocon:/reference,/application,/c3p0,/, /mchange-log.properties, /
2014-02-12 20:50:59 DEBUG MLog:101 - The configuration file for resource identifier '/mchange-commons.properties' could not be found. Skipping.
java.io.FileNotFoundException: Resource not found at path '/mchange-commons.properties'.
    at com.mchange.v2.cfg.BasicPropertiesConfigSource.propertiesFromSource(BasicPropertiesConfigSource.java:64)
    at com.mchange.v2.cfg.BasicMultiPropertiesConfig.firstInit(BasicMultiPropertiesConfig.java:185)
    at com.mchange.v2.cfg.BasicMultiPropertiesConfig.<init>(BasicMultiPropertiesConfig.java:110)
    at com.mchange.v2.cfg.ConfigUtils.read(ConfigUtils.java:63)
    at com.mchange.v2.cfg.ConfigUtils.readVmConfig(ConfigUtils.java:115)
    at com.mchange.v2.cfg.MLogConfigSource.readVmConfig(MLogConfigSource.java:46)
    at com.mchange.v2.log.MLogConfig.refresh(MLogConfig.java:59)
    at com.mchange.v2.log.MLog.refreshConfig(MLog.java:59)
    at com.mchange.v2.log.MLog.<clinit>(MLog.java:51)
    at com.mchange.v2.naming.JavaBeanReferenceMaker.<clinit>(JavaBeanReferenceMaker.java:51)
    at com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase.<clinit>(PoolBackedDataSourceBase.java:260)
    2014-02-12 20:50:59 DEBUG MLog:101 - The configuration file for resource identifier 'hocon:/reference,/application,/c3p0,/' could not be found. Skipping.
java.io.FileNotFoundException: HOCON lib (typesafe-config) is not available. Also, no resource available at '/reference,/application,/c3p0,/' for HOCON identifier 'hocon:/reference,/application,/c3p0,/'.
    at com.mchange.v2.cfg.BasicMultiPropertiesConfig.configSource(BasicMultiPropertiesConfig.java:86)
    at com.mchange.v2.cfg.BasicMultiPropertiesConfig.firstInit(BasicMultiPropertiesConfig.java:184)
    at com.mchange.v2.cfg.BasicMultiPropertiesConfig.<init>(BasicMultiPropertiesConfig.java:110)
    at com.mchange.v2.cfg.ConfigUtils.read(ConfigUtils.java:63)
    at com.mchange.v2.cfg.ConfigUtils.readVmConfig(ConfigUtils.java:115)
    at com.mchange.v2.cfg.MLogConfigSource.readVmConfig(MLogConfigSource.java:46)
    at com.mchange.v2.log.MLogConfig.refresh(MLogConfig.java:59)
    at com.mchange.v2.log.MLog.refreshConfig(MLog.java:59)
    at com.mchange.v2.log.MLog.<clinit>(MLog.java:51)
    at com.mchange.v2.naming.JavaBeanReferenceMaker.<clinit>(JavaBeanReferenceMaker.java:51)
    at com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase.<clinit>(PoolBackedDataSourceBase.java:260)
2014-02-12 20:50:59 DEBUG MLog:101 - The configuration file for resource identifier '/mchange-log.properties' could not be found. Skipping.
java.io.FileNotFoundException: Resource not found at path '/mchange-log.properties'.
    at com.mchange.v2.cfg.BasicPropertiesConfigSource.propertiesFromSource(BasicPropertiesConfigSource.java:64)
    at com.mchange.v2.cfg.BasicMultiPropertiesConfig.firstInit(BasicMultiPropertiesConfig.java:185)
    at com.mchange.v2.cfg.BasicMultiPropertiesConfig.<init>(BasicMultiPropertiesConfig.java:110)
    at com.mchange.v2.cfg.ConfigUtils.read(ConfigUtils.java:63)
    at com.mchange.v2.cfg.ConfigUtils.readVmConfig(ConfigUtils.java:115)
    at com.mchange.v2.cfg.MLogConfigSource.readVmConfig(MLogConfigSource.java:46)
    at com.mchange.v2.log.MLogConfig.refresh(MLogConfig.java:59)
    at com.mchange.v2.log.MLog.refreshConfig(MLog.java:59)
    at com.mchange.v2.log.MLog.<clinit>(MLog.java:51)
    at com.mchange.v2.naming.JavaBeanReferenceMaker.<clinit>(JavaBeanReferenceMaker.java:51)
    at com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase.<clinit>(PoolBackedDataSourceBase.java:260)

可能是什么问题?我做错了什么?

【问题讨论】:

    标签: java c3p0


    【解决方案1】:

    在您显示的日志消息和堆栈跟踪中,没有任何问题。这些都是DEBUG 级别的消息。 (c3p0 & com.mchange 库通常应该记录在INFO。)

    c3p0 & mchange-commons-java 在很多不同的地方检查潜在的配置信息。在其中许多地方,他们一无所获,因此继续前进。登录DEBUG,您正在查看库在CLASSPATH 中检查的过程,例如/mchange-log.properties,但未能找到它。在DEBUG,图书馆记录了他们查看的、未找到的以及伴随未找到的异常。

    这些都不是问题。这是正常的。

    主要问题是用户输入c3p0-config.xml 是否正在接受。您正在使用文件的相对目录,而不是绝对文件系统位置。我认为这会起作用,相对于进程的工作目录进行解释,但我不确定它是否会起作用,即使它起作用,你确定它不会脆弱,取决于用户如何启动您的流程?用户会运行一个脚本来确保正确的工作目录吗?

    【讨论】:

    • 理想情况下,它应该与相对目录一起工作,但事实并非如此。它只显示此调试日志,并不会创建连接池。要回答您的问题,是的,有一个已定义的脚本来确保工作目录不会更改。事实上,我上面提到的结构是静态的,不会改变。设计团队已经同意
    • 我认为最好的办法是在脚本中将预期 c3p0-config.xml 的绝对路径设置为系统属性,即当您从您的启动 JVM 时设置为 -Dcom.mchange.v2.c3p0.cfg.xml=${APP_HOME}/conf/c3p0-config.xml脚本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多