Overview

Accessing Project Metadata

This resource is unprotected and open to all clients. It is used by the Spring Initializr as well as by the individual project pages to list their available releases and create documentation links.

A GET request will list all of the projects’s metadata, including releases. The resource path ends with the project id (e.g. "spring-framework"):

GET /project_metadata/spring-framework HTTP/1.1
Host: localhost:8080
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000
Content-Length: 3310

{
  "id" : "spring-framework",
  "name" : "Spring Framework",
  "repoUrl" : "http://github.com/spring-projects/spring-framework",
  "siteUrl" : "http://projects.spring.io/spring-framework",
  "category" : "active",
  "stackOverflowTags" : "spring,spring-core,spring-framework,dependency-injection",
  "aggregator" : false,
  "projectReleases" : [ {
    "releaseStatus" : "SNAPSHOT",
    "refDocUrl" : "http://docs.spring.io/spring/docs/4.0.1.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/",
    "apiDocUrl" : "http://docs.spring.io/spring/docs/4.0.1.BUILD-SNAPSHOT/javadoc-api/",
    "groupId" : "org.springframework",
    "artifactId" : "spring-framework",
    "repository" : {
      "id" : "spring-snapshots",
      "name" : "Spring Snapshots",
      "url" : "https://repo.spring.io/libs-snapshot",
      "snapshotsEnabled" : true
    },
    "snapshot" : true,
    "version" : "4.0.1.BUILD-SNAPSHOT",
    "current" : false,
    "preRelease" : false,
    "generalAvailability" : false,
    "versionDisplayName" : "4.0.1"
  }, {
    "releaseStatus" : "GENERAL_AVAILABILITY",
    "refDocUrl" : "http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/",
    "apiDocUrl" : "http://docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/",
    "groupId" : "org.springframework",
    "artifactId" : "spring-framework",
    "snapshot" : false,
    "version" : "4.0.0.RELEASE",
    "current" : true,
    "preRelease" : false,
    "generalAvailability" : true,
    "versionDisplayName" : "4.0.0"
  }, {
    "releaseStatus" : "SNAPSHOT",
    "refDocUrl" : "http://docs.spring.io/spring/docs/3.2.7.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/",
    "apiDocUrl" : "http://docs.spring.io/spring/docs/3.2.7.BUILD-SNAPSHOT/javadoc-api/",
    "groupId" : "org.springframework",
    "artifactId" : "spring-framework",
    "repository" : {
      "id" : "spring-snapshots",
      "name" : "Spring Snapshots",
      "url" : "https://repo.spring.io/libs-snapshot",
      "snapshotsEnabled" : true
    },
    "snapshot" : true,
    "version" : "3.2.7.BUILD-SNAPSHOT",
    "current" : false,
    "preRelease" : false,
    "generalAvailability" : false,
    "versionDisplayName" : "3.2.7"
  }, {
    "releaseStatus" : "GENERAL_AVAILABILITY",
    "refDocUrl" : "http://docs.spring.io/spring/docs/3.2.6.RELEASE/spring-framework-reference/htmlsingle/",
    "apiDocUrl" : "http://docs.spring.io/spring/docs/3.2.6.RELEASE/javadoc-api/",
    "groupId" : "org.springframework",
    "artifactId" : "spring-framework",
    "snapshot" : false,
    "version" : "3.2.6.RELEASE",
    "current" : false,
    "preRelease" : false,
    "generalAvailability" : true,
    "versionDisplayName" : "3.2.6"
  }, {
    "releaseStatus" : "GENERAL_AVAILABILITY",
    "refDocUrl" : "http://docs.spring.io/spring/docs/3.1.4.RELEASE/spring-framework-reference/htmlsingle/",
    "apiDocUrl" : "http://docs.spring.io/spring/docs/3.1.4.RELEASE/javadoc-api/",
    "groupId" : "org.springframework",
    "artifactId" : "spring-framework",
    "snapshot" : false,
    "version" : "3.1.4.RELEASE",
    "current" : false,
    "preRelease" : false,
    "generalAvailability" : true,
    "versionDisplayName" : "3.1.4"
  } ],
  "stackOverflowTagList" : [ "spring", "spring-core", "spring-framework", "dependency-injection" ]
}

The request can optionally include a "callback" query parameter for JSON-P clients.

GET /project_metadata/spring-framework?callback=a_function_name HTTP/1.1
Host: localhost:8080
HTTP/1.1 200 OK
Content-Type: application/javascript
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000
Content-Length: 2779

