我正在使用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中设置这些变量值以使其有效?
提前谢谢!
答案 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特定实现)。这些属性将替换为环境变量中定义的值。