You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ivy-user@ant.apache.org by Marko Asplund <ma...@ixonos.com> on 2012/06/08 09:56:49 UTC

Configuration and dependency declaration questions

Hi,

I'm just starting off using Ivy (v2.3) in a project where I'm
converting an existing codebase to use Ivy for dependency management.
In the first stage I'm just going to fetch all the publicly available
dependencies from Maven central and later use our own artifact
repository for publishing our custom artifacts.

I'd like to define dependency categories similar to Maven compile,
runtime and test dependency scopes.
The runtime dependency set should also include compile-time
dependencies and test should include compile and runtime dependencies.

Currently we have just a pile of jar files with no dependency
information available.
What's the best way to determine the dependencies? I've started with
the following approach which is very time consuming. Is there a better
way to do this?

- determine compile-time dependencies
  check import statements from source code. For each import add the
corresponding dependency to compile conf.
  delete jars one-by-one, compile. If build fails, add required
dependencies. Rebuild and iterate.
- determine runtime dependencies
  build package, deploy and test. If any dependencies are missing, add
them to the runtime conf. Iterate.
- cross check original set of jar files. Remove any files that aren't
present in the original runtime set using explicit exclusions.

How to should I define the configurations exactly in this case?
What about configuration mappings? What exactly is the reason I need
to declare configuration mappings like "compile->default" in this
case? Dependencies don't seem to get fetched without it.
Here's what my Ivy file looks like:

  <configurations
defaultconfmapping="compile->default;runtime->default;test->default">
    <conf name="compile" />
    <conf name="runtime" extends="compile"/>
    <conf name="test" extends="compile,runtime"/>
  </configurations>
…
    <dependency org="log4j" name="log4j" rev="1.2.9" conf="compile"/>
    <dependency org="org.springframework" name="spring-core"
rev="2.0.2" conf="compile"/>
...
    <dependency org="mysql" name="mysql-connector-java" rev="5.1.6"
conf="runtime"/>

Does this look reasonable?

How should I manage exclusions? For example servlet-api is required
for compilation and it's included in runtime config via a transitive
dependency. What's the best way to exclude it? Should i explicitly
include it in compile config and exclude it from the runtime
dependencies?

Some artifacts bring in unwanted transitive dependencies e.g.
commons-httpclient brings in junit which I don't want to include in
the runtime config. Should I just exclude these one-by-one? Another
option would be to always skip transitive dependencies but that would
seem to undermine the whole idea of using a dependency manager.
Also, I've run into quite a few errors when transitive dependencies
fail to get loaded. Apparently, I need to declare these explicitly as
well to satisfy the dependencies.

There are some logical dependency groups e.g. Spring framework
dependencies include multiple jars.
Should i create a separate configuration for these dependencies?

marko