hibernate-maven-plugin by default scans dependencies in the scope
compile
. You can configure it to scan dependencies in other
scopes as well. But it scans only direct dependencies. Transitive
dependencies are not scanned for annotated classes. If some of your
annotated classes are hidden in a transitive dependency, you can simply
add that dependency explicitly.
The default-configuration executes the created SQL.
Therefore, it needs a valid database-connection and fails, if none is
available.
If you do not need the generated SQL to be executed automatically,
you can set the property hibernate.schema.execute
to
false
.
This can be achieved with the command-line parameter
-Dhibernate.schema.execute=false
or with the following
configuration:
<configuration> <execute>false</execute> </configuration>
But even when no database is to be created, hibernate always needs to know the dialect. Hence, the plugin will still fail, if this parameter is also missing!
One regular problem is the scope of the jdbc-driver-dependency.
It is very unlikely, that this dependency is needed at compile-time.
So a tidy maven-developer would usually scope it for runtime
.
But this will break the execution of the hibernate-maven-plugin
.
Since it will not be able to see the needed dependency, it will fail with
an error-message like:
[INFO] Gathered hibernate-configuration (turn on debugging for details): [INFO] hibernate.connection.username = sa [INFO] hibernate.connection.password = [INFO] hibernate.dialect = org.hibernate.dialect.H2Dialect [INFO] hibernate.connection.url = jdbc:h2:file:./db [INFO] hibernate.hbm2dll.create_namespaces = false [INFO] hibernate.connection.driver_class = org.h2.Driver [INFO] hibernate.format_sql = true [INFO] HHH000412: Hibernate Core {5.0.2.Final} [INFO] HHH000206: hibernate.properties not found [INFO] HHH000021: Bytecode provider name : javassist [INFO] Adding /home/kai/project/target/classes to the list of roots to scan... [INFO] Adding dependencies from scope compile to the list of roots to scan [INFO] Adding dependencies from scope org.hibernate:hibernate-core:jar:4.3.0.Final to the list of roots to scan [INFO] Adding annotated resource: de.juplo.tests.SimplestMavenHib4Test [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.760s [INFO] Finished at: Mon Mar 07 19:06:54 CET 2016 [INFO] Final Memory: 11M/215M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal de.juplo:hibernate-maven-plugin:${project.version}:drop (default) on project hibernate4-properties-test: Could not open the JDBC-connection: Unable to load class [org.h2.Driver]: Could not load requested class : org.h2.Driver -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
A quick workaround for this error would be, to delete the runtime-constraint for the jdbc-driver-dependency.
A much cleaner way is, to (additionally) ad the dependency, to the plugin-definition:
<plugin> <groupId>de.juplo</groupId> <artifactId>hibernate-maven-plugin</artifactId> <version>${project.version}</version> <executions> <execution> <goals> <goal>drop</goal> <goal>create</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>2.2.8</version> </dependency> </dependencies> </plugin>
This is also the best way, if you use a different jdbc-driver for testing, than in production. Because otherwise, this dependency will unnecessarily bloat the runtime-dependencies of your project.
If hibernate-maven-plugin skips its excecution, this may lead to errors in
other plugins.
For example, when importing sample-data in the automatically created database
with the help of the dbunit-plugin,
the CLEAN_INSERT
-operation may fail because of foreign-key-constraints,
if the database was not recreated, because the hibernate-maven-plugin has
skipped its excecution.
A quick fix to this problem is, to force hibernate-maven-plugin to generate and execute the SQL every time it is running. But to recreate the database on every testrun may noticeable slow down your development cycle, if you have to wait for slow IO.
To circumvent this problem, hibernate-maven-plugin signals a skipped
excecution by setting the maven property ${hibernate.schema.skipped}
to
true
.
You can configure other plugins to react on this signal.
For example, the dbunit-plugin can be configured to skip its excecution, if
hibernate-maven-plugin was skipped like this:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>dbunit-maven-plugin</artifactId> <configuration> <skip>${hibernate.schema.skipped}</skip> </configuration> </plugin>
If one manually drops the database or removes the hsqldb-files, it will not be recreated by the hibernate-maven-plugin, because it cannot detect, that the database needs to be recreated. This happens, because the plugin will not recreate the database if neither the configuration nor the annotated classes have changed, because an unnecessary drop-create-cycle might take a long time. The plugin will report that like this:
[INFO] No modified annotated classes found and dialect unchanged. [INFO] Skipping schema generation!
If one always uses mvn clean
for cleanup, this will not happen.
Otherwise the recreation must be forced:
mvn hibernate:create -Dhibernate.schema.force=true
The hibernate-maven-plugin automatically skips its execution, when
maven.test.skip
is set to true
. If you need it to be always
executed, you can configure that explicitly like this:
<plugin> <groupId>de.juplo</groupId> <artifactId>hibernate-maven-plugin</artifactId> ... <configuration> <skip>false</skip> </configuration> </plugin>
Background-information for this design-decission can be found on the extra page To skip or not to skip: that is the question...
If you do not want your dependencies to be scanned for hibernate annotations,
you can pass -Dhibernate.schema.scan.dependencies=none
to maven
or set scanDependencies
to none
in the configuration
of the plugin like this:
<plugin> <groupId>de.juplo</groupId> <artifactId>hibernate-maven-plugin</artifactId> ... <configuration> <scanDependencies>none</scanDependencies> </configuration> </plugin>
If you are working under Windows and get the error-message
No annotated classes found in directory C:\projects\X Y Z\path-to-project\target\classes
,
but you are really sure, that there are annotated classes in that
directory, you are expiriencing a bug, in the scannotation-library, that
was closed in version 1.1.0 of the hibernate-maven-plugin.
You should consider to upgrade to the latest version of the plugin.