On 11/11/2010, at 10:14 PM, richardm wrote:
>
> Hi,
>
> I have a lot of JAR files in lib directories which my projects depend on for
> their compile tasks. I have set my compile dependancies like this:
>
> dependencies {
> compile fileTree(dir: "$rootDir/../uwm/lib", include: '*.jar')
> }
>
> This works fine, but I wondered if I should be using a repository for my jar
> files with a flatDir instead of the compile dependancy (I'm not using Ivy or
> Maven) e.g.
>
> repositories {
> flatDir name: 'localRepository', dirs: 'lib'
> }
>
> What is the difference between these two approaches, I didn't really
> understand from the documentation. Is the repository approach the way to
> manage different jar versions, so you can specify a dependancy on a
> particular jar and version?
The basic difference is that with the first approach you declare nothing about
your dependencies, which means there's little Gradle can do to help you (and
others) understand and manage your dependencies. They're just an opaque set of
jars with no meaning to Gradle.
With the second approach, on the other hand, you explicitly declare each
dependency, along with why the dependency is required (eg to compile, to
execute, to test, etc). This means Gradle better understands your dependencies,
and can do things to help you. The cost is that you have to declare your
dependencies in the build script.
Neither approach is the 'right' approach. It depends on what you are building.
Personally, I would tend towards declaring my dependencies explicitly.
Some benefits of declaring your dependencies:
- it's easy to see the dependencies of your project
- Gradle can detect and help you manage conflicts in dependencies.
- you can publish your project along with only its runtime dependencies, rather
than all the stuff you need at test time.
- you can publish your project to a repository, along with its dependency
information, so that others can understand your dependencies, and do things
such as swap in different implementations of your dependencies when they
include your project.
- you can move your dependencies to a repository manager.
- you can publish your dependency information to your IDE, so that the IDE
knows what to use for production vs test code.
There are some things we'd like to do in Gradle in the future that would really
only work when you declare your dependencies:
- Reports and IDE integration to help you (and others) visualise your
dependency graph
- The ability to compare declared vs actual dependencies in the code, so you
can detect unused dependencies
- Dependencies on things other than pre-compiled jars. For example, we might
add source dependencies, where the dependency is built locally before being
used.
Of course, you may or may not care about any of these benefits for your
particular project.
--
Adam Murdoch
Gradle Developer
http://www.gradle.org
CTO, Gradle Inc. - Gradle Training, Support, Consulting
http://www.gradle.biz