So, I'm trying to add Ivy to my project, which outputs a WAR file. Some dependencies, like RESTEasy and Jackson are available at runtime in JBoss, so I don't want those in my war/WEB-INF/lib folder. Others libraries are not available via JBoss modules, so I want to include those in my project.
** NOTE: In eclipse, I'm using the Dynamic Web Module facet. The idea is to get IvyDE to copy the desired runtime dependencies into war/WEB-INF/lib.
Initially I created 2 ivy configuration files:
- ivy.xml - runtime (not included in WAR)
- ivy_web.xml - include in war
Then I used the GUI to configure the IDE equivalent of the Ant retrieve task. So, in my ANT build file, which I don't really want to use in my IDE, I have the following:
<ivy:retrieve pattern="war/WEB-INF/lib/[artifact]-[revision].[ext]" file="ivy-web.xml" type="jar" />
<ivy:retrieve pattern="lib/[artifact]-[revision].[ext]" file="ivy.xml" type="jar" />
- image not allowed yet :-(
I noticed in another post comment (mapping multiple ivy files in Eclipse) they mention using only 1 ivy.xml - but I'm not quite sure how to get there?
Oh, I also noticed this as well: IvyDE + WTP: How to workaround that ivy library is ignored by WTP? - however my project doesn't use the right kind of facets, and I'd rather not add them.
So, after reading this (https://stackoverflow.com/a/16575318/880884) post, I added compile and runtime configurations to my project. It looks about like this:
<configurations>
<conf name="compile" description="used for building"/>
<conf name="runtime" description="used for running"/>
</configurations>
<dependencies>
<!-- compile -->
<dependency org="org.codehaus.jackson" name="jackson-core-asl" rev="1.9.2" conf="compile->default"/>
<dependency org="org.codehaus.jackson" name="jackson-xc" rev="1.9.2" conf="compile->default"/>
<dependency org="org.codehaus.jackson" name="jackson-jaxrs" rev="1.9.2" conf="compile->default"/>
<!-- runtime -->
<dependency org="com.google.guava" name="guava" rev="14.0.1" conf="runtime->default"/>
<dependency org="com.google.inject" name="guice" rev="3.0" conf="runtime->default"/>
<dependency org="aopalliance" name="aopalliance" rev="1.0" conf="runtime->default"/>
<dependency org="javax.inject" name="javax.inject" rev="1" conf="runtime->default"/>
</dependencies>
Again, I tried to add just the one ivy.xml. Next I went the Project properties > Ivy > Retrieve List > Add - Added 2 different configurations, one for compile, which maps to /lib. The other uses the 'runtime' configuration and specifies "war/WEB-INF/lib/[artifact]-[revision].[ext]" for the retrieve pattern.
However, I end up with the "compile" in my war/WEB-INF/lib/, which is NOT what I wanted. I ONLY want the runtime dependencies copied there.
I stumbled across this today. Given the IvyDE component, we're still missing a bit of relevant information here. In order to make things work the way I wanted fully inside the Eclipse IDE, I leveraged some less than obvious features in IvyDE.
1 - For the Ivy library in the project, edit the settings to only include the 'provided' properties. Expand the Java libraries tree, then right-click on "Ivy", choose "properties".
2 - For the WEB-INF/lib libraries, leverage the retrieve capability under the Project properties, IvyDE section.
Choose the appropriate configuration(s) and set the Pattern to the location of you WEB-INF/lib folder.
I think the bit you're missing is the use of configurations, in the retrieve task:
Configurations are ivy's mechanism to group dependencies together.
Example
build.xml
Notes:
ivy.xml