/**/a_function_name({"id":"spring-framework","name":"Spring Framework","repoUrl":"http://github.com/spring-projects/spring-framework","siteUrl":"http://projects.spring.io/spring-framework","category":"active","stackOverflowTags":"spring,spring-core,spring-framework,dependency-injection","aggregator":false,"projectReleases":[{"releaseStatus":"SNAPSHOT","refDocUrl":"http://docs.spring.io/spring/docs/4.0.1.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/","apiDocUrl":"http://docs.spring.io/spring/docs/4.0.1.BUILD-SNAPSHOT/javadoc-api/","groupId":"org.springframework","artifactId":"spring-framework","repository":{"id":"spring-snapshots","name":"Spring Snapshots","url":"https://repo.spring.io/libs-snapshot","snapshotsEnabled":true},"snapshot":true,"version":"4.0.1.BUILD-SNAPSHOT","current":false,"preRelease":false,"generalAvailability":false,"versionDisplayName":"4.0.1"},{"releaseStatus":"GENERAL_AVAILABILITY","refDocUrl":"http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/","apiDocUrl":"http://docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/","groupId":"org.springframework","artifactId":"spring-framework","snapshot":false,"version":"4.0.0.RELEASE","current":true,"preRelease":false,"generalAvailability":true,"versionDisplayName":"4.0.0"},{"releaseStatus":"SNAPSHOT","refDocUrl":"http://docs.spring.io/spring/docs/3.2.7.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/","apiDocUrl":"http://docs.spring.io/spring/docs/3.2.7.BUILD-SNAPSHOT/javadoc-api/","groupId":"org.springframework","artifactId":"spring-framework","repository":{"id":"spring-snapshots","name":"Spring Snapshots","url":"https://repo.spring.io/libs-snapshot","snapshotsEnabled":true},"snapshot":true,"version":"3.2.7.BUILD-SNAPSHOT","current":false,"preRelease":false,"generalAvailability":false,"versionDisplayName":"3.2.7"},{"releaseStatus":"GENERAL_AVAILABILITY","refDocUrl":"http://docs.spring.io/spring/docs/3.2.6.RELEASE/spring-framework-reference/htmlsingle/","apiDocUrl":"http://docs.spring.io/spring/docs/3.2.6.RELEASE/javadoc-api/","groupId":"org.springframework","artifactId":"spring-framework","snapshot":false,"version":"3.2.6.RELEASE","current":false,"preRelease":false,"generalAvailability":true,"versionDisplayName":"3.2.6"},{"releaseStatus":"GENERAL_AVAILABILITY","refDocUrl":"http://docs.spring.io/spring/docs/3.1.4.RELEASE/spring-framework-reference/htmlsingle/","apiDocUrl":"http://docs.spring.io/spring/docs/3.1.4.RELEASE/javadoc-api/","groupId":"org.springframework","artifactId":"spring-framework","snapshot":false,"version":"3.1.4.RELEASE","current":false,"preRelease":false,"generalAvailability":true,"versionDisplayName":"3.1.4"}],"stackOverflowTagList":["spring","spring-core","spring-framework","dependency-injection"]});

Project Releases

This resource is protected by HTTP Basic authentication. The username is a Github API token and the password is empty (just like Github API access). Access is denied if the key does not belong to one of the Spring developer team in Github.

The releases of each project can be accessed and manipulated independently of the top-level metadata.

A GET is used to access a release by version:

GET /project_metadata/spring-framework/releases/4.0.1.BUILD-SNAPSHOT HTTP/1.1
Host: localhost:8080
HTTP/1.1 200 OK
Content-Disposition: inline;filename=f.txt
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000
Content-Length: 627

{
  "releaseStatus" : "SNAPSHOT",
  "refDocUrl" : "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/htmlsingle/",
  "apiDocUrl" : "http://docs.spring.io/spring/docs/{version}/javadoc-api/",
  "groupId" : "org.springframework",
  "artifactId" : "spring-framework",
  "repository" : {
    "id" : "spring-snapshots",
    "name" : "Spring Snapshots",
    "url" : "https://repo.spring.io/libs-snapshot",
    "snapshotsEnabled" : true
  },
  "snapshot" : true,
  "version" : "4.0.1.BUILD-SNAPSHOT",
  "current" : false,
  "preRelease" : false,
  "generalAvailability" : false,
  "versionDisplayName" : "4.0.1"
}

A POST request is used to create a new release, or to update an existing one. Note that in the request body the documentation URLs can contain a {version} placeholder, and this is replaced in the backend (as shown in the example response):

POST /project_metadata/spring-framework/releases HTTP/1.1
Content-Type: application/json;charset=UTF-8
Host: localhost:8080
Content-Length: 329

