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

j8yoct9x  于 2022-10-30  发布在  Java
关注(0)|答案(4)|浏览(202)

我正在使用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示例的设置,选择“打开启动配置”,并在Arguments选项卡上,我已经将它们输入到VM参数中(也尝试了“Variables...”菜单)。但是,它不起作用,并且我在PORT变量上收到NumberFormatException,我猜它将原始字符串“${env.OPENSHIFT_MYSQL_DB_PORT}”作为端口。
(显然,它在OpenShift上也不起作用。)
在Eclipse/Tomcat中,我可以在哪里设置这些变量值以使其正常工作?
先谢谢你!

d4so4syb

d4so4syb1#

在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)中特别有用,在云环境中,您可以将环境变量传递给您的应用程序,以便对其进行自定义。

oo7oh9g9

oo7oh9g92#

我使用的是一个简单的maven jpa项目。
您可以通过一个简单的bash脚本和使用模板文件来完成此操作

模板内容:

...
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="javax.persistence.jdbc.url" value="$DB_URL"/>
<property name="javax.persistence.jdbc.user" value="$DB_USR"/>
<property name="javax.persistence.jdbc.password" value="$DB_PASS"/>
...

bash脚本:

XML_TMP=./src/main/resources/META-INF/persistence.temp.xml
XML_OUT=./src/main/resources/META-INF/persistence.xml

export DB_URL="jdbc:postgresql://localhost:5434/my_db"
export DB_USR="admin"
export DB_PASS="mystrongpass"

envsubst "`printf '${%s} ' $(sh -c "env|cut -d'=' -f1")`" < $XML_TMP > $XML_OUT

请注意,env var也可以是系统值,您不必将其包含在文件中
运行脚本,然后执行以下操作:

mvn clean package
dojqjjoe

dojqjjoe3#

这是不可能的。如果你使用的是spring,这是可能的,但是对于简单的JPA,这是不可能的。你可以做的是使用编程配置,并做一些类似于Read Environment Variables in persistence.xml file这篇文章中描述的事情

e0bqpujr

e0bqpujr4#

出于测试目的或在JavaSE世界中,您可以使用full working eclipseLink example
它从PersistenceUnitInfo示例中获取persistence.xml中定义的所有属性,该示例是从EntityManagerFactory中获取的(通过使用eclipseLink特定实现)。这些属性将替换为环境变量中定义的值。

相关问题