## 3.7.2 Dependency Repositories

#### Remote Repositories

Grails, when installed, does not use any remote public repositories. There is a default `grailsHome()` repository that will locate the JAR files Grails needs from your Grails installation. If you want to take advantage of a public repository you need to specify as such inside the `repositories` block:

    repositories {
        mavenCentral()
    }

In this case the default public Maven repository is specified. To use the SpringSource Enterprise Bundle Repository you can use the `ebr()` method:

    repositories {
        ebr()
    }

You can also specify a specific Maven repository to use by URL:

    repositories {
        mavenRepo "http://repository.codehaus.org"
    }

#### Controlling Repositories Inherited from Plugins

A plugin you have installed may define a reference to a remote repository just as an application can. By default your application will inherit this repository definition when you install the plugin.

If you do not wish to inherit repository definitions from plugins then you can disable repository inheritance:

    repositories {
    	inherit false
    }

In this case your application will not inherit any repository definitions from plugins and it is down to you to provide appropriate (possibly internal) repository definitions.

#### Local Resolvers

If you do not wish to use a public Maven repository you can specify a flat file repository:

    repositories {
        flatDir name:'myRepo', dirs:'/path/to/repo'
    }

To specify your local Maven cache (`~/.m2/repository`) as a repository:

    repositories {
        mavenLocal()
    }

#### Custom Resolvers

If all else fails since Grails builds on Apache Ivy you can specify an Ivy resolver:

    /*
     * Configure our resolver.
     */
    def libResolver = new org.apache.ivy.plugins.resolver.URLResolver()
    ['libraries', 'builds'].each {
        libResolver.addArtifactPattern("http://my.repository/${it}/[organisation]/[module]/[revision]/[type]s/[artifact].[ext]")
        libResolver.addIvyPattern("http://my.repository/${it}/[organisation]/[module]/[revision]/[type]s/[artifact].[ext]")
    }
    libResolver.name = "my-repository"
    libResolver.settings = ivySettingsresolver libResolver

A common question is whether it's possible to pull dependencies from a repository using SSH. The answer is yes! Ivy comes with a dedicated resolver that you can configure and include in your project like so:

    import org.apache.ivy.plugins.resolver.SshResolver
    …
    repositories {
        ...    def sshResolver = new SshResolver(
                name: "myRepo",
                user: "username",
                host: "dev.x.com",
                keyFile: new File("/home/username/.ssh/id_rsa"),
                m2compatible: true)    sshResolver.addArtifactPattern("/home/grails/repo/[organisation]/[artifact]/[revision]/[artifact]-[revision].[ext]")
        sshResolver.latestStrategy = new org.apache.ivy.plugins.latest.LatestTimeStrategy()
        sshResolver.changingPattern = ".*SNAPSHOT"
        sshResolver.setCheckmodified(true)    resolver sshResolver
    }

If you're going to use the SSH resolver, then you will need to download the JSch JAR and add it to Grails' classpath. You can either do this by adding its path to the `CLASSPATH` environment variable or by passing the path in the Grails command line:

    grails -classpath /path/to/jsch compile|run-app|etc.

The environment variable is more convenient, but be aware that it affects many Java applications. An alternative on Unix is to create an alias for `grails -classpath ...` so that you don't have to type the extra arguments each time.

#### Authentication

If your repository requires some form of authentication you can specify as such using a `credentials` block:

    credentials {
    	realm = ".."
    	host = "localhost"
    	username = "myuser"
    	password = "mypass"
    }

The above can also be placed in your `USER_HOME/.grails/settings.groovy` file using the `grails.project.ivy.authentication` setting:

    grails.project.ivy.authentication = {
    	credentials {
    		realm = ".."
    		host = "localhost"
    		username = "myuser"
    		password = "mypass"
    	}
    }