{
  "groupId" : "org.springframework",
  "artifactId" : "spring-framework",
  "version" : "1.2.3.RELEASE",
  "releaseStatus" : "GENERAL_AVAILABILITY",
  "refDocUrl" : "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/htmlsingle/",
  "apiDocUrl" : "http://docs.spring.io/spring/docs/{version}/javadoc-api/"
}
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000
Content-Length: 470

{
  "releaseStatus" : "GENERAL_AVAILABILITY",
  "refDocUrl" : "http://docs.spring.io/spring/docs/1.2.3.RELEASE/spring-framework-reference/htmlsingle/",
  "apiDocUrl" : "http://docs.spring.io/spring/docs/1.2.3.RELEASE/javadoc-api/",
  "groupId" : "org.springframework",
  "artifactId" : "spring-framework",
  "snapshot" : false,
  "version" : "1.2.3.RELEASE",
  "current" : false,
  "preRelease" : false,
  "generalAvailability" : true,
  "versionDisplayName" : "1.2.3"
}
the only mandatory properties for a release are the ones shown above in the example request. Normally only snapshot and milestone releases need a repository (anything in Maven Ceantral does not need it).

A DELETE request is used to remove a release.

DELETE /project_metadata/spring-framework/releases/4.0.1.BUILD-SNAPSHOT HTTP/1.1
Host: localhost:8080
HTTP/1.1 200 OK
Content-Disposition: inline;filename=f.txt
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000
Content-Length: 649

{
  "releaseStatus" : "SNAPSHOT",
  "refDocUrl" : "http://docs.spring.io/spring/docs/4.0.1.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/",
  "apiDocUrl" : "http://docs.spring.io/spring/docs/4.0.1.BUILD-SNAPSHOT/javadoc-api/",
  "groupId" : "org.springframework",
  "artifactId" : "spring-framework",
  "repository" : {
    "id" : "spring-snapshots",
    "name" : "Spring Snapshots",
    "url" : "https://repo.spring.io/libs-snapshot",
    "snapshotsEnabled" : true
  },
  "snapshot" : true,
  "version" : "4.0.1.BUILD-SNAPSHOT",
  "current" : false,
  "preRelease" : false,
  "generalAvailability" : false,
  "versionDisplayName" : "4.0.1"
}

A PUT request without any version is used to update all the releases in one request. Version placeholders can also be used here.

PUT /project_metadata/spring-framework/releases HTTP/1.1
Content-Type: application/json;charset=UTF-8
Host: localhost:8080
Content-Length: 2000

[ {
  "groupId" : "org.springframework",
  "artifactId" : "spring-framework",
  "version" : "1.2.8.RELEASE",
  "releaseStatus" : "SNAPSHOT",
  "refDocUrl" : "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/htmlsingle/",
  "apiDocUrl" : "http://docs.spring.io/spring/docs/{version}/javadoc-api/",
  "repository" : {
    "id" : "spring-snapshots",
    "name" : "Spring Snapshots",
    "url" : "https://repo.spring.io/libs-snapshot",
    "snapshotsEnabled" : true
  }
}, {
  "groupId" : "org.springframework",
  "artifactId" : "spring-framework",
  "version" : "4.0.0.RELEASE",
  "releaseStatus" : "GENERAL_AVAILABILITY",
  "current" : true,
  "refDocUrl" : "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/htmlsingle/",
  "apiDocUrl" : "http://docs.spring.io/spring/docs/{version}/javadoc-api/"
}, {
  "groupId" : "org.springframework",
  "artifactId" : "spring-framework",
  "version" : "3.2.7.BUILD-SNAPSHOT",
  "releaseStatus" : "SNAPSHOT",
  "refDocUrl" : "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/htmlsingle/",
  "apiDocUrl" : "http://docs.spring.io/spring/docs/{version}/javadoc-api/",
  "repository" : {
    "id" : "spring-snapshots",
    "name" : "Spring Snapshots",
    "url" : "https://repo.spring.io/libs-snapshot",
    "snapshotsEnabled" : true
  }
}, {
  "groupId" : "org.springframework",
  "artifactId" : "spring-framework",
  "version" : "3.2.6.RELEASE",
  "releaseStatus" : "GENERAL_AVAILABILITY",
  "refDocUrl" : "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/htmlsingle/",
  "apiDocUrl" : "http://docs.spring.io/spring/docs/{version}/javadoc-api/"
}, {
  "groupId" : "org.springframework",
  "artifactId" : "spring-framework",
  "version" : "3.1.4.RELEASE",
  "releaseStatus" : "GENERAL_AVAILABILITY",
  "refDocUrl" : "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/htmlsingle/",
  "apiDocUrl" : "http://docs.spring.io/spring/docs/{version}/javadoc-api/"
} ]
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000
Content-Length: 3976

