在Eclipse的persistence.xml中设置环境变量值

时间:2016-07-06 17:03:36

标签: java eclipse tomcat jpa

我正在使用OpenShift,我正在尝试将我的应用程序部署到本地Tomcat实例以加快开发速度。我正在使用EclipseLink进行数据库事务,我已经提供了OpenShift在persistence.xml中使用的环境变量,如下所示:

<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://${env.OPENSHIFT_MYSQL_DB_HOST}:${env.OPENSHIFT_MYSQL_DB_PORT}/mydbname"/> 
<property name="javax.persistence.jdbc.user" value="${env.OPENSHIFT_MYSQL_DB_USERNAME}"/> 
<property name="javax.persistence.jdbc.password" value="${env.OPENSHIFT_MYSQL_DB_PASSWORD}"/>

我在本地机器上使用linux,所以我也将所有这些变量值都设置为本地版本(localhost,3306等)。我已经仔细检查了它们在终端是否可用。我也试过像描述here那样提供它们 - 我在Eclipse中打开了Tomcat实例的设置,选择了“Open launch configuration”,在Arguments选项卡上,我将它们输入到VM参数中(也试过了) “变量......”菜单)。但是,它不起作用,我在PORT变量上得到NumberFormatException,我想它将原始字符串“$ {env.OPENSHIFT_MYSQL_DB_PORT}”作为端口。

(显然,它也不适用于OpenShift。)

我在哪里可以在Eclipse / Tomcat中设置这些变量值以使其有效?

提前谢谢!

3 个答案:

答案 0 :(得分:7)

在WildFly中,简单而最优雅的方法是在ee子系统中启用属性替换,如下例所示:

<subsystem xmlns="urn:jboss:domain:ee:4.0">
      <spec-descriptor-property-replacement>true</spec-descriptor-property-replacement>
      <jboss-descriptor-property-replacement>true</jboss-descriptor-property-replacement> 
. . .
</subsystem>

现在,您可以使用带有env前缀的BeanShell表达式来引用环境变量。例如:

<property name="javax.persistence.jdbc.url" value="jdbc:mysql://${env.MYSQL_DB_HOST}:${env.MYSQL_DB_PORT}/mydbname"/> 
<property name="javax.persistence.jdbc.user" value="${env.MYSQL_DB_USERNAME}"/> 
<property name="javax.persistence.jdbc.password" value="${env.MYSQL_DB_PASSWORD}"/>

此策略在诸如Openshift之类的云环境中特别有用,您可以将环境变量传递给应用程序,以便对其进行自定义。

答案 1 :(得分:2)

这是不可能的。如果你正在使用弹簧,那么可以在那里使用,但对于简单的JPA没有。你可以做的是使用程序化配置并做这样的事情Read Environment Variables in persistence.xml file

答案 2 :(得分:0)

出于测试目的或在JavaSE世界中,您可以使用此full working eclipseLink example

它从PersistenceUnitInfo实例获取persistence.xml中定义的所有属性,该实例是从EntityManagerFactory获得的(通过使用eclipseLink特定实现)。这些属性将替换为环境变量中定义的值。