如何在 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.db
、jdbc:sqlite:WebContent:resources:app2.db
、jdbc:sqlite:/resources/app2.db
等)。我已经看到建议我将它专门绑定到 tomcat 的部署目录位置的答案,但我真的不希望该位置依赖于 WAR 之外的任何内容。
有没有人有一个数据源映射(包括 jdbc URI 字符串)的工作示例(使用 XML 配置作为 Spring applicationContext 中的数据源),以及相应的pom.xml maven-war-plugin
规范(如果适用)来实现让项目工作的解决方案与项目一起存储在其 WAR 中的 SQLite .db
文件?
提前致谢。
--EDIT(针对 cmets 的附加澄清信息)--
我可以通过此目录(或通过 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 <project>/src/main/resources/my.db
中,它会被打包在/my.war/WEB-INF/classes/my.db
here 中。
【讨论】:
感谢您的回复,杰罗德。我还可以通过此目录(或通过 maven-war-plugin 规范中的解决方法资源映射通过 WebApps 子目录中的某些内容)将 .db 放入 WAR 的类子目录中,但这不是主要问题。有关详细信息,请参阅我的编辑(我在此处限制内容长度)。另外,我的点赞还没有注册,因为我的声望还不够高。以上是关于如何在 Spring Maven WAR 中指定 SQLite db 文件的位置的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 应用程序未连接到 Mongodb 的 application.property 中指定的数据库
如何使用 spring 的 jdbcTemplate 在 SQL 查询中指定参数
如何在 Spring/Spring Boot pom.xml 中指定 Java 版本?