title: Gradle dependency conflict when using `implementation`
body: <p>I have a project with two gradle modules: <code>lib</code> and <code>app</code>. I just changed <code>lib</code>'s build.gradle to stop exposing a dependency (i.e. I moved from <code>api</code> -> <code>implementation</code>). The <code>app</code> module doesn't directly depend on OkHttp logging interceptor so I figure it's better to not expose it.</p>
  
  <p><code>lib</code> module's build.gradle:</p>
  
  <pre><code>dependencies {
      // api 'com.squareup.okhttp3:logging-interceptor:3.10.0'
      implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
      ...
  }
  </code></pre>
  
  <p><code>app</code> module's build.gradle:</p>
  
  <pre><code>dependencies {
      implementation project(':lib')
      implementation group: 'com.zendesk', name: 'support-providers', version: '2.0.0'
      ...
  }
  </code></pre>
  
  <p>However I'm now seeing a compile problem:</p>
  
  <blockquote>
    <p>Conflict with dependency 'com.squareup.okhttp3:logging-interceptor' in
    project ':app'. Resolved versions for runtime classpath (3.10.0) and 
    compile classpath (3.8.1) differ</p>
  </blockquote>
  
  <p>If I look at project structure I see this:</p>
  
  <pre><code>+--- project :lib
  ...
  +--- com.zendesk:support-providers:2.0.0
  |    +--- com.zendesk:core:1.0.0
  |    |    +--- com.zendesk:java-common:1.13
  |    |    +--- com.google.dagger:dagger:2.12 -&gt; 2.15 (*)
  |    |    +--- com.squareup.retrofit2:retrofit:2.3.0
  |    |    |    \--- com.squareup.okhttp3:okhttp:3.8.0 -&gt; 3.8.1
  |    |    |         \--- com.squareup.okio:okio:1.13.0
  |    |    +--- com.squareup.retrofit2:converter-gson:2.3.0
  |    |    |    +--- com.squareup.retrofit2:retrofit:2.3.0 (*)
  |    |    |    \--- com.google.code.gson:gson:2.7
  |    |    +--- com.squareup.okhttp3:logging-interceptor:3.8.1 // &lt;----- SEE HERE
  |    |    |    \--- com.squareup.okhttp3:okhttp:3.8.1 (*) 
  |    |    +--- com.squareup.okhttp3:okhttp:3.8.1 (*)
  |    |    +--- com.android.support:support-annotations:27.0.2 -
  </code></pre>
  
  <p><code>lib</code> isn't revealing any of it's dependencies (obviously) and <code>app</code> depends on Zendesk sdk which depends on <em>different</em> version of OkHttp logging interceptor.</p>
  
  <p>I only see two ways to fix this:</p>
  
  <ol>
  <li>revert <code>api -&gt; implementation</code> in <code>lib</code> module, thus exposing logging interceptor to <code>app</code> module</li>
  <li>declare a top level dependency on logging interceptor and set to 3.10 to force Zendesk to use latest:</li>
  </ol>
  
  <p><code>app</code> build.gradle:</p>
  
  <pre><code>dependencies {
      implementation project(':lib')
      implementation group: 'com.zendesk', name: 'support-providers', version: '2.0.0'
  
      // used just to force zendesk to use 3.10
      implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0' 
      ...
  }
  </code></pre>
  
  <p>Neither of these seem very clean. IMO the <code>app</code> module shouldn't know anything about OkHttp logging interceptor. Is there another option? </p>
  
  <p>If Zendesk updated their library to use <code>implementation</code> for their OkHttp dependency would this solve the problem? Will Gradle let two dependencies use different versions of the same transitive dependency as long as they don't expose to the project as a whole?</p>