views:

375

answers:

2

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?

+2  A: 

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.

Skarab
I used element `<exclusions/>` to exclude `ehcache-1.2.3` from the list of dependencies for `hibernate-commons-annotations-3.3.0.ga` since I think Hibernate annotations requires this artifact.
Derek Mahar
+3  A: 

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

Pascal Thivent
Thank you for the detailed answer!
Derek Mahar
@Derek See my update for the final solution.
Pascal Thivent
I see! Will give this a try and let you know my results. Does this also apply to Hibernate 3.5+?
Derek Mahar
I re-read your answer and noticed that your first note suggests that this solution also works for Hibernate 3.5+.
Derek Mahar
@Derek Yes it does, as stated in the first note :)
Pascal Thivent
Pascal, I discovered that artifact `hibernate-commons-annotations-3.3.0.ga` also pulls in `ehcache-1.2.3` (see update in my question).
Derek Mahar