19

I would like to know how to generate static metamodels using Maven and Eclipselink 2.5. It worked fine by adding this lines to pom.xml when running Eclipselink 2.4.

// Generate meta model for eclipselink 2.4 (does not work for 2.5)
    <plugin>
                    <groupId>org.bsc.maven</groupId>
                    <artifactId>maven-processor-plugin</artifactId>
                    <version>1.3.1</version>
                    <executions>
                        <execution>
                            <id>process</id>
                            <goals>
                                <goal>process</goal>
                            </goals>
                            <phase>generate-sources</phase>
                            <configuration>
                                <compilerArguments>-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml</compilerArguments>
                                <processors>
                                    <processor>org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor</processor>
                                </processors>
                                <outputDirectory>${project.build.directory}/generated-sources/meta-model</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>

But it seems like something has changed since 2.4 cause I get following error:

[INFO] javac option: -proc:only
[INFO] javac option: -Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml
[INFO] javac option: -processor
[INFO] javac option: org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor
[INFO] javac option: -s
[INFO] javac option: /home/asdf/target/generated-sources/meta-model
[INFO] diagnostic error: Annotation processor 'org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor' not found
[INFO] diagnostic warning: Annotation processing without compilation requested but no processors were found.
[ERROR] execute error
java.lang.Exception: error during compilation
    at org.bsc.maven.plugin.processor.AbstractAnnotationProcessorMojo.executeWithExceptionsHandled(AbstractAnnotationProcessorMojo.java:183)
    at org.bsc.maven.plugin.processor.AbstractAnnotationProcessorMojo.execute(AbstractAnnotationProcessorMojo.java:96)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)

Can you guys out there help me? =)

B.R

kungcc
  • 1,832
  • 5
  • 25
  • 48

6 Answers6

22

It appears that they've moved the CanonicalModelProcessor class to it's own maven artifact:

<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
  <version>2.5.0</version>
</dependency>

The following maven-processor-plugin configuration works for me:

        <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.0</version>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
        </plugin>

Very important note: the metamodel is generated only if the entities are declared in the persistence unit. It doesn't work with discovered entities.

Martin
  • 2,573
  • 28
  • 22
dschoorl
  • 389
  • 3
  • 8
  • 1
    it does not work with 2.5.0 but with 2.5.1 is working - there is some problem with the signer information - see below the answer as well – Miklos Krivan Oct 15 '13 at 10:24
  • In eclipse, you have to specify also the build path property for the 'generated-sources' directory in order to have those generated java files recognized. Right click on project name (e.g. in navigator) > 'properties' > 'Java Build Path'. Select 'add folder' and select 'target'>'generated-sources' – Ville Myrskyneva Feb 14 '14 at 15:59
  • (+ any additional folders you may have like 'meta-model' in example above) – Ville Myrskyneva Feb 14 '14 at 16:05
  • 1
    Again, most of this is not necessary. Adding org.eclipse.persistence.jpa.modelgen.processor is enough for a maven build. As it registers org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor in META-INF/services, this is enough. Additional steps are probably needed for Eclipse. – ymajoros Jun 18 '14 at 19:26
  • 4
    The **very important note** is **false**. EclipseLink 2.5.1+ will generate metamodel classes for unlisted entities too, just specify false in persisetence.xml – Michele Mariotti Jun 21 '15 at 11:44
  • 2
    If you need to change compiler arguments, for example to change persistencexml path, add this inside configuration: `-Aeclipselink.persistencexml=${basedir}/src/main/resources/META-INF/persistence.xml` – Atais Oct 09 '15 at 10:23
5

For me using maven-compiler-plugin from org.apache.maven.plugins resulted in MojoFailureException when using other command than mvn clean install.

The tested the solutions with org.eclipse.persistence.jpa.modelgen.processor 2.6.0.

The configuration in both cases is quite similar.

The main issue which I had with org.bsc.maven was to properly configure the compilerArguments parts. That is why I post (both) the solutions below.

The documentation is available: HERE.


Solution using maven-compiler-plugin from org.bsc.maven

For me this one worked better

<plugin>
    <groupId>org.bsc.maven</groupId>
    <artifactId>maven-processor-plugin</artifactId>
    <executions>
        <execution>
            <id>eclipselink-jpa-metamodel</id>
            <goals>
                <goal>process</goal>
            </goals>
            <configuration>
                <compilerArguments>
                    -Aeclipselink.persistencexml=${basedir}/src/main/resources/META-INF/persistence.xml
                </compilerArguments>
                <processors>
                    <processor>org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor
                    </processor>
                </processors>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
            <version>${eclipselink.version}</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</plugin>

Solution using maven-compiler-plugin from org.apache.maven.plugins

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
    <version>${eclipselink.version}</version>
    <scope>compile</scope>
</dependency>

...

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <compilerArgs>
            <arg>-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml</arg>
        </compilerArgs>
    </configuration>
</plugin>
Atais
  • 10,857
  • 6
  • 71
  • 111
4

To make configuration a lot simpler I would recommend you test: https://github.com/ethlo/eclipselink-maven-plugin. You will not even be required to keep an updated persistence.xml file.

