I tried to use ivy multiple times in the past and refused to use it only because it was complex enough for my simple needs. I don't want to use Maven2 for the same reason. Before I grapple, let me give you my use case. Currently I use an ant build with simple tasks for compile, test, deploy, clean etc. I have a lib directory structure like this:
- lib -- compile -- test -- runtime -- ext As you figured, I drop jars (manually) into these folders and my ant build has a classpath.ref set accordingly for the corresponding tasks. That all seems so easy because I have an existing app that works, so I copy/paste jars into the new one. It all works fine. You don't have to read a 200 page manual on how to use maven or ivy, for instance. But I'm a developer too and I know that this copy/paste process sucks and each time I try to upgrade my libraries, it's a nightmare. There are some jars in my libs that I don't know why it's there, but I don't want to remove them. Ok. I've used maven for a few opensource projects, it's fine. Seems easy for starter projects but almost always doesn't work for existing large projects. I read about ivy, fiddled around a few times but I was still not convinced. People talk about Gradle, but I don't understand why would anyone learn a DSL for writing build scripts. Ok. Enough rant. So I returned back, decided to spent a full 3 days to figure this out and here's what I got so far with Ivy: - I understand how to writing a basic ivysettings file, resolve/retrieve jars using ivy-ant tasks and write a simple ivy.xml fle with some dependencies. But here's the problem: The default dependencies either load every other dependency or does not load at all. Put simply, I want an ant task that I can write where I mention, "spring framework" and I want Ivy to automatically download corresponding dependencies and copy them into the above folder structure based on the dependency type (compile, runtime ...). Is that too much to ask for? Really? Remember, I was doing this all by hand, before. I still haven't figured a clean way to do it yet. Ivy either downloads all into one spot, there is no clear way of distinguishing the dependency types with "conf" setting. My problem is, why should I know what spring needs at compile time or runtime? Why? Isn't that why I'm using Ivy or Gradle or whatever fancy tool that comes next? As I concluded today (and I could be totally wrong), there is no clean way of doing this. One has to open up the pom or ivy files of individual libraries and figure out for themselves what to include or not. Wouldn't it be fantastic to write a build file that says -- include spring-<version>, hibernate-<version>, jsf-<version>, richfaces-<version> and be done with it? So here are a few configs I tried: 1) <dependency org="org.springframework" name="org.springframework.core" rev="${spring.version}" /> <dependency org="org.springframework" name="org.springframework.context" rev="${spring.version}"/> <dependency org="org.springframework" name="org.springframework.context.support" rev="${spring.version}"/> <dependency org="org.springframework" name="org.springframework.beans" rev="${spring.version}" /> <dependency org="org.aspectj" name="com.springsource.org.aspectj.weaver" rev="1.5.4"/> <dependency org="org.springframework" name="org.springframework.aop" rev="${spring.version}"/> <dependency org="org.hibernate" name="ejb3-persistence" rev="1.0.2.GA" /> <dependency org="org.hibernate" name="hibernate-core" rev="${hibernate.version}" "/> 2) <configurations> <conf name="default" visibility="public" description="runtime dependencies and master artifact can be used with this conf" extends="runtime,master"/> <conf name="master" visibility="public" description="contains only the artifact published by this module itself, with no transitive dependencies"/> <conf name="compile" visibility="public" description="this is the default scope, used if none is specified. Compile dependencies are available in all classpaths."/> <conf name="provided" visibility="public" description="this is much like compile, but indicates you expect the JDK or a container to provide it. It is only available on the compilation classpath, and is not transitive."/> <conf name="runtime" visibility="public" description="this scope indicates that the dependency is not required for compilation, but is for execution. It is in the runtime and test classpaths, but not the compile classpath." extends="compile"/> <conf name="test" visibility="private" description="this scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases." extends="runtime"/> </configurations> <dependencies> <dependency org="org.springframework" name="org.springframework.core" rev="${spring.version}" conf="compile->compile(*),master(*);runtime->runtime(*)"/> <dependency org="org.springframework" name="org.springframework.context" rev="${spring.version}" conf="compile->compile(*),master(*);runtime->runtime(*)"/> <dependency org="org.springframework" name="org.springframework.context.support" rev="${spring.version}" conf="compile->compile(*),master(*);runtime->runtime(*)"/> <dependency org="org.springframework" name="org.springframework.beans" rev="${spring.version}" conf="compile->compile(*),master(*);runtime->runtime(*)"/> <dependency org="org.aspectj" name="com.springsource.org.aspectj.weaver" rev="1.5.4"/> <dependency org="org.springframework" name="org.springframework.aop" rev="${spring.version}" conf="compile->compile(*),master(*);runtime->runtime(*)"/> <dependency org="org.hibernate" name="ejb3-persistence" rev="1.0.2.GA" transitive="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/> <dependency org="org.hibernate" name="hibernate-core" rev="${hibernate.version}" conf="compile->compile(*),master(*);runtime->runtime(*)"/> <dependency org="org.jboss.el" name="jboss-el" rev="1.0_02.CR2" transitive="false" conf="compile->compile(*),master(*);runtime->runtime(*)"/> <dependency org="org.richfaces.framework" name="richfaces-api" force="true" rev="${richfaces.version}"/> <dependency org="org.richfaces.framework" name="richfaces-impl" force="true" rev="${richfaces.version}"/> <dependency org="org.richfaces.ui" name="richfaces-ui" force="true" rev="${richfaces.version}"/> What is my expectation from a "build tool?" I need to integrate Spring and Hibernate in my web project. But I don't want to spend two days to figure what are the runtime and compile time dependencies by myself. I can get that by reading a pom file of every single jar that I want and write an exclude for that. At this point, I'm thinking, "Why am I using ivy in the first place?" Would greatly appreciate if someone would point out what I'm doing wrong. Thanks. Perfect. Thanks. Also, to retrieve only jars and not source or javadocs, I figured this is a better way: In your build.xml, add a "type" qualifier for ivy:retrieve. (default takes in all files!) <target name="resolve" description="--> retreive dependencies with ivy"> <ivy:retrieve type="jar"/> </target> -- View this message in context: http://old.nabble.com/example-ivy---build.xml-file-for-spring-jsf-hibernate-project-tp22461453p28405448.html Sent from the ivy-user mailing list archive at Nabble.com.