Главная > Development > Maven, Coberturа и генерация базы

Maven, Coberturа и генерация базы

В одном из моих проектов coverage кода вычисляется при помощи Cobertura. Этот инструмент считается одним из наиболее адекватных open source инструментов и хорошо интегрирован с Maven. Но у меня возникла проблема с взаимодействием Cobertura и Hibernate3.

В рамках проекта БД создается через goal hbm2ddl мавеновского плагина hibernate3-maven-plugin. На том же проходе создается тестовая БД. На тестовой БД тестируется продукт. Для построение отчета по покрытию необходимо инструментировать код системы перед запуском тестов. И тут случается проблема, которая выглядит примерно так:

[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Unable to load class declared as
 in the configuration:
[INFO] ------------------------------------------------------------------------
[INFO] Trace
org.hibernate.MappingException: Unable to load class declared as
 in the configuration:
        at org.hibernate.cfg.AnnotationConfiguration.parseMappingElement(AnnotationConfiguration.java:650)
        at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1589)
        at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1568)
        at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:1047)
        at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:64)
        at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1542)
        at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:1035)
        at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:64)
        at org.hibernate.cfg.Configuration.configure(Configuration.java:1477)
        at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:1023)
        at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:64)
        at org.codehaus.mojo.hibernate3.configuration.AbstractComponentConfiguration.doConfiguration(AbstractComponentConfiguration.java:95)
        at org.codehaus.mojo.hibernate3.configuration.AbstractComponentConfiguration.getConfiguration(AbstractComponentConfiguration.java:56)
        at org.codehaus.mojo.hibernate3.exporter.Hbm2DDLExporterMojo.doExecute(Hbm2DDLExporterMojo.java:87)
        at org.codehaus.mojo.hibernate3.HibernateExporterMojo.execute(HibernateExporterMojo.java:152)
        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:483)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:678)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:540)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.forkProjectLifecycle(DefaultLifecycleExecutor.java:1168)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.forkLifecycle(DefaultLifecycleExecutor.java:1009)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:627)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:553)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:523)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:371)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:332)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:181)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:356)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:137)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:356)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
        at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
        at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
        at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: java.lang.ClassNotFoundException: ru.myproject.MyEntity
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:316)
        at org.codehaus.classworlds.RealmClassLoader.loadClassDirect(RealmClassLoader.java:195)
        at org.codehaus.classworlds.DefaultClassRealm.loadClass(DefaultClassRealm.java:255)
        at org.codehaus.classworlds.DefaultClassRealm.loadClass(DefaultClassRealm.java:274)
        at org.codehaus.classworlds.RealmClassLoader.loadClass(RealmClassLoader.java:214)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:164)
        at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:123)
        at org.hibernate.cfg.AnnotationConfiguration.parseMappingElement(AnnotationConfiguration.java:647)
        ... 36 more

Очевидно, что проблема в загрузке классов, но какая именно – непонятно. Исследование интернета показало, что я не первый наступил на эти «грабли». И что единственное известное решение – отключить создание DDL и заливку его в БД при помощи инструментированного кода. Для этого в POM файле используем следующую заплатку:

<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>hibernate3-maven-plugin</artifactId>
	<version>2.2</version>
	<configuration>
		<components>
			<component>
				<name>hbm2ddl</name>
				<implementation>annotationconfiguration</implementation>
			</component>
		</components>
		<componentProperties>
			<drop>${hibernate.export}</drop>
			<export>${hibernate.export}</export>
			<jdk5>true</jdk5>
			<propertyfile>target/classes/jdbc.properties</propertyfile>
			<outputfilename>schema.sql</outputfilename>
			<!-- this is a special define for site building. Have to be turned off to build a site -->
			<skip>${hibernate.ddl.skip}</skip>
		</componentProperties>
	</configuration>
	<executions>
		<execution>
			<phase>process-test-resources</phase>
			<goals>
				<goal>hbm2ddl</goal>
			</goals>
			<configuration>
				<componentProperties>
					<drop>true</drop>
					<export>true</export>
				</componentProperties>
			</configuration>
		</execution>
	</executions>
	<dependencies>
		<dependency>
			<groupId>${jdbc.groupId}</groupId>
			<artifactId>${jdbc.artifactId}</artifactId>
			<version>${jdbc.version}</version>
		</dependency>
	</dependencies>
</plugin>

Можно обратить внимание на параметр hibernate.ddl.skip, которым можно управлять из командной строки. Примерно так:

mvn -Dhibernate.ddl.skip=true cobertura:cobertura

alik Development , , ,

  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.