【问题标题】:Is it possible to override persistence.xml partially in Quarkus application properties?是否可以在 Quarkus 应用程序属性中部分覆盖 persistence.xml?
【发布时间】:2021-01-19 03:43:06
【问题描述】:

我正在将 JEE / JBOSS 项目迁移到 Quarkus。

在这个项目中,我有一个由许多 EJB(SOAP 服务、REST 服务)共享的 DAO。 DAO 还定义了实体和persistence.xml,如下所示:

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/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">
    <persistence-unit name="broGmw">
        <jta-data-source>java:jboss/datasources/BroDS</jta-data-source>

        <class>x</class>
        <class>y</class>
        <!--> many more <-->

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect" />
            <property name="hibernate.show_sql" value="false" />
        </properties>
    </persistence-unit>
</persistence>

现在,我知道 quarkus 还不支持 jta 数据源。

我不想在我的 JEE 项目的每个端点 EJB 中重新定义相同的 persistence.xml。此外,从 DAO 库中删除它并不合乎逻辑,因为 persistence.xml 在逻辑上属于 DAO。

但是,Quarkus 不容忍 jta-data-source。所以我只想重新定义应用程序属性中的数据源,将 persistence.xml 留在 DAO(库)中。

quarkus.datasource.broDs.db-kind=other
quarkus.datasource.broDs.username=xxx
quarkus.datasource.broDs.password=yyy
quarkus.datasource.broDs.jdbc.url=myUrl
quarkus.datasource.broDs.jdbc.driver=${QUARKUS-BRO-DATASOURCE-DRIVER:oracle.jdbc.OracleDriver}

quarkus.hibernate-orm.broGmw.dialect=${QUARKUS-ORM-DIALECT:org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect}
quarkus.hibernate-orm.broGmw.log.sql=${QUARKUS-ORM-LOG-SQL:false}
#quarkus.hibernate-orm.broGmw.packages=... (here's where I want the content of my persistence.xml read)
quarkus.hibernate-orm.broGmw.datasource=broDs

但是,Quarkus 在找到 persistence.xml 时会立即忽略这一点

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:00 min
[INFO] Finished at: 2021-01-14T22:28:38+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.10.5.Final:build (default) on project gmw_rest_dispatch: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR]     [error]: Build step io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#build threw an exception: java.lang.UnsupportedOperationException: Value found for #getJtaDataSource : not supported yet
[ERROR]     at io.quarkus.hibernate.orm.runtime.boot.LightPersistenceXmlDescriptor.verifyIgnoredFields(LightPersistenceXmlDescriptor.java:164)
[ERROR]     at io.quarkus.hibernate.orm.runtime.boot.LightPersistenceXmlDescriptor.validateAndReadFrom(LightPersistenceXmlDescriptor.java:55)
[ERROR]     at io.quarkus.hibernate.orm.runtime.boot.QuarkusPersistenceUnitDefinition.<init>(QuarkusPersistenceUnitDefinition.java:34)

我怎样才能意识到这一点?

从依赖项中过滤persistence.xml 或许也是一种选择。我知道这在 Quarkus 的下一个版本中是可能的,但也许有一种通用机制可以从依赖项中过滤文件(类、xml)以使 Quarkus 忽略它们。

【问题讨论】:

  • 使用插件 io.quarkus:quarkus-maven-plugin:1.11.0.CR1 我添加了:-DSKIP_PARSE_PERSISTENCE_XML=true 那行不通.. 仍在寻找如何做到这一点.. ?
  • 嗯。我看了一下github.com/quarkusio/quarkus/pull/10107,似乎你真的必须使用 -D 选项运行 maven。如果你能以某种方式在插件中指定它会很好

标签: java hibernate quarkus


【解决方案1】:

SKIP_PARSE_PERSISTENCE_XML 属性必须在运行 Quarkus 应用程序时传递,而不是在构建时传递。

将其传递给quarkus-maven-plugin 将无济于事。

它需要作为 -D 属性添加到 maven 构建中,在 IDE 和 CI/CD 中可能的构建脚本中进行配置。

【讨论】:

  • 在构建过程中实际上失败了
  • 显示:我将错误日志扩展了一点
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2012-02-22
  • 2015-11-05
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
相关资源
最近更新 更多