<plugin>
<groupId>com.ethlo.persistence.tools</groupId>
<artifactId>eclipselink-maven-plugin</artifactId>
<version>[version]</version>
<executions>
    <execution>
        <id>weave</id>
        <phase>process-classes</phase>
        <goals>
            <goal>weave</goal>
        </goals>
    </execution>
    <execution>
        <id>modelgen</id>
        <phase>generate-sources</phase>
        <goals>
            <goal>modelgen</goal>
        </goals>
    </execution>
</executions>
</plugin>

Note: I'm the author of the plugin.

Morten Haraldsen
  • 1,013
  • 12
  • 24
1

2017 UPDATE:

Main answer to this question is now outdated. You now need to perform the following steps in order to have it work.

1) Import the required dependency:

<!-- https://mvnrepository.com/artifact/org.eclipse.persistence/org.eclipse.persistence.jpa.modelgen.processor -->
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
    <version>2.5.2</version>
    <scope>compile</scope>
</dependency>

2) Specify persistence.xml location (this is a workaround for an EL bug. Please note that your path may vary from the one specified in this example):

<build>
  <pluginManagement>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <executions>
                <execution>
                    <id>default-compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
                [...]
            </executions>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <compilerArgs>
                    <arg>-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml</arg>
                </compilerArgs>
            </configuration>
    </plugins>
    [...]
  </pluginManagement>
  [...]
</build>

3) Finally refer to the following item in order to trigger the execution with Maven's new Lifecycle Mappings: Usage of maven Build Helper Maven Plugin

TBuc
  • 86
  • 1
  • 6
0

you're likely to get the following error:

java.lang.RuntimeException: java.lang.SecurityException: class "org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProperties"'s signer information does not match signer information of other classes in the same package

Because of the unresolved bug compilation is broken, modelgen jar is signed in maven repository, the version must be set to 2.5.0-SNAPSHOT for now.

coolnodje
  • 789
  • 1
  • 7
  • 20
-1

This is what I used

<dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>javax.persistence</artifactId>
        <version>2.1.0</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>eclipselink</artifactId>
        <version>2.5.1</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
            <version>2.5.1</version>
            <scope>provided</scope>
        </dependency>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <compilerArguments>
                    <endorseddirs>${endorsed.dir}</endorseddirs>
                </compilerArguments>
            </configuration>
            <executions>
                <execution>
                    <id>generate-entity-metamodel</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>
                            compile
                        </goal>
                    </goals>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                        <optimize>true</optimize>
                        <showDeprecation>true</showDeprecation>
                        <showWarnings>true</showWarnings>
                        <proc>only</proc>
                        <!--<compilerArgument>-Aeclipselink.metamodel=true</compilerArgument>
                        <generatedSourcesDirectory>${basedir}/src/main/java</generatedSourcesDirectory>-->
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.8</version>
            <executions>
                <execution>
                    <id>add-modelgen-generated-sources-directory</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>add-source</goal>
                    </goals>
                    <configuration>
                        <sources>
                            <source>${project.build.directory}/target/generated-sources/annotations</source>
                        </sources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

the add-sources part is for netbeans 8 to understand it to put it in classpath :)

ravshansbox
  • 748
  • 11
  • 21
Kalpesh Soni
  • 6,879
  • 2
  • 56
  • 59
  • also see http://wiki.eclipse.org/UserGuide/JPA/Using_the_Canonical_Model_Generator_(ELUG) – Kalpesh Soni Apr 11 '14 at 05:15
  • Netbeans just runs maven, so this is what you need to fix. Not required, though, just fix your build. – ymajoros Jun 18 '14 at 15:18
  • @ymajoros what do you mean? – Kalpesh Soni Jun 18 '14 at 15:30
  • add-modelgen-generated-sources-directory is not needed. Netbeans just runs maven, and has no concept of classpath outside of maven (for a maven project). This project's build needs to be fixed, something is not right and that's why netbeans is showing red labels everywhere in this project. Probably, the way this project is configured makes that sources doesn't end up in target/generated-sources as they should. Just fix that and you won't need any additional plugin. – ymajoros Jun 18 '14 at 19:11
  • thats not the only thing, I was able to use org.apache.maven.plugins instead of org.bsc.maven, thats what is the main difference from the other answers, you are looking at red herrings – Kalpesh Soni Jun 18 '14 at 20:39
  • 1
    it's just a big construction just to generate the metamodel, just adding the ~modelgen.processor dependency is enough. – ymajoros Jun 19 '14 at 06:06
  • dude, do you use netbeans? it does not add target/generated-sources/annotations by default in classpath, i specifically said the last part is not to get red errors in netbeans, why dont you give up – Kalpesh Soni Mar 12 '15 at 19:23
  • I do use Netbeans all the time, and I don't give up because it works with a simple setup. Netbeans scans everything in target/generated-sources in a maven project, see http://wiki.netbeans.org/MavenBestPractices . Your solution needs boiler plate configuration because it seems to generate in src/generated-sources instead (although commented out). – ymajoros Mar 13 '15 at 06:26
  • 1
    i have example projects that generate java sources in target/generated-sources, and netbeans shows me compilation errors, i will be happy to share them with you if you want to look at them – Kalpesh Soni Mar 13 '15 at 16:15