Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set up sbt so it grabs all necessary dependencies when online and let me work offline then?

Tags:

sbt

I try to work on my project while in an no internet connection zone. To my surprise, sbt is having trouble in that situation. Although, i'm supposed to have my libraries in the cache (given that i initially started the project online), sbt can't resolve some dependency.

Sbt can't fetch my local maven repository, neither can he find some other dependency that i thought he downloaded already (i.e. in the cache).

*

My question is: how to ensure that when i have the connection, sbt fetches the libs in the cache ONCE, so that when i don't have it, it fetches all my local repo including the one of maven.

I'm asking this because to my understanding of the current situation (i.e. when no internet connection is available):

  1. sbt has trouble downloading from the maven cache
  2. sbt can find find most of my dependency in ivy local
  3. sbt can't find some specific dependency that for certain reasons, apparently were not cached.

For instance here is a trace of libs that sbt was supposed to have cached already.

[warn]   file:///Users/maatary/.m2/repository/com/google/inject/extensions/guice-assistedinject/4.0-beta4/guice-assistedinject-4.0-beta4.pom
[info] Resolving com.google.inject.extensions#guice-multibindings;4.0-beta4 ...
**[warn] Host repo1.maven.org not found.** url=http://repo1.maven.org/maven2/com/google/inject/extensions/guice-multibindings/4.0-beta4/guice-multibindings-4.0-beta4.pom
**[info] You probably access the destination server through a proxy server that is not well configured.**
[warn]  module not found: com.google.inject.extensions#guice-multibindings;4.0-beta4
**[warn] ==== local: tried
[warn]   /Users/maatary/.ivy2/local/com.google.inject.extensions/guice-multibindings/4.0-beta4/ivys/ivy.xml**
[warn] ==== public: tried
[warn]   http://repo1.maven.org/maven2/com/google/inject/extensions/guice-multibindings/4.0-beta4/guice-multibindings-4.0-beta4.pom
[warn] ==== Local Maven Repository: tried
[warn]   file:///Users/maatary/.m2/repository/com/google/inject/extensions/guice-multibindings/4.0-beta4/guice-multibindings-4.0-beta4.pom
[info] Resolving jline#jline;2.12 ...                                          
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: com.google.inject.extensions#guice-assistedinject;4.0-beta4: not found
[warn]  :: com.google.inject.extensions#guice-multibindings;4.0-beta4: not found

Here is the cache content:

/Users/maatary/.ivy2/cache/com.google.inject.extensions

extensions-parent guice-assistedinject guice-multibindings

Where in each folder you have:

ivy-4.0-beta4.xml ivydata-4.0-beta4.properties ivy-4.0-beta4.xml.original

the others last 2 folders contains in addition:

a jars, src and docs folder. In the jars you find the jar fetched.

e.g.

In the jars folder of assisted inject you have:

guice-assistedinject-4.0-beta4.jar

Its ivy.xml is as follows:

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0" xmlns:m="http://ant.apache.org/ivy/maven">
        <info organisation="com.google.inject.extensions"
                module="guice-assistedinject"
                revision="4.0-beta4"
                status="release"
                publication="20140320225220"
        >
                <description homepage="" />
                <m:properties__guice.with.no_aop>true</m:properties__guice.with.no_aop>
                <m:properties__gpg.skip>true</m:properties__gpg.skip>
                <m:properties__project.build.sourceEncoding>UTF-8</m:properties__project.build.sourceEncoding>
                <m:properties__guice.api.version>1.4</m:properties__guice.api.version>
                <e:sbtTransformHash>7174be3135c2a95a21c158fb6beb5a9621b5b898</e:sbtTransformHash>
                <m:properties__guice.with.jarjar>true</m:properties__guice.with.jarjar>
                <m:maven.plugins>null__maven-gpg-plugin__1.4|null__maven-gpg-plugin__1.4|null__maven-remote-resources-plugin__null|org.codehaus.mojo__animal-sniffer-maven-plugin__null|org.apache.felix__maven-bundle-plugin__null|null__mav\
