【问题标题】:JPA2 metamodel generator does not generate models from dependency librariesJPA2 元模型生成器不从依赖库生成模型
【发布时间】:2015-05-06 17:13:05
【问题描述】:

我的 Maven 项目中有一个依赖库。该库包含 JPA2 实体。在构建过程中只生成来自根项目中实体的模型,而不是来自库实体的模型。我已经尝试过 Eclipse 链接生成器(CanonicalModelProcessor)和休眠生成器(JPAMetaModelEntityProcessor),但我找不到任何配置参数,这些参数还包括对元模型生成的项目依赖关系。我也找不到任何相关的搜索网络。我还尝试通过类标签手动命名 persistence.xml 中的持久性单元中的所有实体(包括库实体)

<class>com.example.project.domain.CustomEntity</class>

还尝试通过

开启自动发现
<exclude-unlisted-classes>false</exclude-unlisted-classes>

没有任何帮助。只是为了列出所有细节,我使用的是 Netbeans 8.0.2,项目设置为 Java 7 和 J2EE7。下面是我的两个生成器的 pom 示例。

休眠:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.2</version>
    <configuration>
        <annotationProcessors>
    <annotationProcessor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</annotationProcessor>
        </annotationProcessors>
        <debug>true</debug>
        <optimize>true</optimize>
        <source>1.7</source>
        <target>1.7</target>
        <compilerArguments>
            <AaddGeneratedAnnotation>true</AaddGeneratedAnnotation>
            <Adebug>true</Adebug>
            <endorseddirs>${endorsed.dir}</endorseddirs>
        </compilerArguments>
        <outputDirectory>${project.build.directory}/generated-sources/meta-model</outputDirectory>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jpamodelgen</artifactId>
            <version>4.3.8.Final</version>
            <optional>true</optional>
        </dependency>
    </dependencies>
</plugin>

Eclipse 链接:

<plugin>
    <groupId>org.bsc.maven</groupId>
    <artifactId>maven-processor-plugin</artifactId>
    <version>2.2.4</version>
    <executions>
        <execution>
            <id>eclipselink-jpa-metamodel</id>
            <goals>
                <goal>process</goal>
            </goals>
            <phase>generate-sources</phase>
            <configuration>
                <processors>
                    <processor>org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor</processor>
                </processors>
                <outputDirectory>${project.build.directory}/generated-sources/meta-model</outputDirectory>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
            <version>2.5.1</version>
        </dependency>
    </dependencies>
</plugin>

【问题讨论】:

  • 只是一个想法:编译器“preCompile”调用Java“AnnotationProcessor”(这些元模型生成器是IIRC的实现)。编译器将为所有“要编译”的类调用该处理器。某个单独 jar 中的任何内容都不会“被编译”,因此这些类永远不会被发送到注释处理器。

标签: java hibernate maven jpa eclipselink


【解决方案1】:

看起来尼尔斯托克顿是对的。我找到了两种可能的解决方案:

  1. 如果依赖库在您的控制之下,那么您可以将persistence.xml 添加回此依赖项项目,进行构建,让modelgen 处理器生成模型,然后删除persistence.xml 以避免在此项目所在的项目中可能出现问题用作依赖项。在 jar 组装期间使用 maven 简单地自动删除 persistence.xml 如下所示:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.6</version> <configuration> <excludes> <exclude>**/persistence.xml</exclude> </excludes> </configuration> </plugin>

  1. 在您的项目和项目依赖项中实现您自己的@Entity 注释发现,然后让模型处理器为您生成模型。由于我有幸使用了解决方案 1,因此我没有可以实现此解决方案的代码 sn-p。

【讨论】:

  • 在我们的例子中。因为我们拥有依赖项目,所以我们在那里生成代码,在安装/部署之前将编译后的元模型代码添加到 JAR。
  • @HDave 你能解释一下如何将 SMM 添加到 jar 中吗?
  • @FiruzzZ - 这是一个冗长的答案....提出一个新问题并请参考我....ty
猜你喜欢
  • 2011-09-19
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 2011-02-23
相关资源
最近更新 更多