【问题标题】:Not able to read environment variable in persistence.xml无法读取 persistence.xml 中的环境变量
【发布时间】:2013-06-07 07:58:08
【问题描述】:

我有一个使用 tomcat7-maven-plugin 的 Maven3 项目。我想通过 jvm 的环境变量参数设置嵌入式数据库的路径。

在 Java 方法中使用 System.getenv("myDataDir") 读取变量会返回正确的路径。 但是,当我尝试在我的 persistence.xml 中设置变量 ${myDataDir} 然后我用“mvn tomcat:run”启动 tomcat 时,我得到 FileNotFoundExceptions,因为该变量没有被实际值替换(它说例如找不到路径${myDataDir}\derby.log)

我不知道是什么原因造成的 - 是持久性提供程序 (EclipseLink) 不支持这个还是其他原因。

我的 persistence.xml 如下所示:

<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
  <persistence-unit name="myPersistence" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <properties>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:${myDataDir}/DB;create=true;upgrade=true" />
      <property name="javax.persistence.jdbc.user" value="admin" />
      <property name="javax.persistence.jdbc.password" value="password" />
      <property name="eclipselink.ddl-generation" value="create-tables" />
      <property name="eclipselink.ddl-generation.output-mode" value="both" />
      <property name="eclipselink.logging.level" value="SEVERE" />
      <property name="eclipselink.logging.file" value="${myDataDir}/derby.log" />
      <property name="eclipselink.application-location" value="${myDataDir}/dbScripts" />
    </properties>
  </persistence-unit>
</persistence>

编辑:

我忘了提到,我在 Spring 3 Framework 环境中。根据网上的例子,这个应该可以在persistence.xml中使用环境变量...

【问题讨论】:

  • 恕我直言,这需要在 eclipselink 中完成
  • 抱歉,我不明白你的意思?
  • 读取此文件的库必须插入占位符 ( ${myDataDir} )。这不是 Apache Tomcat 的角色,因为它不是它所知道的 xml 描述符的一部分!
  • 抱歉,我在上面编辑了我的问题。

标签: environment-variables eclipselink maven-3 persistence.xml maven-tomcat-plugin


【解决方案1】:

在数据库 URL 中使用 ${myDataDir} 无效,除非您的数据库支持,或者除非您在自己的构建脚本期间翻译变量。

您可以做的是向 Persistence.createEntityManagerFactory() 传递一个属性映射,其中包含您想要的 URL,您必须在运行时在代码中构建它。

【讨论】:

  • 你说“除非你的数据库支持”:但是为什么数据库要负责翻译这个变量——这不是持久性提供者的目的/任务,因为这应该是独立于数据库的吗?
猜你喜欢
  • 2012-02-08
  • 1970-01-01
  • 2019-11-21
  • 2014-08-16
  • 2019-07-16
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
相关资源
最近更新 更多