Reputation: 28386
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
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:
hibernate.cache.region.factory_class
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.
Upvotes: 10
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