问题
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:
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 nopersistence.xml
. Is it possible to doopenjpa:enhance
without
it?
- I'm using
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.
- I specify all the OpenJPA properties in a subclass of Spring's org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration - see the class below. This is probably what I need to change, but how? And where to specify the properties file so
openjpa-maven-plugin
can find it?
- I specify all the OpenJPA properties in a subclass of Spring's org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration - see the class below. This is probably what I need to change, but how? And where to specify the properties file so
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.
- ruled out - I checked redownloaded the OpenJPA jars with
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;
}
}
回答1:
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
来源:https://stackoverflow.com/questions/41162726/cannot-run-static-enhancement-of-openjpa-entities-with-spring-boot