如何在 Spring Maven WAR 中指定 SQLite db 文件的位置

Posted

技术标签:

【中文标题】如何在 Spring Maven WAR 中指定 SQLite db 文件的位置【英文标题】:How to specify location of SQLite db file within Spring Maven WAR 【发布时间】:2016-04-10 07:46:08 【问题描述】:

我已经看到几个问题提出这个问题,但我没有找到一个明确的答案。

我需要将 SQLite .db 文件打包到 WAR 中,并在 WAR 或分解的 WAR 中使用该 DB 文件。

我的项目是 Spring,使用 Spring JDBC。

使用类路径中的 .db 文件可以很好地测试代码的非 Web 部分。我可以只使用对数据库运行单元测试而不会出现问题

<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="connectionInitSqls">
    <list>
        <value>PRAGMA foreign_keys = ON</value>
    </list>
</property>
<property name="driverClassName" value="org.sqlite.JDBC" />
<property name="url" value="jdbc:sqlite:app2.db" />
</bean>

当我进行部署时,只有将数据库放在WebContent/resources 目录中,我才能将其拉入 WAR 文件。我似乎无法使用备用 URI 来解决这个问题。 (例如,jdbc:sqlite::resource:app2.dbjdbc:sqlite:WebContent:resources:app2.dbjdbc:sqlite:/resources/app2.db 等)。我已经看到建议我将它专门绑定到 tomcat 的部署目录位置的答案,但我真的不希望该位置依赖于 WAR 之外的任何内容。

有没有人有一个数据源映射(包括 jdbc URI 字符串)的工作示例(使用 XML 配置作为 Spring applicationContext 中的数据源),以及相应的pom.xml maven-war-plugin 规范(如果适用)来实现让项目工作的解决方案与项目一起存储在其 WAR 中的 SQLite .db 文件?

提前致谢。

--EDIT(针对 cme​​ts 的附加澄清信息)--

我可以通过此目录(或通过 maven-war-plugin 规范中的解决方法资源映射通过 WebApps 子目录中的某些内容)将 .db 放入 WAR 的 classes 子目录中,但这不是主要的问题。

我的问题是:如何在 WAR 中通过相对 URL/URI 引用 .db。 我需要通过相对路径将 jdbc 驱动程序指向该位置,以便无论部署位置如何都可以访问它。

我在文件系统上有绝对 URL 选项(我已经在我的计算机上获得了可以使用的直接位置

或 Tomcat 中的路径,但同样,通过硬编码的 URL,或者最好的情况,与 CATALINA_BASE 绑定的 URL

<property name="url" value="jdbc:sqlite:/var/lib/tomcat7/webapps/APPNAME/WEB-INF/classes/app2db.db" />

我看到它建议我使用

<property name="url" value="jdbc:sqlite:$catalina.base/webapps/APPNAME/WEB-INF/classes/app2db.db" />

虽然这似乎不适用于我的安装(并且仍然不是最佳解决方案,因为它与周围的部署位置相关联)。

jdbc:sqlite 允许使用不使用前面的正斜杠映射相对路径,但我无法使用类似

的方式在战争中使用它
<property name="url" value="jdbc:sqlite:WEB-INF/classes/app2db.db" />

这就是我正在寻找的——相对路径映射,这样我就可以将 .db 与 WAR 一起发送出去,然后告诉某人部署到 tomcat——或任何服务器,在合理的范围内,因为我有jars 需要通过 Maven 与应用程序一起执行——(即使它们的目录结构不寻常或者它们没有映射路径变量),并且它仍然能够通过 rw 访问从爆炸内部访问数据库战争。

【问题讨论】:

(我欢迎任何解释为什么不能这样做,如果不能,因为理解这也是有用的。) 欢迎来到 ***! (您可以edit your answer 作为新用户在其中添加内容吗?) Accessing sqlite db from JDBC driver的可能重复 【参考方案1】:

当我进行部署时,只有将 db 放在 WebContent/resources 目录中,我才能将其拉入 WAR 文件中。

如果我将my.db 放在Maven's default for resources &lt;project&gt;/src/main/resources/my.db 中,它会被打包在/my.war/WEB-INF/classes/my.dbhere 中。

【讨论】:

感谢您的回复,杰罗德。我还可以通过此目录(或通过 maven-war-plugin 规范中的解决方法资源映射通过 WebApps 子目录中的某些内容)将 .db 放入 WAR 的类子目录中,但这不是主要问题。有关详细信息,请参阅我的编辑(我在此处限制内容长度)。另外,我的点赞还没有注册,因为我的声望还不够高。

以上是关于如何在 Spring Maven WAR 中指定 SQLite db 文件的位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 maven jetty 插件中指定 JDK

Spring Boot 应用程序未连接到 Mongodb 的 application.property 中指定的数据库

如何使用 spring 的 jdbcTemplate 在 SQL 查询中指定参数

如何在 Spring/Spring Boot pom.xml 中指定 Java 版本?

如何在spring data jpa查询中指定@lock超时?

如何在 Maven 中指定额外的源/资源文件夹,以便 IDE 知道它们?