{
  "id" : "spring-framework",
  "name" : "Spring Framework",
  "repoUrl" : "http://github.com/spring-projects/spring-framework",
  "siteUrl" : "http://projects.spring.io/spring-framework",
  "category" : "active",
  "stackOverflowTags" : "spring,spring-core,spring-framework,dependency-injection",
  "aggregator" : false,
  "projectReleases" : [ {
    "releaseStatus" : "SNAPSHOT",
    "refDocUrl" : "http://docs.spring.io/spring/docs/4.0.1.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/",
    "apiDocUrl" : "http://docs.spring.io/spring/docs/4.0.1.BUILD-SNAPSHOT/javadoc-api/",
    "groupId" : "org.springframework",
    "artifactId" : "spring-framework",
    "repository" : {
      "id" : "spring-snapshots",
      "name" : "Spring Snapshots",
      "url" : "https://repo.spring.io/libs-snapshot",
      "snapshotsEnabled" : true
    },
    "snapshot" : true,
    "version" : "4.0.1.BUILD-SNAPSHOT",
    "current" : false,
    "preRelease" : false,
    "generalAvailability" : false,
    "versionDisplayName" : "4.0.1"
  }, {
    "releaseStatus" : "GENERAL_AVAILABILITY",
    "refDocUrl" : "http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/",
    "apiDocUrl" : "http://docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/",
    "groupId" : "org.springframework",
    "artifactId" : "spring-framework",
    "snapshot" : false,
    "version" : "4.0.0.RELEASE",
    "current" : true,
    "preRelease" : false,
    "generalAvailability" : true,
    "versionDisplayName" : "4.0.0"
  }, {
    "releaseStatus" : "SNAPSHOT",
    "refDocUrl" : "http://docs.spring.io/spring/docs/3.2.7.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/",
    "apiDocUrl" : "http://docs.spring.io/spring/docs/3.2.7.BUILD-SNAPSHOT/javadoc-api/",
    "groupId" : "org.springframework",
    "artifactId" : "spring-framework",
    "repository" : {
      "id" : "spring-snapshots",
      "name" : "Spring Snapshots",
      "url" : "https://repo.spring.io/libs-snapshot",
      "snapshotsEnabled" : true
    },
    "snapshot" : true,
    "version" : "3.2.7.BUILD-SNAPSHOT",
    "current" : false,
    "preRelease" : false,
    "generalAvailability" : false,
    "versionDisplayName" : "3.2.7"
  }, {
    "releaseStatus" : "GENERAL_AVAILABILITY",
    "refDocUrl" : "http://docs.spring.io/spring/docs/3.2.6.RELEASE/spring-framework-reference/htmlsingle/",
    "apiDocUrl" : "http://docs.spring.io/spring/docs/3.2.6.RELEASE/javadoc-api/",
    "groupId" : "org.springframework",
    "artifactId" : "spring-framework",
    "snapshot" : false,
    "version" : "3.2.6.RELEASE",
    "current" : false,
    "preRelease" : false,
    "generalAvailability" : true,
    "versionDisplayName" : "3.2.6"
  }, {
    "releaseStatus" : "GENERAL_AVAILABILITY",
    "refDocUrl" : "http://docs.spring.io/spring/docs/3.1.4.RELEASE/spring-framework-reference/htmlsingle/",
    "apiDocUrl" : "http://docs.spring.io/spring/docs/3.1.4.RELEASE/javadoc-api/",
    "groupId" : "org.springframework",
    "artifactId" : "spring-framework",
    "snapshot" : false,
    "version" : "3.1.4.RELEASE",
    "current" : false,
    "preRelease" : false,
    "generalAvailability" : true,
    "versionDisplayName" : "3.1.4"
  }, {
    "releaseStatus" : "SNAPSHOT",
    "refDocUrl" : "http://docs.spring.io/spring/docs/1.2.8.RELEASE/spring-framework-reference/htmlsingle/",
    "apiDocUrl" : "http://docs.spring.io/spring/docs/1.2.8.RELEASE/javadoc-api/",
    "groupId" : "org.springframework",
    "artifactId" : "spring-framework",
    "repository" : {
      "id" : "spring-snapshots",
      "name" : "Spring Snapshots",
      "url" : "https://repo.spring.io/libs-snapshot",
      "snapshotsEnabled" : true
    },
    "snapshot" : true,
    "version" : "1.2.8.RELEASE",
    "current" : false,
    "preRelease" : false,
    "generalAvailability" : false,
    "versionDisplayName" : "1.2.8"
  } ],
  "stackOverflowTagList" : [ "spring", "spring-core", "spring-framework", "dependency-injection" ]
}