en-source-plugin__null|null__maven-javadoc-plugin__null|null__maven-gpg-plugin__1.4|null__maven-gpg-plugin__1.4|null__maven-remote-resources-plugin__null|org.codehaus.mojo__animal-sniffer-maven-plugin__null|org.apache.felix__maven-bundle\
-plugin__null|null__maven-source-plugin__null|null__maven-javadoc-plugin__null</m:maven.plugins>
        </info>
        <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"/>
                <conf name="system" visibility="public" description="this scope is similar to provided except that you have to provide the JAR which contains it explicitly. The artifact is always available and is not looked up in a repos\
itory."/>
                <conf name="sources" visibility="public" description="this configuration contains the source artifact of this module, if any."/>
                <conf name="javadoc" visibility="public" description="this configuration contains the javadoc artifact of this module, if any."/>
                <conf name="optional" visibility="public" description="contains all optional dependencies"/>
        </configurations>
        <publications>
                <artifact name="guice-assistedinject" type="jar" ext="jar" conf="master"/>
        </publications>
        <dependencies>
                <dependency org="com.google.inject" name="guice" rev="4.0-beta4" force="true" conf="compile->compile(*),master(*);runtime->runtime(*);test->runtime(*),master(*)">
                        <artifact name="guice" type="jar" ext="jar" conf="compile,runtime"/>
                        <artifact name="guice" type="jar" ext="jar" conf="test" m:classifier="tests"/>
                </dependency>
                <dependency org="cglib" name="cglib" rev="3.1" force="true" conf="test->runtime(*),master(*)">
                        <exclude org="asm" module="asm" name="*" type="*" ext="*" matcher="exact"/>
                </dependency>
                <dependency org="org.ow2.asm" name="asm" rev="5.0" force="true" conf="test->runtime(*),master(*)"/>
                <dependency org="junit" name="junit" rev="4.11" force="true" conf="test->runtime(*),master(*)"/>
        </dependencies>
</ivy-module>

its properties file is as follow:

#ivy cached data file for com.google.inject.extensions#guice-assistedinject;4.0-beta4                                                                                                                                                         
#Sun Aug 17 20:44:39 CEST 2014                                                                                                                                                                                                                
artifact\:guice-assistedinject\#src\#jar\#1257084071.is-local=false
artifact\:ivy\#ivy\#xml\#-1879642188.exists=true
artifact\:guice-assistedinject\#src\#jar\#1257084071.exists=true
artifact\:ivy\#ivy\#xml\#-1879642188.location=http\://repo1.maven.org/maven2/com/google/inject/extensions/guice-assistedinject/4.0-beta4/guice-assistedinject-4.0-beta4.pom                                                                   
artifact\:guice-assistedinject\#pom.original\#pom\#1062568006.is-local=false
artifact\:guice-assistedinject\#jar\#jar\#-589994656.is-local=false
artifact\:guice-assistedinject\#pom.original\#pom\#1062568006.location=http\://repo1.maven.org/maven2/com/google/inject/extensions/guice-assistedinject/4.0-beta4/guice-assistedinject-4.0-beta4.pom                                          
artifact\:guice-assistedinject\#jar\#jar\#-589994656.location=http\://repo1.maven.org/maven2/com/google/inject/extensions/guice-assistedinject/4.0-beta4/guice-assistedinject-4.0-beta4.jar                                                   
artifact\:guice-assistedinject\#doc\#jar\#-1786980107.location=http\://repo1.maven.org/maven2/com/google/inject/extensions/guice-assistedinject/4.0-beta4/guice-assistedinject-4.0-beta4-javadoc.jar                                          
artifact\:guice-assistedinject\#pom.original\#pom\#1062568006.exists=true
artifact\:guice-assistedinject\#doc\#jar\#-1786980107.exists=true
artifact\:ivy\#ivy\#xml\#-1879642188.is-local=false
artifact\:guice-assistedinject\#doc\#jar\#-1786980107.is-local=false
artifact\:guice-assistedinject\#src\#jar\#1257084071.location=http\://repo1.maven.org/maven2/com/google/inject/extensions/guice-assistedinject/4.0-beta4/guice-assistedinject-4.0-beta4-sources.jar                                           
artifact\:guice-assistedinject\#jar\#jar\#-589994656.exists=true
like image 579
MaatDeamon Avatar asked Aug 17 '14 11:08

MaatDeamon


People also ask

Which is the correct way to add dependencies in sbt file?

Library dependencies can be added in two ways: unmanaged dependencies are jars dropped into the lib directory. managed dependencies are configured in the build definition and downloaded automatically from repositories.

How do we specify library dependencies in sbt?

You can use both managed and unmanaged dependencies in your SBT projects. If you have JAR files (unmanaged dependencies) that you want to use in your project, simply copy them to the lib folder in the root directory of your SBT project, and SBT will find them automatically.

What is sbt dependency management?

Like in almost every build system, SBT allows you to define library dependencies which are resolved automatically, so you don't have to download and package required libraries by yourself.

Where are sbt dependencies stored?

If you have JAR files (unmanaged dependencies) that you want to use in your project, simply copy them to the lib folder in the root directory of your SBT project, and SBT will find them automatically.


1 Answers

See Caching and Configuration.

When offline := true, remote SNAPSHOTs will not be updated by a resolution, even an explicitly requested update. This should effectively support working without a connection to remote repositories. Reproducible examples demonstrating otherwise are appreciated. Obviously, update must have successfully run before going offline.

This feature may or may not work for you, but it's intended to address your scenario. Try it and if it doesn't work, please file an issue on Github.

like image 182
Eugene Yokota Avatar answered Oct 13 '22 10:10

Eugene Yokota