是否可以在Java Web应用程序的context.xml文件中使用SQLite数据库文件的相对路径?
目前,我有:
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/mywebapp">
<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="myusername" password="mypassword" driverClassName="org.sqlite.JDBC"
url="jdbc:sqlite://Users/me/NetBeansProjects/MyApp/web/my.db"/>
</Context>
如您所见,Resource标记的url属性当前指定了my.db的绝对路径。但是,我正在与一个小型开发团队合作开展这个项目。我们通过Subversion共享代码,目前,每当我们中的一个人更新项目时,我们都必须手动将上述路径替换为我们计算机的正确路径。
提前致谢。
更新:相对路径似乎与context.xml文件无关,而是与CATALINA_HOME相关。不幸的是,该目录(Tomcat所在的目录)位于我访问过的另一个用户的主文件夹(1)中:
(1)/ home / myprof / Tomcat / bin /
(2)/home/me/NetBeansProjects/MyApp/web/my.db
我不能在相对路径中包含/ me,因为如上所述,此项目将通过svn存储库在多台计算机上运行,并且包含项目文件的目录(2)将更改。但是,由于所有帐户都在共享虚拟网络上,因此CATALINA_HOME(1)不会更改。
另外,如何从servlet中的context.xml文件中获取数据库文件my.db的路径?
答案 0 :(得分:9)
我找到了以下使用JDBC和SQLite的示例:
对于内存访问:
jdbc:sqlite::memory:
对于相对路径:
jdbc:sqlite:relative/path.db
对于绝对路径:
jdbc:sqlite:/absolute/path.db
答案 1 :(得分:1)
但是,我想出了如何从context.xml文件中提取数据库的路径。它不漂亮,但它的工作原理。我无法弄清楚如何将context.xml文件解析为XML,因此这个丑陋的黑客会查找以“url=
”开头的行。
URL url = getServletContext().getResource("/META-INF/context.xml");
Properties props = new Properties();
props.load(url.openStream());
String strval = props.getProperty("url");
Pattern pattern = Pattern.compile("\\\W*\"(.\*)\"\\\W*");
Matcher matcher = pattern.matcher(strval);
matcher.find();
String constr = matcher.group(1);
if (constr != null)
this.jdbcConnectionString = constr;
答案 2 :(得分:1)
作为一种不同的方法:您是否尝试使用jdbc:sqlite:~/myapp.db
?此应该是运行该应用程序的每个人的计算机上的可写位置。 (虽然我已经看到了只读主页的邪恶。)
我不确定SQLite是否支持数据库URL中的~
。我知道H2会这样做,我只能推荐它作为嵌入式Java数据库。如果您不想更改数据库,您可能希望查看Tomcat是否允许在其配置文件中进行某些参数替换,例如${user.home}
。 (一些初步的谷歌搜索给我的邮件列表结果似乎暗示至少是server.xml
的情况,所以值得尝试它。)
我仍然不确定你想要实现的目标:你是运行Tomcat实例的那个,还是在某个系统帐户下运行的共享tomcat实例?
您还可以尝试在网络上设置另一个世界可写位置以将数据库放入。可能位于/var/
下的某个位置,或者只是在一个人的主目录中设置为ug=rwx
的文件夹
答案 3 :(得分:0)
我遇到了与Spring和jdbc.properties相同的问题我通过删除//并写入相对路径来解决这个问题
试试这个
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/mywebapp">
<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="myusername" password="mypassword" driverClassName="org.sqlite.JDBC"
url="jdbc:sqlite:web/my.db"/>
</Context>
答案 4 :(得分:0)
我找到了问题here的答案。解决方案是获取资源而不是尝试从context.xml文件中解析数据库URL。
答案 5 :(得分:0)
这个答案已经由honzas给出。我重申要说明一点(b / c我起初也不理解)。
jdbc:sqlite:relative/path.db
这对于相对路径是正确的。注意缺少一个/之前的亲戚。这使得路径绝对。你也可以用这个:
jdbc:sqlite:./relative/path.db
。指当前文件夹。