Derek Mahar
Derek Mahar

Reputation: 28386

How can I force Maven to use Ehcache 2.2.0 with Hibernate 3.3.2GA?

Assuming that the two are compatible, how can I force Maven 2 to use Ehcache 2.2.0 instead of Ehcache 1.2.3 with Hibernate 3.3.2.GA?

Essentially, I wish to replace the puzzling and practically cyclic dependency chain

with

Update:

I learned that hibernate-commons-annotations-3.3.0.ga also depends on artifact ehcache-1.2.3:

[INFO] +- org.hibernate:hibernate-commons-annotations:jar:3.3.0.ga:compile
[INFO] |  +- org.hibernate:hibernate:jar:3.2.1.ga:compile
[INFO] |  |  +- net.sf.ehcache:ehcache:jar:1.2.3:compile
[INFO] |  |  +- asm:asm-attrs:jar:1.5.3:compile
[INFO] |  |  +- cglib:cglib:jar:2.1_3:compile
[INFO] |  |  \- asm:asm:jar:1.5.3:compile
[INFO] |  \- javax.persistence:persistence-api:jar:1.0:compile

What is the purpose of hibernate-commons-annotations-3.3.0.ga? Does Hibernate need this artifact if it uses hibernate-annotations-3.2.1-ga? Is there a replacement for this artifact that doesn't include Ehcache? Should I simply try to exclude it from the build?

Upvotes: 9

Views: 5177

Answers (2)

Pascal Thivent
Pascal Thivent

Reputation: 570385

Assuming that the two are compatible, how can I force Maven 2 to use Hibernate 3.3.2.GA with Ehcache 2.2.0? According to their respective Maven POM files:

I've investigated this question for my personal needs and I have now concrete answers. All the required informations are available online and I'm just posting a very short version of howto use Ehcache 2.x with Hibernate 3.3+.

First, you need to declare the dependency on the ehcache artifact.

<dependency>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache</artifactId>
  <version>2.2.0</version>
  <type>pom</type>
</dependency>

Then, configure Hibernate for second level caching and specify the second level cache provider:

<property key="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>

Important things to note:

  • we are using the property for the new Hibernate 3.3/3.5 SPI (that Ehcache 2.0+ supports)
    • hibernate.cache.region.factory_class
  • we are using the cache provider provided by Echache
    • net.sf.ehcache.hibernate.EhCacheRegionFactory (and not o.h.c.EhCacheProvider)

So you actually just don't need the hibernate-ehcache artifact - and this solves the entire question :) Here are the exact (relevant) dependencies I use:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>3.4.0.GA</version>
</dependency>
<dependency>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache</artifactId>
  <version>2.2.0</version>
  <type>pom</type>
</dependency>

And the tree:

[INFO] +- org.hibernate:hibernate-entitymanager:jar:3.4.0.GA:compile
[INFO] |  +- org.hibernate:ejb3-persistence:jar:1.0.2.GA:compile
[INFO] |  +- org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA:compile
[INFO] |  +- org.hibernate:hibernate-annotations:jar:3.4.0.GA:compile
[INFO] |  +- org.hibernate:hibernate-core:jar:3.3.0.SP1:compile
[INFO] |  |  +- antlr:antlr:jar:2.7.6:compile
[INFO] |  |  \- commons-collections:commons-collections:jar:3.1:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:1.5.10:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  +- javax.transaction:jta:jar:1.1:compile
[INFO] |  \- javassist:javassist:jar:3.4.GA:compile
[INFO] +- ch.qos.logback:logback-classic:jar:0.9.18:compile
[INFO] |  \- ch.qos.logback:logback-core:jar:0.9.18:compile
[INFO] \- net.sf.ehcache:ehcache:pom:2.2.0:compile
[INFO]    +- net.sf.ehcache:ehcache-core:jar:2.2.0:compile
[INFO]    +- net.sf.ehcache:ehcache-terracotta:jar:2.2.0:compile
[INFO]    \- org.terracotta:terracotta-toolkit-1.0-runtime:jar:1.0.0:compile

For more details, ehcache configuration samples, official documentation, refer to the links below.

Resources

Upvotes: 10

Skarab
Skarab

Reputation: 7141

You can exclude Ehcache 1.2.3 dependency using "exclude" element, see http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html, section Dependency Exclusions. But I do not know if it works. I do not know if Ehcache is back compatible with 1.2.3. The number of the version suggests it is not. But with "exclude" you can remove Ehcache 1.2.3 and 1.5.0 dependences easily.

Upvotes: 3

Related Questions