Adding Password Protected Maven Repository URL in Gradle in Android Studio

Wajahat Karim
AndroidPub
Published in
3 min readSep 10, 2018

--

Image result for android gradle

This article is part of Today I Learned series and was originally posted at my TIL Github Repository and my website at wajahatkarim.com

In my current project at work, I had to setup a private maven repository hosted at Artifactory. I was assigned login credentials to access the libraries (or artifacts) from the repository. But, when I was fetching it from Android Studio project through build.gradle file, I was getting this exception on syncing the project.

org.gradle.internal.resource.transport.http.HttpRequestException: Could not GET 'MY_MAVEN_ARTIFACT_URL_GOES_HERE'.
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:139)
at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:155)
at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:284)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:261)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:165)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:167)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:272)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:124)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:271)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)

As the exception says, I was confused and I thought that my private maven URL is not valid etc. And I tried following methods to solve this issue:

  • Invalidating cache and restart Android studio (several times) but didn’t worked for me.
  • Changing proxy settings from SOCKS to HTTPS to HTTP but didn’t worked for me.
  • White listing Android Studio in Firewall for Windows 10. Again, didn’t worked for me.
  • Deleting .gradle folder etc.
  • Tried to get username and password for maven repo from system variables, but didn’t work.
  • Tried to get username and password for maven repo from gradle.properties file but didn't work.
  • Tried to put username and password for maven repo directly in the build.gradle file (which is highly not recommended) but still didn't work.

After 2–3 hours of troubleshooting and debugging, I found out that problem is not with the maven URL. The URL works great in browsers, the problem was Android Studio was not properly authenticating maven repo in right way as I missed a thing to put.

Solution

So, here’s the solution which worked for me.

First, you need to add your login credentials in gradle.properties file. Please note that this is not recommended to share your credentials this way. I am looking for more optimal and secure solution. If you have any way, do let me know.

mavenUser = MY_USER_NAME
mavenPassword = MY_PASSWORD

Then, you need to add your private maven URL in root build.gradle file like this:

allprojects {
repositories {
// ...
maven {
credentials {
username = "${mavenUser}"
password = "${mavenPassword}"
}
url "http://my.private.artifactory/url/goes/here"
authentication { // I was missing this authentication section and that's why read timeout
basic(BasicAuthentication)
}
}
}
}

My mistake was I was missing authentication block and that's why Android studio couldn't get logged in private URL and after multiple failed retries, it was getting read timeout response. Adding this authentication block worked for me.

authentication {                            
basic(BasicAuthentication)
}

Wajahat Karim is a graduate from NUST, Islamabad, an experienced mobile developer, an active open source contributor, and co-author of two books Learning Android Intents and Mastering Android Game Development with Unity. In his spare time, he likes to spend time with his family, do experiments on coding, loves to write about lots of things (mostly on blog and medium) and is passionate contributor to open source. In June 2018, one of his library became #1 on Github Trending. His libraries have about 2000 stars on Github and are being used in various apps by the developers all around the globe. Follow him on Twitter and Medium to get more updates about his work in Writing, Android and Open Source.

Also, if you have any questions you’d like him to answer, contact him through his website at wajahatkarim.com with DEAR WAJAHAT in the subject line.

--

--

Wajahat Karim
AndroidPub

🔥 Google Dev Expert (GDE) in Android . 📱 Android Dev . 💻FOSS Contributor . 📝 Tech Writer . 🎤 Public Speaker — 🌐Subscribe at https://wajahatkarim.com