mavenspring-bootspring-data-jpaopenjpaopenjpa-maven-plugin

Cannot run static enhancement of OpenJPA entities with Spring Boot


mvn package fails at the openjpa-maven-plugin:enhance stage when I try to enhance my JPA entities in a Spring Boot app.

There's a long error description

enhance failed: MetaDataFactory could not be configured (conf.newMetaDataFactoryInstance() returned null).

no configuration properties were found.

It lists some reasons:

  1. Ensure that you have a META-INF/persistence.xml file, that it is available in your classpath

    • I'm using spring-data-jpa with Java config, and there's no
      persistence.xml. Is it possible to do openjpa:enhance without
      it?
  2. Ensure the properties file you are using for configuration is available. If you are using Ant, please see the or attributes of the task's nested element.

  3. This can also occur if your OpenJPA distribution jars are corrupt, or if your security policy is overly strict.

    • ruled out - I checked redownloaded the OpenJPA jars with checksumPolicy=fail so that's proof that they're not corrupted, plus I'm not using any security policy at this level.

pom.xml

        <plugin>
            <groupId>org.apache.openjpa</groupId>
            <artifactId>openjpa-maven-plugin</artifactId>
            <configuration>
                <includes>**/entity/*.class</includes>
                <addDefaultConstructor>true</addDefaultConstructor>
                <enforcePropertyRestrictions>true</enforcePropertyRestrictions>
            </configuration>
            <executions>
                <execution>
                    <id>enhancer</id>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>enhance</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

openjpa-maven-plugin error

[INFO] --- openjpa-maven-plugin:2.4.1:enhance (enhancer) @ project-x ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 16.707 s
[INFO] Finished at: 2016-12-15T09:51:36+00:00
[INFO] Final Memory: 44M/359M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.openjpa:openjpa-maven-plugin:2.4.1:enhance 
(enhancer) on project x: Execution enhancer of goal org.apache.openjpa:openjpa-maven-plugin:2.4.1:enhance 
failed: MetaDataFactory could not be configured (conf.newMetaDataFactoryInstance()
returned null). This might mean that no configuration properties were found. Ensure that 
you have a META-INF/persistence.xml file, that it is available in your classpath, or that
the properties file you are using for configuration is available. If you are using Ant,
please see the <properties> or <propertiesFile> attributes of the task's nested <config>
element. This can also occur if your OpenJPA distribution jars are corrupt, or if your
security policy is overly strict. -> [Help 1]

Subclass of JpaBaseConfiguration

@Import({
        LdapConfig.class,
        SecurityConfig.class,
        PropertySpringConfig.class
})
@SpringBootApplication
@EnableJpaRepositories(basePackages = {"com.adam.x.repository"})
@EntityScan(basePackages = {"com.adam.x.entity"})
public class MyWebApplication extends JpaBaseConfiguration {

    public static void main(String[] args) {
        SpringApplication.run(MyWebApplication.class, args);
    }

    protected MyWebApplication(
            DataSource dataSource,
            JpaProperties properties,
            ObjectProvider<JtaTransactionManager> jtaTransactionManagerProvider) {
        super(dataSource, properties, jtaTransactionManagerProvider);
    }

    @Override
    protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
        OpenJpaVendorAdapter jpaVendorAdapter = new OpenJpaVendorAdapter();
        jpaVendorAdapter.setShowSql(true);
        return jpaVendorAdapter;

    }

    @Override
    protected Map<String, Object> getVendorProperties() {
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("openjpa.Log", "DefaultLevel=TRACE, Tool=INFO, SQL=TRACE, Runtime=TRACE");
        map.put("openjpa.jdbc.MappingDefaults", "IndexLogicalForeignKeys=false,IndexDiscriminator=false");
//        map.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
        map.put("openjpa.RuntimeUnenhancedClasses", "supported");
//        map.put("openjpa.DynamicEnhancementAgent", "true");
//        map.put("openjpa.weaving", "false");
        return map;
    }


}

Solution

  • This answer here sorted it out for me.

    The maven plugin needs a persistence.xml to work, which is slightly not DRY because I have to remember to list any new entity beans in there, but I figured it's a small price.

    OpenJPA and Spring-boot configuration