Skip to content
Private Maven repositories hosted on Google App-Engine, backed by Google Cloud Storage and deployed in less than 5 minutes.
Branch: master
Clone or download
renaudcerrato Merge pull request #19 from slartus/master
wrong order of function arguments
Latest commit a2d9abc Jun 19, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples updated example password Jan 15, 2019
gradle/wrapper migrated to gcloud gradle plugin Jan 15, 2019
src/main wrong order of function arguments Jun 19, 2019
.gitignore initial import Nov 1, 2016 Update Jan 15, 2019
build.gradle migrated to gcloud gradle plugin Jan 15, 2019
gradlew initial import Nov 1, 2016
gradlew.bat initial import Nov 1, 2016


Private Maven repositories hosted on Google App-Engine, backed by Google Cloud Storage, supporting HTTP Basic authentication and minimalistic user access control deployed in less than 5 minutes.

Why ?

Private Maven repositories shouldn't cost you an arm and a leg, nor requires you to become a Linux Sys-Admin to setup, and should ideally be zero maintenance and costs nothing.

Thanks to Google App-Engine's free quotas, you'll benefits for free of:

  • 5GB of storage
  • 1GB of daily incoming bandwidth
  • 1GB of daily outgoing bandwidth
  • 20,000+ storage ops per day

Moreover, no credit card is required to benefits of the quotas above.



Create a new Project

First of all, you'll need to go to your Google Cloud console to create a new App Engine application:

As soon as your project is created, a default Google Cloud storage bucket has been automatically created for you which provides the first 5GB of storage for free.

Setup the Google Cloud SDK

Follow the official documentation to install the latest Google Cloud SDK. As a shorthand, you'll find below the Ubuntu/Debian instructions:

$ export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
$ echo "deb $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
$ curl | sudo apt-key add -
$ sudo apt-get update && sudo apt-get install google-cloud-sdk

Do not forget to install the app-engine-java component. If you installed the Google Cloud SDK using the instructions above:

$ sudo apt-get install google-cloud-sdk-app-engine-java

As a last step, configure the gcloud command line environment and select your newly created App Engine project when requested to do so:

$ gcloud init
$ gcloud auth application-default login


Clone (or download) the source code:

$ git clone

Update WEB-INF/users.txt to declare users, passwords and permissions:

# That file declares your users - using basic authentication.
# Minimalistic access control is provided through the following permissions: write, read, or list.
# Syntax is:
# <username>:<password>:<permission>
# (use '*' as username and password to declare anonymous users)

The list permission allows users to list the content of the repository but prohibits downloads. The read permission allows downloads (and implies list). The write permission allows uploads (and implies read).

Anonymous users are supported by using "*" for both username and password. For example, *:*:read will allow anonymous read access.


Once you're ready to go live, just push the application to Google App-Engine:

$ cd appengine-maven-repository
$ ./gradlew appengineDeploy

And voilà! Your private Maven repository is hosted and running at the following address:



You'll find some usage examples in the examples folder. There's absolutely no extra steps required to fetch and/or deploy Maven artifacts to your repository: simply use your favorite Maven tools as you're used to do.

An example deploying artifacts using the maven plugin for Gradle:

apply plugin: 'java'
apply plugin: 'maven'


uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "https://<your-project-id>") {
                authentication(userName: "admin", password: "s3curepa55w0rd")
            pom.version = "1.0.0"
            pom.artifactId = "test"
            pom.groupId = "com.example"

Using the above plugin, deploying artifacts to your repository is as simple as:

$ ./gradlew upload

In the other way, accessing password protected Maven repositories using Gradle only requires you to specify the credentials closure:

repositories {
    maven {
        credentials {
            username 'user'
            password 'YouCantGuess'
        url "https://<your-project-id>"

Ensure you do NOT commit credentials with your code. With Gradle, you can achieve this by amending the above examples using the approach specified here of moving your creds to ~/.gradle/ and only referring to the variable names within your build.


Google App-Engine HTTP requests are limited to 32MB - and thus, any artifacts above that limit can't be hosted.


Copyright 2018 Cerrato Renaud

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
See the License for the specific language governing permissions and
limitations under the License.
You can’t perform that action at this time.