From ca227196b8168fa1391073c1bc88efecdeb30bd8 Mon Sep 17 00:00:00 2001 From: buildmaster Date: Tue, 26 Nov 2019 09:48:42 +0000 Subject: [PATCH] Sync docs from v2.2.0.RELEASE to gh-pages --- .../2.2.0.RELEASE/reference/html/README.html | 936 ++++++ .../reference/html/css/spring.css | 1 + .../2.2.0.RELEASE/reference/html/favicon.ico | Bin 0 -> 111804 bytes .../2.2.0.RELEASE/reference/html/index.html | 2777 +++++++++++++++++ .../2.2.0.RELEASE/reference/html/intro.html | 115 + .../html/js/highlight/highlight.min.js | 2 + .../js/highlight/styles/a11y-dark.min.css | 99 + .../js/highlight/styles/an-old-hope.min.css | 89 + .../styles/atom-one-dark-reasonable.min.css | 77 + .../js/highlight/styles/atom-one-dark.min.css | 96 + .../highlight/styles/atom-one-light.min.css | 96 + .../html/js/highlight/styles/dracula.min.css | 76 + .../html/js/highlight/styles/github.min.css | 99 + .../highlight/styles/monokai-sublime.min.css | 83 + .../html/js/highlight/styles/monokai.min.css | 70 + .../highlight/styles/solarized-light.min.css | 84 + .../html/js/highlight/styles/zenburn.min.css | 80 + .../2.2.0.RELEASE/reference/html/js/toc.js | 107 + .../reference/html/js/tocbot/tocbot.css | 1 + .../reference/html/js/tocbot/tocbot.min.js | 1 + .../reference/html/quickstart.html | 310 ++ .../reference/html/sagan-index.html | 193 ++ .../reference/html/spring-cloud-config.html | 2777 +++++++++++++++++ .../reference/htmlsingle/css/spring.css | 1 + .../reference/htmlsingle/favicon.ico | Bin 0 -> 111804 bytes .../htmlsingle/js/highlight/highlight.min.js | 2 + .../js/highlight/styles/a11y-dark.min.css | 99 + .../js/highlight/styles/an-old-hope.min.css | 89 + .../styles/atom-one-dark-reasonable.min.css | 77 + .../js/highlight/styles/atom-one-dark.min.css | 96 + .../highlight/styles/atom-one-light.min.css | 96 + .../js/highlight/styles/dracula.min.css | 76 + .../js/highlight/styles/github.min.css | 99 + .../highlight/styles/monokai-sublime.min.css | 83 + .../js/highlight/styles/monokai.min.css | 70 + .../highlight/styles/solarized-light.min.css | 84 + .../js/highlight/styles/zenburn.min.css | 80 + .../reference/htmlsingle/js/toc.js | 107 + .../reference/htmlsingle/js/tocbot/tocbot.css | 1 + .../htmlsingle/js/tocbot/tocbot.min.js | 1 + 40 files changed, 9230 insertions(+) create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/README.html create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/css/spring.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/favicon.ico create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/index.html create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/intro.html create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/highlight.min.js create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/a11y-dark.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/an-old-hope.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/atom-one-dark-reasonable.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/atom-one-dark.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/atom-one-light.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/dracula.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/github.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/monokai-sublime.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/monokai.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/solarized-light.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/zenburn.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/toc.js create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/tocbot/tocbot.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/js/tocbot/tocbot.min.js create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/quickstart.html create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/sagan-index.html create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/html/spring-cloud-config.html create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/css/spring.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/favicon.ico create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/highlight.min.js create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/a11y-dark.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/an-old-hope.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-dark-reasonable.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-dark.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-light.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/dracula.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/github.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/monokai-sublime.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/monokai.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/solarized-light.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/zenburn.min.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/toc.js create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/tocbot/tocbot.css create mode 100644 spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/tocbot/tocbot.min.js diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/README.html b/spring-cloud-config/2.2.0.RELEASE/reference/html/README.html new file mode 100644 index 00000000..17980809 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/README.html @@ -0,0 +1,936 @@ + + + + + + + +Features + + + + + + + + + + +
+
+
+
+
+CircleCI +
+
+
+
+Codecov +
+
+
+
+Codacy code quality +
+
+
+

Spring Cloud Config provides server-side and client-side support for externalized configuration in a distributed system. With the Config Server, you have a central place to manage external properties for applications across all environments. +The concepts on both client and server map identically to the Spring Environment and PropertySource abstractions, so they fit very well with Spring applications but can be used with any application running in any language. +As an application moves through the deployment pipeline from dev to test and into production, you can manage the configuration between those environments and be certain that applications have everything they need to run when they migrate. +The default implementation of the server storage backend uses git, so it easily supports labelled versions of configuration environments as well as being accessible to a wide range of tooling for managing the content. +It is easy to add alternative implementations and plug them in with Spring configuration.

+
+
+
+
+

Features

+
+
+

Spring Cloud Config Server

+
+

Spring Cloud Config Server offers the following benefits:

+
+
+
    +
  • +

    HTTP resource-based API for external configuration (name-value pairs or equivalent YAML content)

    +
  • +
  • +

    Encrypt and decrypt property values (symmetric or asymmetric)

    +
  • +
  • +

    Embeddable easily in a Spring Boot application using @EnableConfigServer

    +
  • +
+
+
+
+

Spring Cloud Config Client

+
+

Specifically for Spring applications, Spring Cloud Config Client lets you:

+
+
+
    +
  • +

    Bind to the Config Server and initialize Spring Environment with remote property sources.

    +
  • +
  • +

    Encrypt and decrypt property values (symmetric or asymmetric).

    +
  • +
  • +

    @RefreshScope for Spring @Beans that want to be re-initialized when configuration changes.

    +
  • +
  • +

    Use management endpoints:

    +
    +
      +
    • +

      /env for updating Environment and rebinding @ConfigurationProperties and log levels.

      +
    • +
    • +

      /refresh for refreshing the @RefreshScope beans.

      +
    • +
    • +

      /restart for restarting the Spring context (disabled by default).

      +
    • +
    • +

      /pause and /resume for calling the Lifecycle methods (stop() and start() on the ApplicationContext).

      +
    • +
    +
    +
  • +
  • +

    Bootstrap application context: a parent context for the main application that can be trained to do anything (by default, it binds to the Config Server and decrypts property values).

    +
  • +
+
+
+
+
+
+

Quick Start

+
+
+

This quick start walks through using both the server and the client of Spring Cloud Config Server.

+
+
+

First, start the server, as follows:

+
+
+
+
$ cd spring-cloud-config-server
+$ ../mvnw spring-boot:run
+
+
+
+

The server is a Spring Boot application, so you can run it from your IDE if you prefer to do so (the main class is ConfigServerApplication).

+
+
+

Next try out a client, as follows:

+
+
+
+
$ curl localhost:8888/foo/development
+{"name":"foo","label":"master","propertySources":[
+  {"name":"https://github.com/scratches/config-repo/foo-development.properties","source":{"bar":"spam"}},
+  {"name":"https://github.com/scratches/config-repo/foo.properties","source":{"foo":"bar"}}
+]}
+
+
+
+

The default strategy for locating property sources is to clone a git repository (at spring.cloud.config.server.git.uri) and use it to initialize a mini SpringApplication. +The mini-application’s Environment is used to enumerate property sources and publish them at a JSON endpoint.

+
+
+

The HTTP service has resources in the following form:

+
+
+
+
/{application}/{profile}[/{label}]
+/{application}-{profile}.yml
+/{label}/{application}-{profile}.yml
+/{application}-{profile}.properties
+/{label}/{application}-{profile}.properties
+
+
+
+

where application is injected as the spring.config.name in the SpringApplication (what is normally application in a regular Spring Boot app), profile is an active profile (or comma-separated list of properties), and label is an optional git label (defaults to master.)

+
+
+

Spring Cloud Config Server pulls configuration for remote clients from various sources. The following example gets configuration from a git repository (which must be provided), as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+
+
+
+

Other sources are any JDBC compatible database, Subversion, Hashicorp Vault, Credhub and local filesystems.

+
+
+

Client Side Usage

+
+

To use these features in an application, you can build it as a Spring Boot application that depends on spring-cloud-config-client (for an example, see the test cases for the config-client or the sample application). +The most convenient way to add the dependency is with a Spring Boot starter org.springframework.cloud:spring-cloud-starter-config. +There is also a parent pom and BOM (spring-cloud-starter-parent) for Maven users and a Spring IO version management properties file for Gradle and Spring CLI users. The following example shows a typical Maven configuration:

+
+
+
pom.xml
+
+
   <parent>
+       <groupId>org.springframework.boot</groupId>
+       <artifactId>spring-boot-starter-parent</artifactId>
+       <version>{spring-boot-docs-version}</version>
+       <relativePath /> <!-- lookup parent from repository -->
+   </parent>
+
+<dependencyManagement>
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-dependencies</artifactId>
+			<version>{spring-cloud-version}</version>
+			<type>pom</type>
+			<scope>import</scope>
+		</dependency>
+	</dependencies>
+</dependencyManagement>
+
+<dependencies>
+	<dependency>
+		<groupId>org.springframework.cloud</groupId>
+		<artifactId>spring-cloud-starter-config</artifactId>
+	</dependency>
+	<dependency>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-test</artifactId>
+		<scope>test</scope>
+	</dependency>
+</dependencies>
+
+<build>
+	<plugins>
+           <plugin>
+               <groupId>org.springframework.boot</groupId>
+               <artifactId>spring-boot-maven-plugin</artifactId>
+           </plugin>
+	</plugins>
+</build>
+
+   <!-- repositories also needed for snapshots and milestones -->
+
+
+
+

Now you can create a standard Spring Boot application, such as the following HTTP server:

+
+
+
+
@SpringBootApplication
+@RestController
+public class Application {
+
+    @RequestMapping("/")
+    public String home() {
+        return "Hello World!";
+    }
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+
+}
+
+
+
+

When this HTTP server runs, it picks up the external configuration from the default local config server (if it is running) on port 8888. +To modify the startup behavior, you can change the location of the config server by using bootstrap.properties (similar to application.properties but for the bootstrap phase of an application context), as shown in the following example:

+
+
+
+
spring.cloud.config.uri: http://myconfigserver.com
+
+
+
+

By default, if no application name is set, application will be used. To modify the name, the following property can be added to the bootstrap.properties file:

+
+
+
+
spring.application.name: myapp
+
+
+
+ + + + + +
+ + +When setting the property ${spring.application.name} do not prefix your app name with the reserved word application- to prevent issues resolving the correct property source. +
+
+
+

The bootstrap properties show up in the /env endpoint as a high-priority property source, as shown in the following example.

+
+
+
+
$ curl localhost:8080/env
+{
+  "profiles":[],
+  "configService:https://github.com/spring-cloud-samples/config-repo/bar.properties":{"foo":"bar"},
+  "servletContextInitParams":{},
+  "systemProperties":{...},
+  ...
+}
+
+
+
+

A property source called ``configService:<URL of remote repository>/<file name> contains the foo property with a value of bar and is highest priority.

+
+
+ + + + + +
+ + +The URL in the property source name is the git repository, not the config server URL. +
+
+
+
+

Sample Application

+
+

You can find a sample application here. +It is a Spring Boot application, so you can run it by using the usual mechanisms (for instance, mvn spring-boot:run). +When it runs, it looks for the config server on http://localhost:8888 (a configurable default), so you can run the server as well to see it all working together.

+
+
+

The sample has a test case where the config server is also started in the same JVM (with a different port), and the test asserts that an +environment property from the git configuration repo is present. +To change the location of the config server, you can set spring.cloud.config.uri in bootstrap.yml (or in system properties and other places).

+
+
+

The test case has a main() method that runs the server in the same way (watch the logs for its port), so you can run the whole system in one process and play with it (for example, you can run the main() method in your IDE). +The main() method uses target/config for the working directory of the git repository, so you can make local changes there and see them reflected in the running app. The following example shows a session of tinkering with the test case:

+
+
+
+
$ curl localhost:8080/env/sample
+mytest
+$ vi target/config/mytest.properties
+.. change value of "sample", optionally commit
+$ curl localhost:8080/refresh
+["sample"]
+$ curl localhost:8080/env/sample
+sampleValue
+
+
+
+

The refresh endpoint reports that the "sample" property changed.

+
+
+
+
+
+

Building

+
+
+

Basic Compile and Test

+
+

To build the source you will need to install JDK 1.7.

+
+
+

Spring Cloud uses Maven for most build-related activities, and you +should be able to get off the ground quite quickly by cloning the +project you are interested in and typing

+
+
+
+
$ ./mvnw install
+
+
+
+ + + + + +
+ + +You can also install Maven (>=3.3.3) yourself and run the mvn command +in place of ./mvnw in the examples below. If you do that you also +might need to add -P spring if your local Maven settings do not +contain repository declarations for spring pre-release artifacts. +
+
+
+ + + + + +
+ + +Be aware that you might need to increase the amount of memory +available to Maven by setting a MAVEN_OPTS environment variable with +a value like -Xmx512m -XX:MaxPermSize=128m. We try to cover this in +the .mvn configuration, so if you find you have to do it to make a +build succeed, please raise a ticket to get the settings added to +source control. +
+
+
+

For hints on how to build the project look in .travis.yml if there +is one. There should be a "script" and maybe "install" command. Also +look at the "services" section to see if any services need to be +running locally (e.g. mongo or rabbit). Ignore the git-related bits +that you might find in "before_install" since they’re related to setting git +credentials and you already have those.

+
+
+

The projects that require middleware generally include a +docker-compose.yml, so consider using +Docker Compose to run the middeware servers +in Docker containers. See the README in the +scripts demo +repository for specific instructions about the common cases of mongo, +rabbit and redis.

+
+
+ + + + + +
+ + +If all else fails, build with the command from .travis.yml (usually +./mvnw install). +
+
+
+
+

Documentation

+
+

The spring-cloud-build module has a "docs" profile, and if you switch +that on it will try to build asciidoc sources from +src/main/asciidoc. As part of that process it will look for a +README.adoc and process it by loading all the includes, but not +parsing or rendering it, just copying it to ${main.basedir} +(defaults to ${basedir}, i.e. the root of the project). If there are +any changes in the README it will then show up after a Maven build as +a modified file in the correct place. Just commit it and push the change.

+
+
+
+

Working with the code

+
+

If you don’t have an IDE preference we would recommend that you use +Spring Tools Suite or +Eclipse when working with the code. We use the +m2eclipse eclipse plugin for maven support. Other IDEs and tools +should also work without issue as long as they use Maven 3.3.3 or better.

+
+
+

Importing into eclipse with m2eclipse

+
+

We recommend the m2eclipse eclipse plugin when working with +eclipse. If you don’t already have m2eclipse installed it is available from the "eclipse +marketplace".

+
+
+ + + + + +
+ + +Older versions of m2e do not support Maven 3.3, so once the +projects are imported into Eclipse you will also need to tell +m2eclipse to use the right profile for the projects. If you +see many different errors related to the POMs in the projects, check +that you have an up to date installation. If you can’t upgrade m2e, +add the "spring" profile to your settings.xml. Alternatively you can +copy the repository settings from the "spring" profile of the parent +pom into your settings.xml. +
+
+
+
+

Importing into eclipse without m2eclipse

+
+

If you prefer not to use m2eclipse you can generate eclipse project metadata using the +following command:

+
+
+
+
$ ./mvnw eclipse:eclipse
+
+
+
+

The generated eclipse projects can be imported by selecting import existing projects +from the file menu.

+
+
+
+
+

JCE

+
+

If you get an exception due to "Illegal key size" and you are using Sun’s JDK, you need to install the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files. +See the following links for more information:

+
+ + + +
+

Extract the JCE files into the JDK/jre/lib/security folder for whichever version of JRE/JDK x64/x86 you use.

+
+
+
+
+
+

Contributing

+
+
+

Spring Cloud is released under the non-restrictive Apache 2.0 license, +and follows a very standard Github development process, using Github +tracker for issues and merging pull requests into master. If you want +to contribute even something trivial please do not hesitate, but +follow the guidelines below.

+
+
+

Sign the Contributor License Agreement

+
+

Before we accept a non-trivial patch or pull request we will need you to sign the +Contributor License Agreement. +Signing the contributor’s agreement does not grant anyone commit rights to the main +repository, but it does mean that we can accept your contributions, and you will get an +author credit if we do. Active contributors might be asked to join the core team, and +given the ability to merge pull requests.

+
+
+
+

Code of Conduct

+
+

This project adheres to the Contributor Covenant code of +conduct. By participating, you are expected to uphold this code. Please report +unacceptable behavior to spring-code-of-conduct@pivotal.io.

+
+
+
+

Code Conventions and Housekeeping

+
+

None of these is essential for a pull request, but they will all help. They can also be +added after the original pull request but before a merge.

+
+
+
    +
  • +

    Use the Spring Framework code format conventions. If you use Eclipse +you can import formatter settings using the +eclipse-code-formatter.xml file from the +Spring +Cloud Build project. If using IntelliJ, you can use the +Eclipse Code Formatter +Plugin to import the same file.

    +
  • +
  • +

    Make sure all new .java files to have a simple Javadoc class comment with at least an +@author tag identifying you, and preferably at least a paragraph on what the class is +for.

    +
  • +
  • +

    Add the ASF license header comment to all new .java files (copy from existing files +in the project)

    +
  • +
  • +

    Add yourself as an @author to the .java files that you modify substantially (more +than cosmetic changes).

    +
  • +
  • +

    Add some Javadocs and, if you change the namespace, some XSD doc elements.

    +
  • +
  • +

    A few unit tests would help a lot as well — someone has to do it.

    +
  • +
  • +

    If no-one else is using your branch, please rebase it against the current master (or +other target branch in the main project).

    +
  • +
  • +

    When writing a commit message please follow these conventions, +if you are fixing an existing issue please add Fixes gh-XXXX at the end of the commit +message (where XXXX is the issue number).

    +
  • +
+
+
+
+

Checkstyle

+
+

Spring Cloud Build comes with a set of checkstyle rules. You can find them in the spring-cloud-build-tools module. The most notable files under the module are:

+
+
+
spring-cloud-build-tools/
+
+
└── src
+    ├── checkstyle
+    │   └── checkstyle-suppressions.xml (3)
+    └── main
+        └── resources
+            ├── checkstyle-header.txt (2)
+            └── checkstyle.xml (1)
+
+
+
+ + + + + + + + + + + + + +
1Default Checkstyle rules
2File header setup
3Default suppression rules
+
+
+

Checkstyle configuration

+
+

Checkstyle rules are disabled by default. To add checkstyle to your project just define the following properties and plugins.

+
+
+
pom.xml
+
+
<properties>
+<maven-checkstyle-plugin.failsOnError>true</maven-checkstyle-plugin.failsOnError> (1)
+        <maven-checkstyle-plugin.failsOnViolation>true
+        </maven-checkstyle-plugin.failsOnViolation> (2)
+        <maven-checkstyle-plugin.includeTestSourceDirectory>true
+        </maven-checkstyle-plugin.includeTestSourceDirectory> (3)
+</properties>
+
+<build>
+        <plugins>
+            <plugin> (4)
+                <groupId>io.spring.javaformat</groupId>
+                <artifactId>spring-javaformat-maven-plugin</artifactId>
+            </plugin>
+            <plugin> (5)
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+            </plugin>
+        </plugins>
+
+    <reporting>
+        <plugins>
+            <plugin> (5)
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </reporting>
+</build>
+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
1Fails the build upon Checkstyle errors
2Fails the build upon Checkstyle violations
3Checkstyle analyzes also the test sources
4Add the Spring Java Format plugin that will reformat your code to pass most of the Checkstyle formatting rules
5Add checkstyle plugin to your build and reporting phases
+
+
+

If you need to suppress some rules (e.g. line length needs to be longer), then it’s enough for you to define a file under ${project.root}/src/checkstyle/checkstyle-suppressions.xml with your suppressions. Example:

+
+
+
projectRoot/src/checkstyle/checkstyle-suppresions.xml
+
+
<?xml version="1.0"?>
+<!DOCTYPE suppressions PUBLIC
+		"-//Puppy Crawl//DTD Suppressions 1.1//EN"
+		"https://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
+<suppressions>
+	<suppress files=".*ConfigServerApplication\.java" checks="HideUtilityClassConstructor"/>
+	<suppress files=".*ConfigClientWatch\.java" checks="LineLengthCheck"/>
+</suppressions>
+
+
+
+

It’s advisable to copy the ${spring-cloud-build.rootFolder}/.editorconfig and ${spring-cloud-build.rootFolder}/.springformat to your project. That way, some default formatting rules will be applied. You can do so by running this script:

+
+
+
+
$ curl https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/.editorconfig -o .editorconfig
+$ touch .springformat
+
+
+
+
+
+

IDE setup

+
+

Intellij IDEA

+
+

In order to setup Intellij you should import our coding conventions, inspection profiles and set up the checkstyle plugin. +The following files can be found in the Spring Cloud Build project.

+
+
+
spring-cloud-build-tools/
+
+
└── src
+    ├── checkstyle
+    │   └── checkstyle-suppressions.xml (3)
+    └── main
+        └── resources
+            ├── checkstyle-header.txt (2)
+            ├── checkstyle.xml (1)
+            └── intellij
+                ├── Intellij_Project_Defaults.xml (4)
+                └── Intellij_Spring_Boot_Java_Conventions.xml (5)
+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
1Default Checkstyle rules
2File header setup
3Default suppression rules
4Project defaults for Intellij that apply most of Checkstyle rules
5Project style conventions for Intellij that apply most of Checkstyle rules
+
+
+
+Code style +
+
Figure 1. Code style
+
+
+

Go to FileSettingsEditorCode style. There click on the icon next to the Scheme section. There, click on the Import Scheme value and pick the Intellij IDEA code style XML option. Import the spring-cloud-build-tools/src/main/resources/intellij/Intellij_Spring_Boot_Java_Conventions.xml file.

+
+
+
+Code style +
+
Figure 2. Inspection profiles
+
+
+

Go to FileSettingsEditorInspections. There click on the icon next to the Profile section. There, click on the Import Profile and import the spring-cloud-build-tools/src/main/resources/intellij/Intellij_Project_Defaults.xml file.

+
+
+
Checkstyle
+

To have Intellij work with Checkstyle, you have to install the Checkstyle plugin. It’s advisable to also install the Assertions2Assertj to automatically convert the JUnit assertions

+
+
+
+Checkstyle +
+
+
+

Go to FileSettingsOther settingsCheckstyle. There click on the + icon in the Configuration file section. There, you’ll have to define where the checkstyle rules should be picked from. In the image above, we’ve picked the rules from the cloned Spring Cloud Build repository. However, you can point to the Spring Cloud Build’s GitHub repository (e.g. for the checkstyle.xml : https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml). We need to provide the following variables:

+
+
+ +
+
+ + + + + +
+ + +Remember to set the Scan Scope to All sources since we apply checkstyle rules for production and test sources. +
+
+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/css/spring.css b/spring-cloud-config/2.2.0.RELEASE/reference/html/css/spring.css new file mode 100644 index 00000000..40821db3 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/css/spring.css @@ -0,0 +1 @@ +@import url("https://fonts.googleapis.com/css?family=Karla:400,700|Montserrat:400,700");/*! normalize.css v2.1.2 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none !important}html,body{font-size:100%}html{font-family:Karla, sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}body{background:white;color:#000;padding:0;margin:0;font-size:16px;font-family:Karla, sans-serif;font-weight:normal;font-style:normal;line-height:1.6em;position:relative;cursor:auto}a:hover{cursor:pointer}img,object,embed{max-width:100%;height:auto}object,embed{height:100%}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none !important}.left{float:left !important}.right{float:right !important}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}.hide{display:none}.antialiased{-webkit-font-smoothing:antialiased}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}object,svg{display:inline-block;vertical-align:middle}.center{margin-left:auto;margin-right:auto}.spread{width:100%}p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{line-height:1.6}.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#0b0a0a;font-weight:bold;margin-top:0;margin-bottom:0.8em}div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}a{color:#097dff;line-height:inherit;text-decoration:none}a:hover,a:focus{color:#016be2;text-decoration:underline}a img{border:none}p{font-family:inherit;font-weight:normal;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}p aside{font-size:0.875em;line-height:1.35;font-style:italic}h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:Montserrat, sans-serif;font-weight:400;font-style:normal;color:#000;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:0.5em;line-height:1.0125em}h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#867c74;line-height:0}h1{font-size:2.125em}h2{font-size:1.6875em}h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}h4{font-size:1.125em}h5{font-size:1.125em}h6{font-size:1em}hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:bold;line-height:inherit}small{font-size:60%;line-height:inherit}code{font-family:Monaco, Menlo, Consolas, "Courier New", monospace;font-weight:normal;color:#3d3d3c;word-break:break-word}ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}ul,ol{margin-left:1.5em}ul.no-bullet,ol.no-bullet{margin-left:1.5em}ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square}ul.circle{list-style-type:circle}ul.disc{list-style-type:disc}ul.no-bullet{list-style:none}ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}dl dt{margin-bottom:0.3125em;font-weight:bold}dl dd{margin-bottom:1.25em}abbr,acronym{text-transform:uppercase;font-size:90%;color:#000;border-bottom:1px dotted #dddddd;cursor:help}abbr{text-transform:none}blockquote{margin:0 0 1.25em;padding:0.5625em 1.25em 0 1.1875em;border-left:1px solid #dddddd}blockquote cite{display:block;font-size:0.9375em;color:rgba(0,0,0,0.6)}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,0.6)}blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,0.85)}.vcard{display:inline-block;margin:0 0 1.25em 0;border:1px solid #dddddd;padding:0.625em 0.75em}.vcard li{margin:0;display:block}.vcard .fn{font-weight:bold;font-size:0.9375em}.vevent .summary{font-weight:bold}.vevent abbr{cursor:auto;text-decoration:none;font-weight:bold;border:none;padding:0 0.0625em}#tocbot{padding:0 0 1rem 0;line-height:1.5rem;padding-left:25px}.mobile-toc{padding:0 0 1rem 0;line-height:1.5rem}.mobile-toc li a{display:block;padding:.3rem 0}#tocbot ol li{list-style:none;padding:0;margin:0}#tocbot ol{margin:0;padding:0;padding-left:0.6rem}#tocbot .toc-link{display:block;padding-top:4px;padding-bottom:4px;outline:none}table{background:white;margin-bottom:1.25em;border:solid 1px #cacaca;border-spacing:0}table thead,table tfoot{background:#f7f8f7;font-weight:bold}table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:0.5em 0.625em 0.625em;font-size:inherit;color:#000;text-align:left}table tr th,table tr td{padding:0.5625em 0.625em;font-size:inherit;color:#000}table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;tab-size:4}h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-0.05em}.clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}.clearfix:after,.float-group:after{clear:both}*:not(pre)>code{font-size:0.8525em;font-style:normal !important;letter-spacing:0;padding:0.1em 0.3em 0.2em;background-color:rgba(0,0,0,0.05);border-radius:4px;text-rendering:optimizeSpeed}pre,pre>code{line-height:1.85;color:rgba(0,0,0,0.9);font-family:Monaco, Menlo, Consolas, "Courier New", monospace;font-weight:normal;text-rendering:optimizeSpeed;word-break:normal}pre{overflow:auto}em em{font-style:normal}strong strong{font-weight:normal}.keyseq{color:#6b625c}kbd{font-family:Monaco, Menlo, Consolas, "Courier New", monospace;display:inline-block;color:#000;font-size:0.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.2),0 0 0 0.1em white inset;box-shadow:0 1px 0 rgba(0,0,0,0.2),0 0 0 0.1em white inset;margin:0 0.15em;padding:0.2em 0.5em;vertical-align:middle;position:relative;top:-0.1em;white-space:nowrap}.keyseq kbd:first-child{margin-left:0}.keyseq kbd:last-child{margin-right:0}.menuseq,.menu{color:#191715}b.button:before,b.button:after{position:relative;top:-1px;font-weight:normal}b.button:before{content:"[";padding:0 3px 0 2px}b.button:after{content:"]";padding:0 2px 0 3px}p a>code:hover{color:rgba(0,0,0,0.9)}#toc{border-bottom:1px solid #ddddd8;padding-bottom:0.5em}#toc>ul{margin-left:0.125em}#toc ul.sectlevel0>li>a{font-style:italic}#toc ul.sectlevel0 ul.sectlevel1{margin:0.5em 0}#toc ul{list-style-type:none}#toc li{line-height:1.3334}#toc a{text-decoration:none}#toc a:active{text-decoration:underline}#toctitle{color:#0b0a0a;font-size:1.2em;display:none}body.toc2{padding-top:90px;text-rendering:optimizeLegibility}#content #toc{border-style:solid;border-width:1px;border-color:#d7d7d7;margin-bottom:1.25em;padding:1.25em;background:#f1f1f1;-webkit-border-radius:4px;border-radius:4px}#content #toc>:first-child{margin-top:0}#content #toc>:last-child{margin-bottom:0}#footer{padding-bottom:2rem}#footer #footer-text{padding:2rem 0;border-top:1px solid #efefed}#footer-text{color:rgba(0,0,0,0.6);line-height:1.44}.sect1{padding-bottom:0.625em}.sect1+.sect1{border-top:1px solid #efefed}#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;margin-top:0.1rem;display:block;visibility:hidden;text-align:center;font-weight:normal;color:rgba(0,0,0,0.2)}#content h1>a.anchor:hover,h2>a.anchor:hover,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4>a.anchor:hover,h5>a.anchor:hover,h6>a.anchor:hover{color:#097dff;text-decoration:none}#content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\0023";font-size:0.85em;display:block;padding-top:0.1em}#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#000;text-decoration:none}#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#262321}.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:Karla, sans-serif;font-size:1rem}table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0;padding:0.6rem 0}table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}.admonitionblock>table td.icon{text-align:center;vertical-align:top;padding-top:0.8em;width:80px}.admonitionblock>table td.icon img{max-width:initial}.admonitionblock>table td.icon .title{font-weight:bold;font-family:Montserrat, sans-serif;text-transform:uppercase}.admonitionblock>table td.content{padding-left:0em;padding-right:1.25em;border-left:1px solid #ddddd8}.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}.exampleblock>.content{border-style:solid;border-width:0;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#f1f1f1;border-radius:4px}.exampleblock>.content>:first-child{margin-top:0}.exampleblock>.content>:last-child{margin-bottom:0}.sidebarblock{border-style:solid;border-width:0;border-color:#d7d7d7;margin-bottom:1.25em;padding:1.25em;background:#f1f1f1;border-radius:4px;overflow:scroll}.sidebarblock>:first-child{margin-top:0}.sidebarblock>:last-child{margin-bottom:0}.sidebarblock>.content>.title{color:#0b0a0a;margin-top:0;text-align:center}.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#282c33;color:#e6e1dc;border-radius:4px}.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#282c33;color:#e6e1dc}.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class],.listingblock pre:not(.highlight){padding:1em 1.5rem;font-size:0.8125em}.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto}.literalblock.output pre{color:whitesmoke;background-color:rgba(0,0,0,0.9)}.listingblock{white-space:nowrap}.listingblock pre.highlightjs{padding:0.2rem 0}.listingblock pre.highlightjs>code{padding:1em 1.5rem;border-radius:4px}.listingblock>.content{position:relative}.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:0.8em;font-weight:bold;top:0.425rem;right:0.5rem;line-height:1;text-transform:uppercase;color:#999}.listingblock code[data-lang]:before{display:block}.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:0.5em;color:#999}.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}table.pyhltable td.code{padding-left:.75em;padding-right:0}pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}pre.pygments .lineno{display:block;margin-right:.25em}table.pyhltable .linenodiv{background:none !important;padding-right:0 !important}.quoteblock{margin:0 1em 1.25em 1.5em;display:block;text-align:left;padding-left:20px}.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,0.85);line-height:1.75;letter-spacing:0}.quoteblock blockquote{margin:0;padding:0;border:0;position:relative}.quoteblock blockquote:before{content:"\201c";font-size:2.75em;font-weight:bold;line-height:0.6em;margin-left:0em;margin-right:1rem;margin-top:0.8rem;color:rgba(0,0,0,0.1);position:absolute;top:0;left:-30px}.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}.quoteblock .attribution{margin-right:0.5ex}.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:0.5em 0;border-left:3px solid rgba(0,0,0,0.6)}.quoteblock .quoteblock blockquote{padding:0 0 0 0.75em}.quoteblock .quoteblock blockquote:before{display:none}.verseblock{margin:0 1em 1.25em 0;background-color:#f1f1f1;padding:1rem 1.4rem;border-radius:4px}.verseblock pre{font-family:Monaco, Menlo, Consolas, "Courier New", monospace;font-size:0.9rem;color:rgba(0,0,0,0.85);font-weight:300;text-rendering:optimizeLegibility}.verseblock pre strong{font-weight:400}.verseblock .attribution{margin-top:1.25rem;margin-left:0.5ex}.quoteblock .attribution,.verseblock .attribution{font-size:0.9375em;line-height:1.45;font-style:italic}.quoteblock .attribution br,.verseblock .attribution br{display:none}.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-0.025em;color:rgba(0,0,0,0.6)}.quoteblock.abstract{margin:0 0 1.25em 0;display:block}.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}.quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}table.tableblock{max-width:100%;border-collapse:separate;overflow-x:scroll}table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}table.tableblock,th.tableblock,td.tableblock{border:0 solid #cacaca;background:white}table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}table.frame-all{border-width:1px}table.frame-sides{border-width:0 1px}table.frame-topbot{border-width:1px 0}th.halign-left,td.halign-left{text-align:left}th.halign-right,td.halign-right{text-align:right}th.halign-center,td.halign-center{text-align:center}th.valign-top,td.valign-top{vertical-align:top}th.valign-bottom,td.valign-bottom{vertical-align:bottom}th.valign-middle,td.valign-middle{vertical-align:middle}table thead th,table tfoot th{font-weight:bold}tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:#34302d;font-weight:bold}p.tableblock>code:only-child{background:none;padding:0}p.tableblock{font-size:1em}td>div.verse{white-space:pre}ol{margin-left:1.75em}ul li ol{margin-left:1.5em}dl dd{margin-left:1.125em}dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:0.625em}ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}ul.unstyled,ol.unnumbered,ul.checklist{margin-left:0.625em}ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:0.85em}ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}ul.inline{margin:0 auto 0.625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}ul.inline>li>*{display:block}.unstyled dl dt{font-weight:normal;font-style:normal}ol.arabic{list-style-type:decimal}ol.decimal{list-style-type:decimal-leading-zero}ol.loweralpha{list-style-type:lower-alpha}ol.upperalpha{list-style-type:upper-alpha}ol.lowerroman{list-style-type:lower-roman}ol.upperroman{list-style-type:upper-roman}ol.lowergreek{list-style-type:lower-greek}.hdlist>table,.colist>table{border:0;background:none}.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}td.hdlist1,td.hdlist2{vertical-align:top;padding:0 0.625em}td.hdlist1{font-weight:bold;padding-bottom:1.25em}.literalblock+.colist,.listingblock+.colist{margin-top:-0.5em}.colist>table tr>td:first-of-type{padding:0 0.75em;line-height:1}.colist>table tr>td:first-of-type img{max-width:initial}.colist>table tr>td:last-of-type{padding:0.25em 0}.thumb,.th{line-height:0;display:inline-block;border:solid 4px white;-webkit-box-shadow:0 0 0 1px #dddddd;box-shadow:0 0 0 1px #dddddd}.imageblock.left,.imageblock[style*="float: left"]{margin:0.25em 0.625em 1.25em 0}.imageblock.right,.imageblock[style*="float: right"]{margin:0.25em 0 1.25em 0.625em}.imageblock>.title{margin-bottom:0}.imageblock.thumb,.imageblock.th{border-width:6px}.imageblock.thumb>.title,.imageblock.th>.title{padding:0 0.125em}.image.left,.image.right{margin-top:0.25em;margin-bottom:0.25em;display:inline-block;line-height:0}.image.left{margin-right:0.625em}.image.right{margin-left:0.625em}a.image{text-decoration:none;display:inline-block}a.image object{pointer-events:none}sup.footnote,sup.footnoteref{font-size:0.875em;position:static;vertical-align:super}sup.footnote a,sup.footnoteref a{text-decoration:none}sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}#footnotes{padding-top:0.75em;padding-bottom:0.75em;margin-bottom:0.625em}#footnotes hr{width:20%;min-width:6.25em;margin:-0.25em 0 0.75em 0;border-width:1px 0 0 0}#footnotes .footnote{padding:0 0.375em 0 0.225em;line-height:1.3334;font-size:0.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:0.2em}#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}#footnotes .footnote:last-of-type{margin-bottom:0}#content #footnotes{margin-top:-0.625em;margin-bottom:0;padding:0.75em 0}.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}.gist .file-data>table td.line-data{width:99%}div.unbreakable{page-break-inside:avoid}.big{font-size:larger}.small{font-size:smaller}.underline{text-decoration:underline}.overline{text-decoration:overline}.line-through{text-decoration:line-through}.aqua{color:#00bfbf}.aqua-background{background-color:#00fafa}.black{color:black}.black-background{background-color:black}.blue{color:#0000bf}.blue-background{background-color:#0000fa}.fuchsia{color:#bf00bf}.fuchsia-background{background-color:#fa00fa}.gray{color:#606060}.gray-background{background-color:#7d7d7d}.green{color:#006000}.green-background{background-color:#007d00}.lime{color:#00bf00}.lime-background{background-color:#00fa00}.maroon{color:#600000}.maroon-background{background-color:#7d0000}.navy{color:#000060}.navy-background{background-color:#00007d}.olive{color:#606000}.olive-background{background-color:#7d7d00}.purple{color:#600060}.purple-background{background-color:#7d007d}.red{color:#bf0000}.red-background{background-color:#fa0000}.silver{color:#909090}.silver-background{background-color:#bcbcbc}.teal{color:#006060}.teal-background{background-color:#007d7d}.white{color:#bfbfbf}.white-background{background-color:#fafafa}.yellow{color:#bfbf00}.yellow-background{background-color:#fafa00}span.icon>.fa{cursor:default}.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;cursor:default}.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#3f6a22}.admonitionblock td.icon .icon-tip:before{content:"\f0eb";color:#0077b9}.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#d88400}.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}.conum[data-value]{display:inline-block;color:#000 !important;background-color:#ffe157;-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:0.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans", "DejaVu Sans", sans-serif;font-style:normal;font-weight:bold}.conum[data-value] *{color:#fff !important}.conum[data-value]+b{display:none}.conum[data-value]:after{content:attr(data-value)}pre .conum[data-value]{position:relative;top:0;color:#000 !important;background-color:#ffe157;font-size:12px}b.conum *{color:inherit !important}.conum:not([data-value]):empty{display:none}.admonitionblock{background-color:#ecf1e8;padding:0.8em 0;margin:30px 0;width:auto;border-radius:4px;overflow-x:scroll}.admonitionblock.important{border-left:0px solid #e20000;background-color:#f9ebeb}.admonitionblock.warning{border-left:0px solid #d88400;background-color:#fff9e4}.admonitionblock.tip{border-left:0px solid #0077b9;background-color:#e9f1f6}.admonitionblock.caution{border-left:0px solid #e20000;background-color:#f9ebeb}.admonitionblock .exampleblock>.content{border:0 none;background-color:#fff}#toc a:hover{text-decoration:underline}.admonitionblock>table{margin-bottom:0}.admonitionblock>table td.content{border-left:none}@media print{#tocbot a.toc-link.node-name--H4{display:none}}.is-collapsible{max-height:1000px;overflow:hidden;transition:all 200ms ease-in-out}.is-collapsed{max-height:0}div.back-action,#toc.toc2 div.back-action{padding:0.8rem 0 0 0}div.back-action a,#toc.toc2 div.back-action a{position:relative;display:inline-block;padding:0.6rem 1.2rem;padding-left:35px}div.back-action a span,#toc.toc2 div.back-action a span{position:absolute;left:5px;top:5px;display:block;color:#333;height:26px;width:26px;border-radius:13px}div.back-action a i,#toc.toc2 div.back-action a i{position:absolute;top:5px;left:5px}div.back-action a:hover span,#toc.toc2 div.back-action a:hover span{color:#000}#tocbot.desktop-toc{padding-top:0.8rem}#header-spring{position:absolute;text-rendering:optimizeLegibility;top:0;left:0;right:0;height:90px;margin:0 1rem;padding:0 1rem;border-bottom:1px solid #ddddd8;border-top:3px solid #6BB344}#header-spring h1{margin:0;padding:0;font-size:22px;text-align:left;line-height:86px;padding-left:0.6rem}#header-spring h1 svg{width:200px}#header-spring h1 svg .st0{fill:#6BB344}#header-spring h1 svg .st2{fill:#444}body.book #header-spring{position:relative;top:auto;left:auto;right:auto;margin:0}body.book #header>h1:only-child{border:0 none;padding-bottom:1.2rem;font-size:1.8rem}body.book #header,body.book #content,body.book #footnotes,body.book #footer{margin:0 auto}body.toc2 #header-spring{position:absolute;left:0;right:0;top:0}body.toc2 #header>h1:only-child{font-size:2.2rem}body.toc2 #header,body.toc2 #content,body.toc2 #footnotes,body.toc2 #footer{margin:0 auto}body.toc2 #content{padding-top:2rem}#header,#content,#footnotes,#footer{width:100%;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:0.9375em;padding-right:0.9375em}#header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}#header:after,#content:after,#footnotes:after,#footer:after{clear:both}#content{margin-top:1.25em}#content:before{content:none}#header>h1:first-child{margin-top:2.55rem;margin-bottom:0.5em;margin-bottom:0.5em}#header>h1:first-child+#toc{margin-top:8px;border-top:0 none}#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}#header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:0;padding-bottom:2.25em;padding-left:0.25em;color:rgba(0,0,0,0.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}#header .details span:first-child{margin-left:-0.125em}#header .details span.email a{color:rgba(0,0,0,0.85)}#header .details br{display:none}#header .details br+span:before{content:"\00a0\2013\00a0"}#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,0.85)}#header .details br+span#revremark:before{content:"\00a0|\00a0"}#header #revnumber{text-transform:capitalize}#header #revnumber:after{content:"\00a0"}#content>h1:first-child:not([class]){color:rgba(0,0,0,0.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1.5rem;margin-bottom:1.25rem}h1{font-size:2.2rem;letter-spacing:-1px}h1,h2,h3,h4,h5,h6{font-weight:normal;font-family:Montserrat, Arial, Helvetica, sans-serif}h1:focus,h2:focus,h3:focus,h4:focus,h5:focus,h6:focus{box-shadow:none;outline:none}h2,h3,h4,h5,h6{padding:.8rem 0 .4rem}h1{font-size:1.75em}h2{font-size:1.6rem;letter-spacing:-1px}h3{font-size:1.5rem}h4{font-size:1.4rem}h5{font-size:1.3rem}h6{font-size:1.2rem}pre.highlight{background:#232323;color:#e6e1dc;border-radius:4px}pre.highlight code{color:#e6e1dc}pre.highlight a,#toc.toc2 a{color:#000;font-size:1rem}pre.highlight ul.sectlevel1,#toc.toc2 ul.sectlevel1{padding-left:0.2rem}pre.highlight ul.sectlevel1 li,#toc.toc2 ul.sectlevel1 li{line-height:1.4rem}::selection{background-color:#d1ff79}.literalblock pre::selection,.listingblock pre[class="highlight"]::selection,.highlight::selection,pre::selection,.highlight code::selection,.highlight code span::selection{background:rgba(255,255,255,0.2) !important}body.book #header{margin-bottom:2rem}body.toc2 #header{margin-bottom:0}.desktop-toc{display:none}.admonitionblock td.icon{display:none}.admonitionblock>table td.content{padding-left:1.25em}@media only screen and (min-width: 768px){#toctitle{font-size:1.375em}.sect1{padding-bottom:1.25em}.mobile-toc{display:none}.desktop-toc{display:block}.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:0.90625em}.admonitionblock td.icon{display:table-cell}.admonitionblock>table td.content{padding-left:0}body.toc2{padding-right:0}body.toc2 #toc.toc2{position:absolute;margin-top:0 !important;width:15em;top:0;border-top-width:0 !important;border-bottom-width:0 !important;margin-left:-15.9375em;z-index:1000;padding:0 1em 1.25em 0em;overflow:auto}body.toc2 #toc.toc2 #toctitle{margin-top:0;margin-bottom:0.8rem;font-size:1.2em}body.toc2 #toc.toc2>ul{font-size:0.9em;margin-bottom:0}body.toc2 #toc.toc2 ul ul{margin-left:0;padding-left:1em}body.toc2 #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:0.5em;margin-bottom:0.5em}body.toc2 #header,body.toc2 #content,body.toc2 #footnotes,body.toc2 #footer{padding-left:15.9375em;max-width:none}body.book #header-spring h1{max-width:1400px;margin:0 auto}body.book #header,body.book #content,body.book #footnotes,body.book #footer{max-width:1400px}body.is-position-fixed #toc.toc2{position:fixed;height:100%}h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}h1{font-size:1.75em}h2{font-size:1.6em}h3,#toctitle,.sidebarblock>.content>.title{font-size:1.5em}h4{font-size:1.4em}h5{font-size:1.2em}h6{font-size:1.2em}#tocbot a.toc-link.node-name--H1{font-style:italic}#tocbot ol{margin:0;padding:0;padding-left:0.6rem}#tocbot ol li{list-style:none;padding:0 0;margin:0;display:block}#tocbot{z-index:999}#tocbot .toc-link{position:relative;display:block;z-index:999;padding-right:5px;padding-top:4px;padding-bottom:4px}#tocbot .is-active-link{padding-right:3px;border-right:3px solid #6BB344}}@media only screen and (min-width: 768px){#tocbot>ul.toc-list{margin-bottom:0.5em;margin-left:0.125em}#tocbot ul.sectlevel0,#tocbot a.toc-link.node-name--H1+ul{padding-left:0}#tocbot a.toc-link{height:100%}.is-collapsible{max-height:3000px;overflow:hidden}.is-collapsed{max-height:0}.is-active-link{font-weight:700}}@media only screen and (min-width: 768px){body.toc2 #header,body.toc2 #content,body.toc2 #footer{background-repeat:repeat-y;background-position:14em 0;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDE0NUNENzNGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDE0NUNENzRGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMTQ1Q0Q3MUYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEMTQ1Q0Q3MkYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjmGxxYAAAAGUExURd3d2AAAAJlCnKAAAAAMSURBVHjaYmAACDAAAAIAAU9tWeEAAAAASUVORK5CYII=)}}@media only screen and (min-width: 1280px){body.toc2{padding-right:0}body.toc2 #toc.toc2{width:25em;left:auto;margin-left:-26.9375em}body.toc2 #toc.toc2 #toctitle{font-size:1.375em}body.toc2 #toc.toc2>ul{font-size:0.95em}body.toc2 #toc.toc2 ul ul{padding-left:1.25em}body.toc2 body.toc2.toc-right{padding-left:0;padding-right:20em}body.toc2 #header,body.toc2 #content,body.toc2 #footnotes,body.toc2 #footer{padding-left:26.9375em;max-width:1400px}body.toc2 #header-spring h1{margin:0 auto;max-width:1400px}.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:0.8125em}body.toc2 #header,body.toc2 #content,body.toc2 #footer{background-repeat:repeat-y;background-position:24em 0;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDE0NUNENzNGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDE0NUNENzRGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMTQ1Q0Q3MUYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEMTQ1Q0Q3MkYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjmGxxYAAAAGUExURd3d2AAAAJlCnKAAAAAMSURBVHjaYmAACDAAAAIAAU9tWeEAAAAASUVORK5CYII=)}} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/favicon.ico b/spring-cloud-config/2.2.0.RELEASE/reference/html/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1a4956e64705230122da8c19d762a7f8e6971533 GIT binary patch literal 111804 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 Pn5$L + + + + + + +Spring Cloud Config + + + + + + + + + + +
+
+
+
+

2.2.0.RELEASE

+
+
+

Spring Cloud Config provides server-side and client-side support for externalized configuration in a distributed system. With the Config Server, you have a central place to manage external properties for applications across all environments. +The concepts on both client and server map identically to the Spring Environment and PropertySource abstractions, so they fit very well with Spring applications but can be used with any application running in any language. +As an application moves through the deployment pipeline from dev to test and into production, you can manage the configuration between those environments and be certain that applications have everything they need to run when they migrate. +The default implementation of the server storage backend uses git, so it easily supports labelled versions of configuration environments as well as being accessible to a wide range of tooling for managing the content. +It is easy to add alternative implementations and plug them in with Spring configuration.

+
+
+
+
+

Quick Start

+
+
+

This quick start walks through using both the server and the client of Spring Cloud Config Server.

+
+
+

First, start the server, as follows:

+
+
+
+
$ cd spring-cloud-config-server
+$ ../mvnw spring-boot:run
+
+
+
+

The server is a Spring Boot application, so you can run it from your IDE if you prefer to do so (the main class is ConfigServerApplication).

+
+
+

Next try out a client, as follows:

+
+
+
+
$ curl localhost:8888/foo/development
+{"name":"foo","label":"master","propertySources":[
+  {"name":"https://github.com/scratches/config-repo/foo-development.properties","source":{"bar":"spam"}},
+  {"name":"https://github.com/scratches/config-repo/foo.properties","source":{"foo":"bar"}}
+]}
+
+
+
+

The default strategy for locating property sources is to clone a git repository (at spring.cloud.config.server.git.uri) and use it to initialize a mini SpringApplication. +The mini-application’s Environment is used to enumerate property sources and publish them at a JSON endpoint.

+
+
+

The HTTP service has resources in the following form:

+
+
+
+
/{application}/{profile}[/{label}]
+/{application}-{profile}.yml
+/{label}/{application}-{profile}.yml
+/{application}-{profile}.properties
+/{label}/{application}-{profile}.properties
+
+
+
+

where application is injected as the spring.config.name in the SpringApplication (what is normally application in a regular Spring Boot app), profile is an active profile (or comma-separated list of properties), and label is an optional git label (defaults to master.)

+
+
+

Spring Cloud Config Server pulls configuration for remote clients from various sources. The following example gets configuration from a git repository (which must be provided), as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+
+
+
+

Other sources are any JDBC compatible database, Subversion, Hashicorp Vault, Credhub and local filesystems.

+
+
+

Client Side Usage

+
+

To use these features in an application, you can build it as a Spring Boot application that depends on spring-cloud-config-client (for an example, see the test cases for the config-client or the sample application). +The most convenient way to add the dependency is with a Spring Boot starter org.springframework.cloud:spring-cloud-starter-config. +There is also a parent pom and BOM (spring-cloud-starter-parent) for Maven users and a Spring IO version management properties file for Gradle and Spring CLI users. The following example shows a typical Maven configuration:

+
+
+
pom.xml
+
+
   <parent>
+       <groupId>org.springframework.boot</groupId>
+       <artifactId>spring-boot-starter-parent</artifactId>
+       <version>{spring-boot-docs-version}</version>
+       <relativePath /> <!-- lookup parent from repository -->
+   </parent>
+
+<dependencyManagement>
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-dependencies</artifactId>
+			<version>{spring-cloud-version}</version>
+			<type>pom</type>
+			<scope>import</scope>
+		</dependency>
+	</dependencies>
+</dependencyManagement>
+
+<dependencies>
+	<dependency>
+		<groupId>org.springframework.cloud</groupId>
+		<artifactId>spring-cloud-starter-config</artifactId>
+	</dependency>
+	<dependency>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-test</artifactId>
+		<scope>test</scope>
+	</dependency>
+</dependencies>
+
+<build>
+	<plugins>
+           <plugin>
+               <groupId>org.springframework.boot</groupId>
+               <artifactId>spring-boot-maven-plugin</artifactId>
+           </plugin>
+	</plugins>
+</build>
+
+   <!-- repositories also needed for snapshots and milestones -->
+
+
+
+

Now you can create a standard Spring Boot application, such as the following HTTP server:

+
+
+
+
@SpringBootApplication
+@RestController
+public class Application {
+
+    @RequestMapping("/")
+    public String home() {
+        return "Hello World!";
+    }
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+
+}
+
+
+
+

When this HTTP server runs, it picks up the external configuration from the default local config server (if it is running) on port 8888. +To modify the startup behavior, you can change the location of the config server by using bootstrap.properties (similar to application.properties but for the bootstrap phase of an application context), as shown in the following example:

+
+
+
+
spring.cloud.config.uri: http://myconfigserver.com
+
+
+
+

By default, if no application name is set, application will be used. To modify the name, the following property can be added to the bootstrap.properties file:

+
+
+
+
spring.application.name: myapp
+
+
+
+ + + + + +
+ + +When setting the property ${spring.application.name} do not prefix your app name with the reserved word application- to prevent issues resolving the correct property source. +
+
+
+

The bootstrap properties show up in the /env endpoint as a high-priority property source, as shown in the following example.

+
+
+
+
$ curl localhost:8080/env
+{
+  "profiles":[],
+  "configService:https://github.com/spring-cloud-samples/config-repo/bar.properties":{"foo":"bar"},
+  "servletContextInitParams":{},
+  "systemProperties":{...},
+  ...
+}
+
+
+
+

A property source called ``configService:<URL of remote repository>/<file name> contains the foo property with a value of bar and is highest priority.

+
+
+ + + + + +
+ + +The URL in the property source name is the git repository, not the config server URL. +
+
+
+
+
+
+

Spring Cloud Config Server

+
+
+

Spring Cloud Config Server provides an HTTP resource-based API for external configuration (name-value pairs or equivalent YAML content). +The server is embeddable in a Spring Boot application, by using the @EnableConfigServer annotation. +Consequently, the following application is a config server:

+
+
+
ConfigServer.java
+
+
@SpringBootApplication
+@EnableConfigServer
+public class ConfigServer {
+  public static void main(String[] args) {
+    SpringApplication.run(ConfigServer.class, args);
+  }
+}
+
+
+
+

Like all Spring Boot applications, it runs on port 8080 by default, but you can switch it to the more conventional port 8888 in various ways. +The easiest, which also sets a default configuration repository, is by launching it with spring.config.name=configserver (there is a configserver.yml in the Config Server jar). +Another is to use your own application.properties, as shown in the following example:

+
+
+
application.properties
+
+
server.port: 8888
+spring.cloud.config.server.git.uri: file://${user.home}/config-repo
+
+
+
+

where ${user.home}/config-repo is a git repository containing YAML and properties files.

+
+
+ + + + + +
+ + +On Windows, you need an extra "/" in the file URL if it is absolute with a drive prefix (for example,file:///${user.home}/config-repo). +
+
+
+ + + + + +
+ + +
+

The following listing shows a recipe for creating the git repository in the preceding example:

+
+
+
+
$ cd $HOME
+$ mkdir config-repo
+$ cd config-repo
+$ git init .
+$ echo info.foo: bar > application.properties
+$ git add -A .
+$ git commit -m "Add application.properties"
+
+
+
+
+
+ + + + + +
+ + +Using the local filesystem for your git repository is intended for testing only. +You should use a server to host your configuration repositories in production. +
+
+
+ + + + + +
+ + +The initial clone of your configuration repository can be quick and efficient if you keep only text files in it. +If you store binary files, especially large ones, you may experience delays on the first request for configuration or encounter out of memory errors in the server. +
+
+
+

Environment Repository

+
+

Where should you store the configuration data for the Config Server? +The strategy that governs this behaviour is the EnvironmentRepository, serving Environment objects. +This Environment is a shallow copy of the domain from the Spring Environment (including propertySources as the main feature). +The Environment resources are parametrized by three variables:

+
+
+
    +
  • +

    {application}, which maps to spring.application.name on the client side.

    +
  • +
  • +

    {profile}, which maps to spring.profiles.active on the client (comma-separated list).

    +
  • +
  • +

    {label}, which is a server side feature labelling a "versioned" set of config files.

    +
  • +
+
+
+

Repository implementations generally behave like a Spring Boot application, loading configuration files from a spring.config.name equal to the {application} parameter, and spring.profiles.active equal to the {profiles} parameter. +Precedence rules for profiles are also the same as in a regular Spring Boot application: Active profiles take precedence over defaults, and, if there are multiple profiles, the last one wins (similar to adding entries to a Map).

+
+
+

The following sample client application has this bootstrap configuration:

+
+
+
bootstrap.yml
+
+
spring:
+  application:
+    name: foo
+  profiles:
+    active: dev,mysql
+
+
+
+

(As usual with a Spring Boot application, these properties could also be set by environment variables or command line arguments).

+
+
+

If the repository is file-based, the server creates an +Environment from application.yml (shared between all clients) and +foo.yml (with foo.yml taking precedence). +If the YAML files have documents inside them that point to Spring profiles, those are applied with higher precedence (in order of the profiles listed). +If there are profile-specific YAML (or properties) files, these are also applied with higher precedence than the defaults. +Higher precedence translates to a PropertySource listed earlier in the Environment. +(These same rules apply in a standalone Spring Boot application.)

+
+
+

You can set spring.cloud.config.server.accept-empty to false so that Server would return a HTTP 404 status, if the application is not found.By default, this flag is set to true.

+
+
+

Git Backend

+
+

The default implementation of EnvironmentRepository uses a Git backend, which is very convenient for managing upgrades and physical environments and for auditing changes. +To change the location of the repository, you can set the spring.cloud.config.server.git.uri configuration property in the Config Server (for example in application.yml). +If you set it with a file: prefix, it should work from a local repository so that you can get started quickly and easily without a server. However, in that case, the server operates directly on the local repository without cloning it (it does not matter if it is not bare because the Config Server never makes changes to the "remote" repository). +To scale the Config Server up and make it highly available, you need to have all instances of the server pointing to the same repository, so only a shared file system would work. +Even in that case, it is better to use the ssh: protocol for a shared filesystem repository, so that the server can clone it and use a local working copy as a cache.

+
+
+

This repository implementation maps the {label} parameter of the HTTP resource to a git label (commit id, branch name, or tag). +If the git branch or tag name contains a slash (/), then the label in the HTTP URL should instead be specified with the special string (_) (to avoid ambiguity with other URL paths). +For example, if the label is foo/bar, replacing the slash would result in the following label: foo(_)bar. +The inclusion of the special string (_) can also be applied to the {application} parameter. +If you use a command-line client such as curl, be careful with the brackets in the URL — you should escape them from the shell with single quotes ('').

+
+
+
Skipping SSL Certificate Validation
+
+

The configuration server’s validation of the Git server’s SSL certificate can be disabled by setting the git.skipSslValidation property to true (default is false).

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://example.com/my/repo
+          skipSslValidation: true
+
+
+
+
+
Setting HTTP Connection Timeout
+
+

You can configure the time, in seconds, that the configuration server will wait to acquire an HTTP connection. Use the git.timeout property.

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://example.com/my/repo
+          timeout: 4
+
+
+
+
+
Placeholders in Git URI
+
+

Spring Cloud Config Server supports a git repository URL with placeholders for the {application} and {profile} (and {label} if you need it, but remember that the label is applied as a git label anyway). +So you can support a “one repository per application” policy by using a structure similar to the following:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/myorg/{application}
+
+
+
+

You can also support a “one repository per profile” policy by using a similar pattern but with +{profile}.

+
+
+

Additionally, using the special string "(_)" within your {application} parameters can enable support for multiple +organizations, as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/{application}
+
+
+
+

where {application} is provided at request time in the following format: organization(_)application.

+
+
+
+
Pattern Matching and Multiple Repositories
+
+

Spring Cloud Config also includes support for more complex requirements with pattern +matching on the application and profile name. +The pattern format is a comma-separated list of {application}/{profile} names with wildcards (note that a pattern beginning with a wildcard may need to be quoted), as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          repos:
+            simple: https://github.com/simple/config-repo
+            special:
+              pattern: special*/dev*,*special*/dev*
+              uri: https://github.com/special/config-repo
+            local:
+              pattern: local*
+              uri: file:/home/configsvc/config-repo
+
+
+
+

If {application}/{profile} does not match any of the patterns, it uses the default URI defined under spring.cloud.config.server.git.uri. +In the above example, for the “simple” repository, the pattern is simple/* (it only matches one application named simple in all profiles). The “local” repository matches all application names beginning with local in all profiles (the /* suffix is added automatically to any pattern that does not have a profile matcher).

+
+
+ + + + + +
+ + +The “one-liner” short cut used in the “simple” example can be used only if the only property to be set is the URI. +If you need to set anything else (credentials, pattern, and so on) you need to use the full form. +
+
+
+

The pattern property in the repo is actually an array, so you can use a YAML array (or [0], [1], etc. suffixes in properties files) to bind to multiple patterns. +You may need to do so if you are going to run apps with multiple profiles, as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          repos:
+            development:
+              pattern:
+                - '*/development'
+                - '*/staging'
+              uri: https://github.com/development/config-repo
+            staging:
+              pattern:
+                - '*/qa'
+                - '*/production'
+              uri: https://github.com/staging/config-repo
+
+
+
+ + + + + +
+ + +Spring Cloud guesses that a pattern containing a profile that does not end in * implies that you actually want to match a list of profiles starting with this pattern (so */staging is a shortcut for ["*/staging", "*/staging,*"], and so on). +This is common where, for instance, you need to run applications in the “development” profile locally but also the “cloud” profile remotely. +
+
+
+

Every repository can also optionally store config files in sub-directories, and patterns to search for those directories can be specified as searchPaths. +The following example shows a config file at the top level:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          searchPaths: foo,bar*
+
+
+
+

In the preceding example, the server searches for config files in the top level and in the foo/ sub-directory and also any sub-directory whose name begins with bar.

+
+
+

By default, the server clones remote repositories when configuration +is first requested. +The server can be configured to clone the repositories at startup, as shown in the following top-level example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://git/common/config-repo.git
+          repos:
+            team-a:
+                pattern: team-a-*
+                cloneOnStart: true
+                uri: https://git/team-a/config-repo.git
+            team-b:
+                pattern: team-b-*
+                cloneOnStart: false
+                uri: https://git/team-b/config-repo.git
+            team-c:
+                pattern: team-c-*
+                uri: https://git/team-a/config-repo.git
+
+
+
+

In the preceding example, the server clones team-a’s config-repo on startup, before it +accepts any requests. +All other repositories are not cloned until configuration from the repository is requested.

+
+
+ + + + + +
+ + +Setting a repository to be cloned when the Config Server starts up can help to identify a misconfigured configuration source (such as an invalid repository URI) quickly, while the Config Server is starting up. +With cloneOnStart not enabled for a configuration source, the Config Server may start successfully with a misconfigured or invalid configuration source and not detect an error until an application requests configuration from that configuration source. +
+
+
+
+
Authentication
+
+

To use HTTP basic authentication on the remote repository, add the username and password properties separately (not in the URL), as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          username: trolley
+          password: strongpassword
+
+
+
+

If you do not use HTTPS and user credentials, SSH should also work out of the box when you store keys in the default directories (~/.ssh) and the URI points to an SSH location, such as git@github.com:configuration/cloud-configuration. +It is important that an entry for the Git server be present in the ~/.ssh/known_hosts file and that it is in ssh-rsa format. +Other formats (such as ecdsa-sha2-nistp256) are not supported. +To avoid surprises, you should ensure that only one entry is present in the known_hosts file for the Git server and that it matches the URL you provided to the config server. +If you use a hostname in the URL, you want to have exactly that (not the IP) in the known_hosts file. +The repository is accessed by using JGit, so any documentation you find on that should be applicable. +HTTPS proxy settings can be set in ~/.git/config or (in the same way as for any other JVM process) with +system properties (-Dhttps.proxyHost and -Dhttps.proxyPort).

+
+
+ + + + + +
+ + +If you do not know where your ~/.git directory is, use git config --global to manipulate the settings (for example, git config --global http.sslVerify false). +
+
+
+
+
Authentication with AWS CodeCommit
+
+

Spring Cloud Config Server also supports AWS CodeCommit authentication. +AWS CodeCommit uses an authentication helper when using Git from the command line. +This helper is not used with the JGit library, so a JGit CredentialProvider for AWS CodeCommit is created if the Git URI matches the AWS CodeCommit pattern. +AWS CodeCommit URIs follow this pattern://git-codecommit.${AWS_REGION}.amazonaws.com/${repopath}.

+
+
+

If you provide a username and password with an AWS CodeCommit URI, they must be the AWS accessKeyId and secretAccessKey that provide access to the repository. +If you do not specify a username and password, the accessKeyId and secretAccessKey are retrieved by using the AWS Default Credential Provider Chain.

+
+
+

If your Git URI matches the CodeCommit URI pattern (shown earlier), you must provide valid AWS credentials in the username and password or in one of the locations supported by the default credential provider chain. +AWS EC2 instances may use IAM Roles for EC2 Instances.

+
+
+ + + + + +
+ + +The aws-java-sdk-core jar is an optional dependency. +If the aws-java-sdk-core jar is not on your classpath, the AWS Code Commit credential provider is not created, regardless of the git server URI. +
+
+
+
+
Authentication with Google Cloud Source
+
+

Spring Cloud Config Server also supports authenticating against Google Cloud Source repositories.

+
+
+

If your Git URI uses the http or https protocol and the domain name is source.developers.google.com, the Google Cloud Source credentials provider will be used. A Google Cloud Source repository URI has the format https://source.developers.google.com/p/${GCP_PROJECT}/r/${REPO}. To obtain the URI for your repository, click on "Clone" in the Google Cloud Source UI, and select "Manually generated credentials". Do not generate any credentials, simply copy the displayed URI.

+
+
+

The Google Cloud Source credentials provider will use Google Cloud Platform application default credentials. See Google Cloud SDK documentation on how to create application default credentials for a system. This approach will work for user accounts in dev environments and for service accounts in production environments.

+
+
+ + + + + +
+ + +com.google.auth:google-auth-library-oauth2-http is an optional dependency. +If the google-auth-library-oauth2-http jar is not on your classpath, the Google Cloud Source credential provider is not created, regardless of the git server URI. +
+
+
+
+
Git SSH configuration using properties
+
+

By default, the JGit library used by Spring Cloud Config Server uses SSH configuration files such as ~/.ssh/known_hosts and /etc/ssh/ssh_config when connecting to Git repositories by using an SSH URI. +In cloud environments such as Cloud Foundry, the local filesystem may be ephemeral or not easily accessible. +For those cases, SSH configuration can be set by using Java properties. +In order to activate property-based SSH configuration, the spring.cloud.config.server.git.ignoreLocalSshSettings property must be set to true, as shown in the following example:

+
+
+
+
  spring:
+    cloud:
+      config:
+        server:
+          git:
+            uri: git@gitserver.com:team/repo1.git
+            ignoreLocalSshSettings: true
+            hostKey: someHostKey
+            hostKeyAlgorithm: ssh-rsa
+            privateKey: |
+                         -----BEGIN RSA PRIVATE KEY-----
+                         MIIEpgIBAAKCAQEAx4UbaDzY5xjW6hc9jwN0mX33XpTDVW9WqHp5AKaRbtAC3DqX
+                         IXFMPgw3K45jxRb93f8tv9vL3rD9CUG1Gv4FM+o7ds7FRES5RTjv2RT/JVNJCoqF
+                         ol8+ngLqRZCyBtQN7zYByWMRirPGoDUqdPYrj2yq+ObBBNhg5N+hOwKjjpzdj2Ud
+                         1l7R+wxIqmJo1IYyy16xS8WsjyQuyC0lL456qkd5BDZ0Ag8j2X9H9D5220Ln7s9i
+                         oezTipXipS7p7Jekf3Ywx6abJwOmB0rX79dV4qiNcGgzATnG1PkXxqt76VhcGa0W
+                         DDVHEEYGbSQ6hIGSh0I7BQun0aLRZojfE3gqHQIDAQABAoIBAQCZmGrk8BK6tXCd
+                         fY6yTiKxFzwb38IQP0ojIUWNrq0+9Xt+NsypviLHkXfXXCKKU4zUHeIGVRq5MN9b
+                         BO56/RrcQHHOoJdUWuOV2qMqJvPUtC0CpGkD+valhfD75MxoXU7s3FK7yjxy3rsG
+                         EmfA6tHV8/4a5umo5TqSd2YTm5B19AhRqiuUVI1wTB41DjULUGiMYrnYrhzQlVvj
+                         5MjnKTlYu3V8PoYDfv1GmxPPh6vlpafXEeEYN8VB97e5x3DGHjZ5UrurAmTLTdO8
+                         +AahyoKsIY612TkkQthJlt7FJAwnCGMgY6podzzvzICLFmmTXYiZ/28I4BX/mOSe
+                         pZVnfRixAoGBAO6Uiwt40/PKs53mCEWngslSCsh9oGAaLTf/XdvMns5VmuyyAyKG
+                         ti8Ol5wqBMi4GIUzjbgUvSUt+IowIrG3f5tN85wpjQ1UGVcpTnl5Qo9xaS1PFScQ
+                         xrtWZ9eNj2TsIAMp/svJsyGG3OibxfnuAIpSXNQiJPwRlW3irzpGgVx/AoGBANYW
+                         dnhshUcEHMJi3aXwR12OTDnaLoanVGLwLnkqLSYUZA7ZegpKq90UAuBdcEfgdpyi
+                         PhKpeaeIiAaNnFo8m9aoTKr+7I6/uMTlwrVnfrsVTZv3orxjwQV20YIBCVRKD1uX
+                         VhE0ozPZxwwKSPAFocpyWpGHGreGF1AIYBE9UBtjAoGBAI8bfPgJpyFyMiGBjO6z
+                         FwlJc/xlFqDusrcHL7abW5qq0L4v3R+FrJw3ZYufzLTVcKfdj6GelwJJO+8wBm+R
+                         gTKYJItEhT48duLIfTDyIpHGVm9+I1MGhh5zKuCqIhxIYr9jHloBB7kRm0rPvYY4
+                         VAykcNgyDvtAVODP+4m6JvhjAoGBALbtTqErKN47V0+JJpapLnF0KxGrqeGIjIRV
+                         cYA6V4WYGr7NeIfesecfOC356PyhgPfpcVyEztwlvwTKb3RzIT1TZN8fH4YBr6Ee
+                         KTbTjefRFhVUjQqnucAvfGi29f+9oE3Ei9f7wA+H35ocF6JvTYUsHNMIO/3gZ38N
+                         CPjyCMa9AoGBAMhsITNe3QcbsXAbdUR00dDsIFVROzyFJ2m40i4KCRM35bC/BIBs
+                         q0TY3we+ERB40U8Z2BvU61QuwaunJ2+uGadHo58VSVdggqAo0BSkH58innKKt96J
+                         69pcVH/4rmLbXdcmNYGm6iu+MlPQk4BUZknHSmVHIFdJ0EPupVaQ8RHT
+                         -----END RSA PRIVATE KEY-----
+
+
+
+

The following table describes the SSH configuration properties.

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. SSH Configuration Properties
Property NameRemarks

ignoreLocalSshSettings

If true, use property-based instead of file-based SSH config. Must be set at as spring.cloud.config.server.git.ignoreLocalSshSettings, not inside a repository definition.

privateKey

Valid SSH private key. Must be set if ignoreLocalSshSettings is true and Git URI is SSH format.

hostKey

Valid SSH host key. Must be set if hostKeyAlgorithm is also set.

hostKeyAlgorithm

One of ssh-dss, ssh-rsa, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, or ecdsa-sha2-nistp521. Must be set if hostKey is also set.

strictHostKeyChecking

true or false. If false, ignore errors with host key.

knownHostsFile

Location of custom .known_hosts file.

preferredAuthentications

Override server authentication method order. This should allow for evading login prompts if server has keyboard-interactive authentication before the publickey method.

+
+
+
Placeholders in Git Search Paths
+
+

Spring Cloud Config Server also supports a search path with placeholders for the {application} and {profile} (and {label} if +you need it), as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          searchPaths: '{application}'
+
+
+
+

The preceding listing causes a search of the repository for files in the same name as the directory (as well as the top level). +Wildcards are also valid in a search path with placeholders (any matching directory is included in the search).

+
+
+
+
Force pull in Git Repositories
+
+

As mentioned earlier, Spring Cloud Config Server makes a clone of the remote git repository in case the local copy gets dirty (for example, +folder content changes by an OS process) such that Spring Cloud Config Server cannot update the local copy from remote repository.

+
+
+

To solve this issue, there is a force-pull property that makes Spring Cloud Config Server force pull from the remote repository if the local copy is dirty, as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          force-pull: true
+
+
+
+

If you have a multiple-repositories configuration, you can configure the force-pull property per repository, as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://git/common/config-repo.git
+          force-pull: true
+          repos:
+            team-a:
+                pattern: team-a-*
+                uri: https://git/team-a/config-repo.git
+                force-pull: true
+            team-b:
+                pattern: team-b-*
+                uri: https://git/team-b/config-repo.git
+                force-pull: true
+            team-c:
+                pattern: team-c-*
+                uri: https://git/team-a/config-repo.git
+
+
+
+ + + + + +
+ + +The default value for force-pull property is false. +
+
+
+
+
Deleting untracked branches in Git Repositories
+
+

As Spring Cloud Config Server has a clone of the remote git repository +after check-outing branch to local repo (e.g fetching properties by label) it will keep this branch +forever or till the next server restart (which creates new local repo). +So there could be a case when remote branch is deleted but local copy of it is still available for fetching. +And if Spring Cloud Config Server client service starts with --spring.cloud.config.label=deletedRemoteBranch,master +it will fetch properties from deletedRemoteBranch local branch, but not from master.

+
+
+

In order to keep local repository branches clean and up to remote - deleteUntrackedBranches property could be set. +It will make Spring Cloud Config Server force delete untracked branches from local repository. +Example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          deleteUntrackedBranches: true
+
+
+
+ + + + + +
+ + +The default value for deleteUntrackedBranches property is false. +
+
+
+
+
Git Refresh Rate
+
+

You can control how often the config server will fetch updated configuration data +from your Git backend by using spring.cloud.config.server.git.refreshRate. The +value of this property is specified in seconds. By default the value is 0, meaning +the config server will fetch updated configuration from the Git repo every time it +is requested.

+
+
+
+
+

Version Control Backend Filesystem Use

+
+ + + + + +
+ + +With VCS-based backends (git, svn), files are checked out or cloned to the local filesystem. +By default, they are put in the system temporary directory with a prefix of config-repo-. +On linux, for example, it could be /tmp/config-repo-<randomid>. +Some operating systems routinely clean out temporary directories. +This can lead to unexpected behavior, such as missing properties. +To avoid this problem, change the directory that Config Server uses by setting spring.cloud.config.server.git.basedir or spring.cloud.config.server.svn.basedir to a directory that does not reside in the system temp structure. +
+
+
+
+

File System Backend

+
+

There is also a “native” profile in the Config Server that does not use Git but loads the config files from the local classpath or file system (any static URL you want to point to with spring.cloud.config.server.native.searchLocations). +To use the native profile, launch the Config Server with spring.profiles.active=native.

+
+
+ + + + + +
+ + +Remember to use the file: prefix for file resources (the default without a prefix is usually the classpath). +As with any Spring Boot configuration, you can embed ${}-style environment placeholders, but remember that absolute paths in Windows require an extra / (for example, file:///${user.home}/config-repo). +
+
+
+ + + + + +
+ + +The default value of the searchLocations is identical to a local Spring Boot application (that is, [classpath:/, classpath:/config, +file:./, file:./config]). +This does not expose the application.properties from the server to all clients, because any property sources present in the server are removed before being sent to the client. +
+
+
+ + + + + +
+ + +A filesystem backend is great for getting started quickly and for testing. +To use it in production, you need to be sure that the file system is reliable and shared across all instances of the Config Server. +
+
+
+

The search locations can contain placeholders for {application}, {profile}, and {label}. +In this way, you can segregate the directories in the path and choose a strategy that makes sense for you (such as subdirectory per application or subdirectory per profile).

+
+
+

If you do not use placeholders in the search locations, this repository also appends the {label} parameter of the HTTP resource to a suffix on the search path, so properties files are loaded from each search location and a subdirectory with the same name as the label (the labelled properties take precedence in the Spring Environment). +Thus, the default behaviour with no placeholders is the same as adding a search location ending with /{label}/. +For example, file:/tmp/config is the same as file:/tmp/config,file:/tmp/config/{label}. +This behavior can be disabled by setting spring.cloud.config.server.native.addLabelLocations=false.

+
+
+
+

Vault Backend

+
+

Spring Cloud Config Server also supports Vault as a backend.

+
+
+
+
+

Vault is a tool for securely accessing secrets. +A secret is anything that to which you want to tightly control access, such as API keys, passwords, certificates, and other sensitive information. Vault provides a unified interface to any secret while providing tight access control and recording a detailed audit log.

+
+
+
+
+

For more information on Vault, see the Vault quick start guide.

+
+
+

To enable the config server to use a Vault backend, you can run your config server with the vault profile. +For example, in your config server’s application.properties, you can add spring.profiles.active=vault.

+
+
+

By default, the config server assumes that your Vault server runs at http://127.0.0.1:8200. +It also assumes that the name of backend is secret and the key is application. +All of these defaults can be configured in your config server’s application.properties. +The following table describes configurable Vault properties:

+
+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDefault Value

host

127.0.0.1

port

8200

scheme

http

backend

secret

defaultKey

application

profileSeparator

,

kvVersion

1

skipSslValidation

false

timeout

5

namespace

null

+
+ + + + + +
+ + +All of the properties in the preceding table must be prefixed with spring.cloud.config.server.vault or placed in the correct Vault section of a composite configuration. +
+
+
+

All configurable properties can be found in org.springframework.cloud.config.server.environment.VaultEnvironmentProperties.

+
+
+

Vault 0.10.0 introduced a versioned key-value backend (k/v backend version 2) that exposes a different API than earlier versions, it now requires a data/ between the mount path and the actual context path and wraps secrets in a data object. Setting kvVersion=2 will take this into account.

+
+
+

Optionally, there is support for the Vault Enterprise X-Vault-Namespace header. To have it sent to Vault set the namespace property.

+
+
+

With your config server running, you can make HTTP requests to the server to retrieve +values from the Vault backend. +To do so, you need a token for your Vault server.

+
+
+

First, place some data in you Vault, as shown in the following example:

+
+
+
+
$ vault kv put secret/application foo=bar baz=bam
+$ vault kv put secret/myapp foo=myappsbar
+
+
+
+

Second, make an HTTP request to your config server to retrieve the values, as shown in the following example:

+
+
+

$ curl -X "GET" "http://localhost:8888/myapp/default" -H "X-Config-Token: yourtoken"

+
+
+

You should see a response similar to the following:

+
+
+
+
{
+   "name":"myapp",
+   "profiles":[
+      "default"
+   ],
+   "label":null,
+   "version":null,
+   "state":null,
+   "propertySources":[
+      {
+         "name":"vault:myapp",
+         "source":{
+            "foo":"myappsbar"
+         }
+      },
+      {
+         "name":"vault:application",
+         "source":{
+            "baz":"bam",
+            "foo":"bar"
+         }
+      }
+   ]
+}
+
+
+
+
Multiple Properties Sources
+
+

When using Vault, you can provide your applications with multiple properties sources. +For example, assume you have written data to the following paths in Vault:

+
+
+
+
secret/myApp,dev
+secret/myApp
+secret/application,dev
+secret/application
+
+
+
+

Properties written to secret/application are available to all applications using the Config Server. +An application with the name, myApp, would have any properties written to secret/myApp and secret/application available to it. +When myApp has the dev profile enabled, properties written to all of the above paths would be available to it, with properties in the first path in the list taking priority over the others.

+
+
+
+
+

Accessing Backends Through a Proxy

+
+

The configuration server can access a Git or Vault backend through an HTTP or HTTPS proxy. This behavior is controlled for either Git or Vault by settings under proxy.http and proxy.https. These settings are per repository, so if you are using a composite environment repository you must configure proxy settings for each backend in the composite individually. If using a network which requires separate proxy servers for HTTP and HTTPS URLs, you can configure both the HTTP and the HTTPS proxy settings for a single backend.

+
+
+

The following table describes the proxy configuration properties for both HTTP and HTTPS proxies. All of these properties must be prefixed by proxy.http or proxy.https.

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Proxy Configuration Properties
Property NameRemarks

host

The host of the proxy.

port

The port with which to access the proxy.

nonProxyHosts

Any hosts which the configuration server should access outside the proxy. If values are provided for both proxy.http.nonProxyHosts and proxy.https.nonProxyHosts, the proxy.http value will be used.

username

The username with which to authenticate to the proxy. If values are provided for both proxy.http.username and proxy.https.username, the proxy.http value will be used.

password

The password with which to authenticate to the proxy. If values are provided for both proxy.http.password and proxy.https.password, the proxy.http value will be used.

+
+

The following configuration uses an HTTPS proxy to access a Git repository.

+
+
+
+
spring:
+  profiles:
+    active: git
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          proxy:
+            https:
+              host: my-proxy.host.io
+              password: myproxypassword
+              port: '3128'
+              username: myproxyusername
+              nonProxyHosts: example.com
+
+
+
+
+

Sharing Configuration With All Applications

+
+

Sharing configuration between all applications varies according to which approach you take, as described in the following topics:

+
+ +
+
File Based Repositories
+
+

With file-based (git, svn, and native) repositories, resources with file names in application* (application.properties, application.yml, application-*.properties, and so on) are shared between all client applications. +You can use resources with these file names to configure global defaults and have them be overridden by application-specific files as necessary.

+
+
+

The property overrides feature can also be used for setting global defaults, with placeholders applications +allowed to override them locally.

+
+
+ + + + + +
+ + +With the “native” profile (a local file system backend) , you should use an explicit search location that is not part of the server’s own configuration. +Otherwise, the application* resources in the default search locations get removed because they are part of the server. +
+
+
+
+
Vault Server
+
+

When using Vault as a backend, you can share configuration with all applications by placing configuration in secret/application. +For example, if you run the following Vault command, all applications using the config server will have the properties foo and baz available to them:

+
+
+
+
$ vault write secret/application foo=bar baz=bam
+
+
+
+
+
+

JDBC Backend

+
+

Spring Cloud Config Server supports JDBC (relational database) as a backend for configuration properties. +You can enable this feature by adding spring-jdbc to the classpath and using the jdbc profile or by adding a bean of type JdbcEnvironmentRepository. +If you include the right dependencies on the classpath (see the user guide for more details on that), Spring Boot configures a data source.

+
+
+

The database needs to have a table called PROPERTIES with columns called APPLICATION, PROFILE, and LABEL (with the usual Environment meaning), plus KEY and VALUE for the key and value pairs in Properties style. +All fields are of type String in Java, so you can make them VARCHAR of whatever length you need. +Property values behave in the same way as they would if they came from Spring Boot properties files named {application}-{profile}.properties, including all the encryption and decryption, which will be applied as post-processing steps (that is, not in the repository implementation directly).

+
+
+
+

Redis Backend

+
+

Spring Cloud Config Server supports Redis as a backend for configuration properties. +You can enable this feature by adding a dependency to Spring Data Redis.

+
+
+
pom.xml
+
+
<dependencies>
+	<dependency>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-data-redis</artifactId>
+	</dependency>
+</dependencies>
+
+
+
+

The following configuration uses Spring Data RedisTemplate to access a Redis. We can use spring.redis.* properties to override default connection settings.

+
+
+
+
spring:
+  profiles:
+    active: redis
+  redis:
+    host: redis
+    port: 16379
+
+
+
+

The properties should be stored as fields in a hash. The name of hash should be the same as spring.application.name property or conjunction of spring.application.name and spring.profiles.active[n].

+
+
+
+
HMSET sample-app server.port "8100" sample.topic.name "test" test.property1 "property1"
+
+
+
+

After executing the command visible above a hash should contain the following keys with values:

+
+
+
+
HGETALL sample-app
+{
+  "server.port": "8100",
+  "sample.topic.name": "test",
+  "test.property1": "property1"
+}
+
+
+
+ + + + + +
+ + +When no profile is specified default will be used. +
+
+
+
+

AWS S3 Backend

+
+

Spring Cloud Config Server supports AWS S3 as a backend for configuration properties. +You can enable this feature by adding a dependency to the AWS Java SDK For Amazon S3.

+
+
+
pom.xml
+
+
<dependencies>
+	<dependency>
+		<groupId>com.amazonaws</groupId>
+		<artifactId>aws-java-sdk-s3</artifactId>
+	</dependency>
+</dependencies>
+
+
+
+

The following configuration uses the AWS S3 client to access configuration files. We can use spring.awss3.* properties to select the bucket where your configuration is stored.

+
+
+
+
spring:
+  profiles:
+    active: awss3
+  cloud:
+    config:
+      server:
+        awss3:
+          region: us-east-1
+          bucket: bucket1
+
+
+
+

It is also possible to specify an AWS URL to override the standard endpoint of your S3 service with spring.awss3.endpoint. This allows support for beta regions of S3, and other S3 compatible storage APIs.

+
+
+

Credentials are found using the Default AWS Credential Provider Chain. Versioned and encrypted buckets are supported without further configuration.

+
+
+

Configuration files are stored in your bucket as {application}-{profile}.properties, {application}-{profile}.yml or {application}-{profile}.json. An optional label can be provided to specify a directory path to the file.

+
+
+ + + + + +
+ + +When no profile is specified default will be used. +
+
+
+
+

CredHub Backend

+
+

Spring Cloud Config Server supports CredHub as a backend for configuration properties. +You can enable this feature by adding a dependency to Spring CredHub.

+
+
+
pom.xml
+
+
<dependencies>
+	<dependency>
+		<groupId>org.springframework.credhub</groupId>
+		<artifactId>spring-credhub-starter</artifactId>
+	</dependency>
+</dependencies>
+
+
+
+

The following configuration uses mutual TLS to access a CredHub:

+
+
+
+
spring:
+  profiles:
+    active: credhub
+  cloud:
+    config:
+      server:
+        credhub:
+          url: https://credhub:8844
+
+
+
+

The properties should be stored as JSON, such as:

+
+
+
+
credhub set --name "/demo-app/default/master/toggles" --type=json
+value: {"toggle.button": "blue", "toggle.link": "red"}
+
+
+
+
+
credhub set --name "/demo-app/default/master/abs" --type=json
+value: {"marketing.enabled": true, "external.enabled": false}
+
+
+
+

All client applications with the name spring.cloud.config.name=demo-app will have the following properties available to them:

+
+
+
+
{
+    toggle.button: "blue",
+    toggle.link: "red",
+    marketing.enabled: true,
+    external.enabled: false
+}
+
+
+
+ + + + + +
+ + +When no profile is specified default will be used and when no label is specified master will be used as a default value. +
+
+
+
OAuth 2.0
+
+

You can authenticate with OAuth 2.0 using UAA as a provider.

+
+
+
pom.xml
+
+
<dependencies>
+	<dependency>
+		<groupId>org.springframework.security</groupId>
+		<artifactId>spring-security-config</artifactId>
+	</dependency>
+	<dependency>
+		<groupId>org.springframework.security</groupId>
+		<artifactId>spring-security-oauth2-client</artifactId>
+	</dependency>
+</dependencies>
+
+
+
+

The following configuration uses OAuth 2.0 and UAA to access a CredHub:

+
+
+
+
spring:
+  profiles:
+    active: credhub
+  cloud:
+    config:
+      server:
+        credhub:
+          url: https://credhub:8844
+          oauth2:
+            registration-id: credhub-client
+  security:
+    oauth2:
+      client:
+        registration:
+          credhub-client:
+            provider: uaa
+            client-id: credhub_config_server
+            client-secret: asecret
+            authorization-grant-type: client_credentials
+        provider:
+          uaa:
+            token-uri: https://uaa:8443/oauth/token
+
+
+
+ + + + + +
+ + +The used UAA client-id should have credhub.read as scope. +
+
+
+
+
+

Composite Environment Repositories

+
+

In some scenarios, you may wish to pull configuration data from multiple environment repositories. +To do so, you can enable the composite profile in your configuration server’s application properties or YAML file. +If, for example, you want to pull configuration data from a Subversion repository as well as two Git repositories, you can set the following properties for your configuration server:

+
+
+
+
spring:
+  profiles:
+    active: composite
+  cloud:
+    config:
+      server:
+        composite:
+        -
+          type: svn
+          uri: file:///path/to/svn/repo
+        -
+          type: git
+          uri: file:///path/to/rex/git/repo
+        -
+          type: git
+          uri: file:///path/to/walter/git/repo
+
+
+
+

Using this configuration, precedence is determined by the order in which repositories are listed under the composite key. +In the above example, the Subversion repository is listed first, so a value found in the Subversion repository will override values found for the same property in one of the Git repositories. +A value found in the rex Git repository will be used before a value found for the same property in the walter Git repository.

+
+
+

If you want to pull configuration data only from repositories that are each of distinct types, you can enable the corresponding profiles, rather than the composite profile, in your configuration server’s application properties or YAML file. +If, for example, you want to pull configuration data from a single Git repository and a single HashiCorp Vault server, you can set the following properties for your configuration server:

+
+
+
+
spring:
+  profiles:
+    active: git, vault
+  cloud:
+    config:
+      server:
+        git:
+          uri: file:///path/to/git/repo
+          order: 2
+        vault:
+          host: 127.0.0.1
+          port: 8200
+          order: 1
+
+
+
+

Using this configuration, precedence can be determined by an order property. +You can use the order property to specify the priority order for all your repositories. +The lower the numerical value of the order property, the higher priority it has. +The priority order of a repository helps resolve any potential conflicts between repositories that contain values for the same properties.

+
+
+ + + + + +
+ + +If your composite environment includes a Vault server as in the previous example, you must include a Vault token in every request made to the configuration server. See Vault Backend. +
+
+
+ + + + + +
+ + +Any type of failure when retrieving values from an environment repository results in a failure for the entire composite environment. +
+
+
+ + + + + +
+ + +When using a composite environment, it is important that all repositories contain the same labels. +If you have an environment similar to those in the preceding examples and you request configuration data with the master label but the Subversion repository does not contain a branch called master, the entire request fails. +
+
+
+
Custom Composite Environment Repositories
+
+

In addition to using one of the environment repositories from Spring Cloud, you can also provide your own EnvironmentRepository bean to be included as part of a composite environment. +To do so, your bean must implement the EnvironmentRepository interface. +If you want to control the priority of your custom EnvironmentRepository within the composite environment, you should also implement the Ordered interface and override the getOrdered method. +If you do not implement the Ordered interface, your EnvironmentRepository is given the lowest priority.

+
+
+
+
+

Property Overrides

+
+

The Config Server has an “overrides” feature that lets the operator provide configuration properties to all applications. +The overridden properties cannot be accidentally changed by the application with the normal Spring Boot hooks. +To declare overrides, add a map of name-value pairs to spring.cloud.config.server.overrides, as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        overrides:
+          foo: bar
+
+
+
+

The preceding examples causes all applications that are config clients to read foo=bar, independent of their own configuration.

+
+
+ + + + + +
+ + +A configuration system cannot force an application to use configuration data in any particular way. +Consequently, overrides are not enforceable. +However, they do provide useful default behavior for Spring Cloud Config clients. +
+
+
+ + + + + +
+ + +Normally, Spring environment placeholders with ${} can be escaped (and resolved on the client) by using backslash (\) to escape the $ or the {. +For example, \${app.foo:bar} resolves to bar, unless the app provides its own app.foo. +
+
+
+ + + + + +
+ + +In YAML, you do not need to escape the backslash itself. +However, in properties files, you do need to escape the backslash, when you configure the overrides on the server. +
+
+
+

You can change the priority of all overrides in the client to be more like default values, letting applications supply their own values in environment variables or System properties, by setting the spring.cloud.config.overrideNone=true flag (the default is false) in the remote repository.

+
+
+
+
+

Health Indicator

+
+

Config Server comes with a Health Indicator that checks whether the configured EnvironmentRepository is working. +By default, it asks the EnvironmentRepository for an application named app, the default profile, and the default label provided by the EnvironmentRepository implementation.

+
+
+

You can configure the Health Indicator to check more applications along with custom profiles and custom labels, as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        health:
+          repositories:
+            myservice:
+              label: mylabel
+            myservice-dev:
+              name: myservice
+              profiles: development
+
+
+
+

You can disable the Health Indicator by setting spring.cloud.config.server.health.enabled=false.

+
+
+
+

Security

+
+

You can secure your Config Server in any way that makes sense to you (from physical network security to OAuth2 bearer tokens), because Spring Security and Spring Boot offer support for many security arrangements.

+
+
+

To use the default Spring Boot-configured HTTP Basic security, include Spring Security on the classpath (for example, through spring-boot-starter-security). +The default is a username of user and a randomly generated password. A random password is not useful in practice, so we recommend you configure the password (by setting spring.security.user.password) and encrypt it (see below for instructions on how to do that).

+
+
+
+

Encryption and Decryption

+
+ + + + + +
+ + +To use the encryption and decryption features you need the full-strength JCE installed in your JVM (it is not included by default). +You can download the “Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files” from Oracle and follow the installation instructions (essentially, you need to replace the two policy files in the JRE lib/security directory with the ones that you downloaded). +
+
+
+

If the remote property sources contain encrypted content (values starting with {cipher}), they are decrypted before sending to clients over HTTP. +The main advantage of this setup is that the property values need not be in plain text when they are “at rest” (for example, in a git repository). +If a value cannot be decrypted, it is removed from the property source and an additional property is added with the same key but prefixed with invalid and a value that means “not applicable” (usually <n/a>). +This is largely to prevent cipher text being used as a password and accidentally leaking.

+
+
+

If you set up a remote config repository for config client applications, it might contain an application.yml similar to the following:

+
+
+
application.yml
+
+
spring:
+  datasource:
+    username: dbuser
+    password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'
+
+
+
+

Encrypted values in a .properties file must not be wrapped in quotes. Otherwise, the value is not decrypted. The following example shows values that would work:

+
+
+
application.properties
+
+
spring.datasource.username: dbuser
+spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ
+
+
+
+

You can safely push this plain text to a shared git repository, and the secret password remains protected.

+
+
+

The server also exposes /encrypt and /decrypt endpoints (on the assumption that these are secured and only accessed by authorized agents). +If you edit a remote config file, you can use the Config Server to encrypt values by POSTing to the /encrypt endpoint, as shown in the following example:

+
+
+
+
$ curl localhost:8888/encrypt -d mysecret
+682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
+
+
+
+ + + + + +
+ + +If the value you encrypt has characters in it that need to be URL encoded, you should use the --data-urlencode option to curl to make sure they are encoded properly. +
+
+
+ + + + + +
+ + +Be sure not to include any of the curl command statistics in the encrypted value. +Outputting the value to a file can help avoid this problem. +
+
+
+

The inverse operation is also available through /decrypt (provided the server is +configured with a symmetric key or a full key pair), as shown in the following example:

+
+
+
+
$ curl localhost:8888/decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
+mysecret
+
+
+
+ + + + + +
+ + +If you testing with curl, then use --data-urlencode (instead of -d) or set an explicit Content-Type: text/plain to make sure curl encodes the data correctly when there are special characters ('+' is particularly tricky). +
+
+
+

Take the encrypted value and add the {cipher} prefix before you put it in the YAML or properties file and before you commit and push it to a remote (potentially insecure) store.

+
+
+

The /encrypt and /decrypt endpoints also both accept paths in the form of /*/{application}/{profiles}, which can be used to control cryptography on a per-application (name) and per-profile basis when clients call into the main environment resource.

+
+
+ + + + + +
+ + +To control the cryptography in this granular way, you must also provide a @Bean of type TextEncryptorLocator that creates a different encryptor per name and profiles. +The one that is provided by default does not do so (all encryptions use the same key). +
+
+
+

The spring command line client (with Spring Cloud CLI extensions +installed) can also be used to encrypt and decrypt, as shown in the following example:

+
+
+
+
$ spring encrypt mysecret --key foo
+682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
+$ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
+mysecret
+
+
+
+

To use a key in a file (such as an RSA public key for encryption), prepend +the key value with "@" and provide the file path, as shown in the following example:

+
+
+
+
$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub
+AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+...
+
+
+
+ + + + + +
+ + +The --key argument is mandatory (despite having a -- prefix). +
+
+
+
+

Key Management

+
+

The Config Server can use a symmetric (shared) key or an asymmetric one (RSA key pair). +The asymmetric choice is superior in terms of security, but it is often more convenient to use a symmetric key since it is a single property value to configure in the bootstrap.properties.

+
+
+

To configure a symmetric key, you need to set encrypt.key to a secret String (or use the ENCRYPT_KEY environment variable to keep it out of plain-text configuration files).

+
+
+ + + + + +
+ + +You cannot configure an asymmetric key using encrypt.key. +
+
+
+

To configure an asymmetric key use a keystore (e.g. as +created by the keytool utility that comes with the JDK). The +keystore properties are encrypt.keyStore.* with * equal to

+
+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDescription

encrypt.keyStore.location

Contains a Resource location

encrypt.keyStore.password

Holds the password that unlocks the keystore

encrypt.keyStore.alias

Identifies which key in the store to use

encrypt.keyStore.type

The type of KeyStore to create. Defaults to jks.

+
+

The encryption is done with the public key, and a private key is +needed for decryption. +Thus, in principle, you can configure only the public key in the server if you want to only encrypt (and are prepared to decrypt the values yourself locally with the private key). +In practice, you might not want to do decrypt locally, because it spreads the key management process around all the clients, instead of +concentrating it in the server. +On the other hand, it can be a useful option if your config server is relatively insecure and only a handful of clients need the encrypted properties.

+
+
+
+

Creating a Key Store for Testing

+
+

To create a keystore for testing, you can use a command resembling the following:

+
+
+
+
$ keytool -genkeypair -alias mytestkey -keyalg RSA \
+  -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" \
+  -keypass changeme -keystore server.jks -storepass letmein
+
+
+
+ + + + + +
+ + +When using JDK 11 or above you may get the following warning when using the command above. In this case +you probably want to make sure the keypass and storepass values match. +
+
+
+
+
Warning:  Different store and key passwords not supported for PKCS12 KeyStores. Ignoring user-specified -keypass value.
+
+
+
+

Put the server.jks file in the classpath (for instance) and then, in +your bootstrap.yml, for the Config Server, create the following settings:

+
+
+
+
encrypt:
+  keyStore:
+    location: classpath:/server.jks
+    password: letmein
+    alias: mytestkey
+    secret: changeme
+
+
+
+
+

Using Multiple Keys and Key Rotation

+
+

In addition to the {cipher} prefix in encrypted property values, the Config Server looks for zero or more {name:value} prefixes before the start of the (Base64 encoded) cipher text. +The keys are passed to a TextEncryptorLocator, which can do whatever logic it needs to locate a TextEncryptor for the cipher. +If you have configured a keystore (encrypt.keystore.location), the default locator looks for keys with aliases supplied by the key prefix, with a cipher text like resembling the following:

+
+
+
+
foo:
+  bar: `{cipher}{key:testkey}...`
+
+
+
+

The locator looks for a key named "testkey". +A secret can also be supplied by using a {secret:…​} value in the prefix. +However, if it is not supplied, the default is to use the keystore password (which is what you get when you build a keystore and do not specify a secret). +If you do supply a secret, you should also encrypt the secret using a custom SecretLocator.

+
+
+

When the keys are being used only to encrypt a few bytes of configuration data (that is, they are not being used elsewhere), key rotation is hardly ever necessary on cryptographic grounds. +However, you might occasionally need to change the keys (for example, in the event of a security breach). +In that case, all the clients would need to change their source config files (for example, in git) and use a new {key:…​} prefix in all the ciphers. +Note that the clients need to first check that the key alias is available in the Config Server keystore.

+
+
+ + + + + +
+ + +If you want to let the Config Server handle all encryption as well as decryption, the {name:value} prefixes can also be added as plain text posted to the /encrypt endpoint, . +
+
+
+
+

Serving Encrypted Properties

+
+

Sometimes you want the clients to decrypt the configuration locally, instead of doing it in the server. +In that case, if you provide the encrypt.* configuration to locate a key, you can still have /encrypt and /decrypt endpoints, but you need to explicitly switch off the decryption of outgoing properties by placing spring.cloud.config.server.encrypt.enabled=false in bootstrap.[yml|properties]. +If you do not care about the endpoints, it should work if you do not configure either the key or the enabled flag.

+
+
+
+
+
+

Serving Alternative Formats

+
+
+

The default JSON format from the environment endpoints is perfect for consumption by Spring applications, because it maps directly onto the Environment abstraction. +If you prefer, you can consume the same data as YAML or Java properties by adding a suffix (".yml", ".yaml" or ".properties") to the resource path. +This can be useful for consumption by applications that do not care about the structure of the JSON endpoints or the extra metadata they provide (for example, an application that is not using Spring might benefit from the simplicity of this approach).

+
+
+

The YAML and properties representations have an additional flag (provided as a boolean query parameter called resolvePlaceholders) to signal that placeholders in the source documents (in the standard Spring ${…​} form) should be resolved in the output before rendering, where possible. +This is a useful feature for consumers that do not know about the Spring placeholder conventions.

+
+
+ + + + + +
+ + +There are limitations in using the YAML or properties formats, mainly in relation to the loss of metadata. +For example, the JSON is structured as an ordered list of property sources, with names that correlate with the source. +The YAML and properties forms are coalesced into a single map, even if the origin of the values has multiple sources, and the names of the original source files are lost. +Also, the YAML representation is not necessarily a faithful representation of the YAML source in a backing repository either. It is constructed from a list of flat property sources, and assumptions have to be made about the form of the keys. +
+
+
+
+
+

Serving Plain Text

+
+
+

Instead of using the Environment abstraction (or one of the alternative representations of it in YAML or properties format), your applications might need generic plain-text configuration files that are tailored to their environment. +The Config Server provides these through an additional endpoint at /{application}/{profile}/{label}/{path}, where application, profile, and label have the same meaning as the regular environment endpoint, but path is a path to a file name (such as log.xml). +The source files for this endpoint are located in the same way as for the environment endpoints. +The same search path is used for properties and YAML files. +However, instead of aggregating all matching resources, only the first one to match is returned.

+
+
+

After a resource is located, placeholders in the normal format (${…​}) are resolved by using the effective Environment for the supplied application name, profile, and label. +In this way, the resource endpoint is tightly integrated with the environment endpoints. +Consider the following example for a GIT or SVN repository:

+
+
+
+
application.yml
+nginx.conf
+
+
+
+

where nginx.conf looks like this:

+
+
+
+
server {
+    listen              80;
+    server_name         ${nginx.server.name};
+}
+
+
+
+

and application.yml like this:

+
+
+
+
nginx:
+  server:
+    name: example.com
+---
+spring:
+  profiles: development
+nginx:
+  server:
+    name: develop.com
+
+
+
+

The /foo/default/master/nginx.conf resource might be as follows:

+
+
+
+
server {
+    listen              80;
+    server_name         example.com;
+}
+
+
+
+

and /foo/development/master/nginx.conf like this:

+
+
+
+
server {
+    listen              80;
+    server_name         develop.com;
+}
+
+
+
+ + + + + +
+ + +As with the source files for environment configuration, the profile is used to resolve the file name. +So, if you want a profile-specific file, /*/development/*/logback.xml can be resolved by a file called logback-development.xml (in preference to logback.xml). +
+
+
+ + + + + +
+ + +If you do not want to supply the label and let the server use the default label, you can supply a useDefaultLabel request parameter. +So, the preceding example for the default profile could be /foo/default/nginx.conf?useDefaultLabel. +
+
+
+

Decrpyting Plain Text

+
+

By default, encrypted values in plain text files are not decrypted. In order to enable decryption for plain text files, set spring.cloud.config.server.encrypt.enabled=true and spring.cloud.config.server.encrypt.plainTextEncrypt=true in bootstrap.[yml|properties]

+
+
+ + + + + +
+ + +Decrpyting plain text files is only supported for YAML, JSON, and properties file extensions. +
+
+
+

If this feature is enabled, and an unsupported file extention is requested, any encrypted values in the file will not be decrypted.

+
+
+
+
+
+

Embedding the Config Server

+
+
+

The Config Server runs best as a standalone application. +However, if need be, you can embed it in another application. +To do so, use the @EnableConfigServer annotation. +An optional property named spring.cloud.config.server.bootstrap can be useful in this case. +It is a flag to indicate whether the server should configure itself from its own remote repository. +By default, the flag is off, because it can delay startup. +However, when embedded in another application, it makes sense to initialize the same way as any other application. +When setting spring.cloud.config.server.bootstrap to true you must also use a composite environment repository configuration. +For example

+
+
+
+
spring:
+  application:
+    name: configserver
+  profiles:
+    active: composite
+  cloud:
+    config:
+      server:
+        composite:
+          - type: native
+            search-locations: ${HOME}/Desktop/config
+        bootstrap: true
+
+
+
+ + + + + +
+ + +If you use the bootstrap flag, the config server needs to have its name and repository URI configured in bootstrap.yml. +
+
+
+

To change the location of the server endpoints, you can (optionally) set spring.cloud.config.server.prefix (for example, /config), to serve the resources under a prefix. +The prefix should start but not end with a /. +It is applied to the @RequestMappings in the Config Server (that is, underneath the Spring Boot server.servletPath and server.contextPath prefixes).

+
+
+

If you want to read the configuration for an application directly from the backend repository (instead of from the config server), you +basically want an embedded config server with no endpoints. +You can switch off the endpoints entirely by not using the @EnableConfigServer annotation (set spring.cloud.config.server.bootstrap=true).

+
+
+
+
+

Push Notifications and Spring Cloud Bus

+
+
+

Many source code repository providers (such as Github, Gitlab, Gitea, Gitee, Gogs, or Bitbucket) notify you of changes in a repository through a webhook. +You can configure the webhook through the provider’s user interface as a URL and a set of events in which you are interested. +For instance, Github uses a POST to the webhook with a JSON body containing a list of commits and a header (X-Github-Event) set to push. +If you add a dependency on the spring-cloud-config-monitor library and activate the Spring Cloud Bus in your Config Server, then a /monitor endpoint is enabled.

+
+
+

When the webhook is activated, the Config Server sends a RefreshRemoteApplicationEvent targeted at the applications it thinks might have changed. +The change detection can be strategized. +However, by default, it looks for changes in files that match the application name (for example, foo.properties is targeted at the foo application, while application.properties is targeted at all applications). +The strategy to use when you want to override the behavior is PropertyPathNotificationExtractor, which accepts the request headers and body as parameters and returns a list of file paths that changed.

+
+
+

The default configuration works out of the box with Github, Gitlab, Gitea, Gitee, Gogs or Bitbucket. +In addition to the JSON notifications from Github, Gitlab, Gitee, or Bitbucket, you can trigger a change notification by POSTing to /monitor with form-encoded body parameters in the pattern of path={application}. +Doing so broadcasts to applications matching the {application} pattern (which can contain wildcards).

+
+
+ + + + + +
+ + +The RefreshRemoteApplicationEvent is transmitted only if the spring-cloud-bus is activated in both the Config Server and in the client application. +
+
+
+ + + + + +
+ + +The default configuration also detects filesystem changes in local git repositories. In that case, the webhook is not used. However, as soon as you edit a config file, a refresh is broadcast. +
+
+
+
+
+

Spring Cloud Config Client

+
+
+

A Spring Boot application can take immediate advantage of the Spring Config Server (or other external property sources provided by the application developer). +It also picks up some additional useful features related to Environment change events.

+
+
+

Config First Bootstrap

+
+

The default behavior for any application that has the Spring Cloud Config Client on the classpath is as follows: +When a config client starts, it binds to the Config Server (through the spring.cloud.config.uri bootstrap configuration property) and initializes Spring Environment with remote property sources.

+
+
+

The net result of this behavior is that all client applications that want to consume the Config Server need a bootstrap.yml (or an environment variable) with the server address set in spring.cloud.config.uri (it defaults to "http://localhost:8888").

+
+
+
+

Discovery First Bootstrap

+
+

If you use a DiscoveryClient implementation, such as Spring Cloud Netflix and Eureka Service Discovery or Spring Cloud Consul, you can have the Config Server register with the Discovery Service. +However, in the default “Config First” mode, clients cannot take advantage of the registration.

+
+
+

If you prefer to use DiscoveryClient to locate the Config Server, you can do so by setting spring.cloud.config.discovery.enabled=true (the default is false). +The net result of doing so is that client applications all need a bootstrap.yml (or an environment variable) with the appropriate discovery configuration. +For example, with Spring Cloud Netflix, you need to define the Eureka server address (for example, in eureka.client.serviceUrl.defaultZone). +The price for using this option is an extra network round trip on startup, to locate the service registration. +The benefit is that, as long as the Discovery Service is a fixed point, the Config Server can change its coordinates. +The default service ID is configserver, but you can change that on the client by setting spring.cloud.config.discovery.serviceId (and on the server, in the usual way for a service, such as by setting spring.application.name).

+
+
+

The discovery client implementations all support some kind of metadata map (for example, we have eureka.instance.metadataMap for Eureka). +Some additional properties of the Config Server may need to be configured in its service registration metadata so that clients can connect correctly. +If the Config Server is secured with HTTP Basic, you can configure the credentials as user and password. +Also, if the Config Server has a context path, you can set configPath. +For example, the following YAML file is for a Config Server that is a Eureka client:

+
+
+
bootstrap.yml
+
+
eureka:
+  instance:
+    ...
+    metadataMap:
+      user: osufhalskjrtl
+      password: lviuhlszvaorhvlo5847
+      configPath: /config
+
+
+
+
+

Config Client Fail Fast

+
+

In some cases, you may want to fail startup of a service if it cannot connect to the Config Server. +If this is the desired behavior, set the bootstrap configuration property spring.cloud.config.fail-fast=true to make the client halt with an Exception.

+
+
+
+

Config Client Retry

+
+

If you expect that the config server may occasionally be unavailable when your application starts, you can make it keep trying after a failure. +First, you need to set spring.cloud.config.fail-fast=true. +Then you need to add spring-retry and spring-boot-starter-aop to your classpath. +The default behavior is to retry six times with an initial backoff interval of 1000ms and an exponential multiplier of 1.1 for subsequent backoffs. +You can configure these properties (and others) by setting the spring.cloud.config.retry.* configuration properties.

+
+
+ + + + + +
+ + +To take full control of the retry behavior, add a @Bean of type RetryOperationsInterceptor with an ID of configServerRetryInterceptor. +Spring Retry has a RetryInterceptorBuilder that supports creating one. +
+
+
+
+

Locating Remote Configuration Resources

+
+

The Config Service serves property sources from /{application}/{profile}/{label}, where the default bindings in the client app are as follows:

+
+
+
    +
  • +

    "name" = ${spring.application.name}

    +
  • +
  • +

    "profile" = ${spring.profiles.active} (actually Environment.getActiveProfiles())

    +
  • +
  • +

    "label" = "master"

    +
  • +
+
+
+ + + + + +
+ + +When setting the property ${spring.application.name} do not prefix your app name with the reserved word application- to prevent issues resolving the correct property source. +
+
+
+

You can override all of them by setting spring.cloud.config.* (where * is name, profile or label). +The label is useful for rolling back to previous versions of configuration. +With the default Config Server implementation, it can be a git label, branch name, or commit ID. +Label can also be provided as a comma-separated list. +In that case, the items in the list are tried one by one until one succeeds. +This behavior can be useful when working on a feature branch. +For instance, you might want to align the config label with your branch but make it optional (in that case, use spring.cloud.config.label=myfeature,develop).

+
+
+
+

Specifying Multiple Urls for the Config Server

+
+

To ensure high availability when you have multiple instances of Config Server deployed and expect one or more instances to be unavailable from time to time, you can either specify multiple URLs (as a comma-separated list under the spring.cloud.config.uri property) or have all your instances register in a Service Registry like Eureka ( if using Discovery-First Bootstrap mode ). Note that doing so ensures high availability only when the Config Server is not running (that is, when the application has exited) or when a connection timeout has occurred. For example, if the Config Server returns a 500 (Internal Server Error) response or the Config Client receives a 401 from the Config Server (due to bad credentials or other causes), the Config Client does not try to fetch properties from other URLs. An error of that kind indicates a user issue rather than an availability problem.

+
+
+

If you use HTTP basic security on your Config Server, it is currently possible to support per-Config Server auth credentials only if you embed the credentials in each URL you specify under the spring.cloud.config.uri property. If you use any other kind of security mechanism, you cannot (currently) support per-Config Server authentication and authorization.

+
+
+
+

Configuring Timeouts

+
+

If you want to configure timeout thresholds:

+
+
+
    +
  • +

    Read timeouts can be configured by using the property spring.cloud.config.request-read-timeout.

    +
  • +
  • +

    Connection timeouts can be configured by using the property spring.cloud.config.request-connect-timeout.

    +
  • +
+
+
+
+

Security

+
+

If you use HTTP Basic security on the server, clients need to know the password (and username if it is not the default). +You can specify the username and password through the config server URI or via separate username and password properties, as shown in the following example:

+
+
+
bootstrap.yml
+
+
spring:
+  cloud:
+    config:
+     uri: https://user:secret@myconfig.mycompany.com
+
+
+
+

The following example shows an alternate way to pass the same information:

+
+
+
bootstrap.yml
+
+
spring:
+  cloud:
+    config:
+     uri: https://myconfig.mycompany.com
+     username: user
+     password: secret
+
+
+
+

The spring.cloud.config.password and spring.cloud.config.username values override anything that is provided in the URI.

+
+
+

If you deploy your apps on Cloud Foundry, the best way to provide the password is through service credentials (such as in the URI, since it does not need to be in a config file). +The following example works locally and for a user-provided service on Cloud Foundry named configserver:

+
+
+
bootstrap.yml
+
+
spring:
+  cloud:
+    config:
+     uri: ${vcap.services.configserver.credentials.uri:http://user:password@localhost:8888}
+
+
+
+

If you use another form of security, you might need to provide a RestTemplate to the ConfigServicePropertySourceLocator (for example, by grabbing it in the bootstrap context and injecting it).

+
+
+

Health Indicator

+
+

The Config Client supplies a Spring Boot Health Indicator that attempts to load configuration from the Config Server. +The health indicator can be disabled by setting health.config.enabled=false. +The response is also cached for performance reasons. +The default cache time to live is 5 minutes. +To change that value, set the health.config.time-to-live property (in milliseconds).

+
+
+
+

Providing A Custom RestTemplate

+
+

In some cases, you might need to customize the requests made to the config server from the client. +Typically, doing so involves passing special Authorization headers to authenticate requests to the server. +To provide a custom RestTemplate:

+
+
+
    +
  1. +

    Create a new configuration bean with an implementation of PropertySourceLocator, as shown in the following example:

    +
  2. +
+
+
+
CustomConfigServiceBootstrapConfiguration.java
+
+
@Configuration
+public class CustomConfigServiceBootstrapConfiguration {
+    @Bean
+    public ConfigServicePropertySourceLocator configServicePropertySourceLocator() {
+        ConfigClientProperties clientProperties = configClientProperties();
+       ConfigServicePropertySourceLocator configServicePropertySourceLocator =  new ConfigServicePropertySourceLocator(clientProperties);
+        configServicePropertySourceLocator.setRestTemplate(customRestTemplate(clientProperties));
+        return configServicePropertySourceLocator;
+    }
+}
+
+
+
+ + + + + +
+ + +For a simplified approach to adding Authorization headers, the spring.cloud.config.headers.* property can be used instead. +
+
+
+
    +
  1. +

    In resources/META-INF, create a file called +spring.factories and specify your custom configuration, as shown in the following example:

    +
  2. +
+
+
+
spring.factories
+
+
org.springframework.cloud.bootstrap.BootstrapConfiguration = com.my.config.client.CustomConfigServiceBootstrapConfiguration
+
+
+
+
+

Vault

+
+

When using Vault as a backend to your config server, the client needs to supply a token for the server to retrieve values from Vault. +This token can be provided within the client by setting spring.cloud.config.token +in bootstrap.yml, as shown in the following example:

+
+
+
bootstrap.yml
+
+
spring:
+  cloud:
+    config:
+      token: YourVaultToken
+
+
+
+
+
+

Nested Keys In Vault

+
+

Vault supports the ability to nest keys in a value stored in Vault, as shown in the following example:

+
+
+

echo -n '{"appA": {"secret": "appAsecret"}, "bar": "baz"}' | vault write secret/myapp -

+
+
+

This command writes a JSON object to your Vault. +To access these values in Spring, you would use the traditional dot(.) annotation, as shown in the following example

+
+
+
+
@Value("${appA.secret}")
+String name = "World";
+
+
+
+

The preceding code would sets the value of the name variable to appAsecret.

+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/intro.html b/spring-cloud-config/2.2.0.RELEASE/reference/html/intro.html new file mode 100644 index 00000000..549d972c --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/intro.html @@ -0,0 +1,115 @@ + + + + + + + +Untitled + + + + + + + + + + +
+
+
+
+

Spring Cloud Config provides server-side and client-side support for externalized configuration in a distributed system. With the Config Server, you have a central place to manage external properties for applications across all environments. +The concepts on both client and server map identically to the Spring Environment and PropertySource abstractions, so they fit very well with Spring applications but can be used with any application running in any language. +As an application moves through the deployment pipeline from dev to test and into production, you can manage the configuration between those environments and be certain that applications have everything they need to run when they migrate. +The default implementation of the server storage backend uses git, so it easily supports labelled versions of configuration environments as well as being accessible to a wide range of tooling for managing the content. +It is easy to add alternative implementations and plug them in with Spring configuration.

+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/highlight.min.js b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/highlight.min.js new file mode 100644 index 00000000..dcbbb4c7 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/highlight.min.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.13.1 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=M.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function c(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function c(e){l+=""}function u(e){("start"===e.event?o:c)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substring(s,g[0].offset)),s=g[0].offset,g===e){f.reverse().forEach(c);do u(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),u(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function l(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):B(a.k).forEach(function(e){c(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.endSameAsBegin&&(a.e=a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return s("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var u=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=u.length?t(u.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e){return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}function c(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t].endSameAsBegin&&(n.c[t].eR=o(n.c[t].bR.exec(e)[0])),n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function s(e,n){return!a&&r(n.iR,e)}function p(e,n){var t=R.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function d(e,n,t,r){var a=r?"":j.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=p(E,r),e?(M+=e[1],a+=d(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function b(){var e="string"==typeof E.sL;if(e&&!L[E.sL])return n(k);var t=e?f(E.sL,k,!0,B[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(B[E.sL]=t.top),d(t.language,t.value,!1,!0)}function v(){y+=null!=E.sL?b():h(),k=""}function m(e){y+=e.cN?d(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function N(e,n){if(k+=e,null==n)return v(),0;var t=c(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),v(),t.rB||t.eB||(k=n)),m(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),v(),a.eE&&(k=n));do E.cN&&(y+=I),E.skip||E.sL||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),m(r.starts,"")),a.rE?0:n.length}if(s(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var R=w(e);if(!R)throw new Error('Unknown language: "'+e+'"');l(R);var x,E=i||R,B={},y="";for(x=E;x!==R;x=x.parent)x.cN&&(y=d(x.cN,"",!0)+y);var k="",M=0;try{for(var C,A,S=0;;){if(E.t.lastIndex=S,C=E.t.exec(t),!C)break;A=N(t.substring(S,C.index),C[0]),S=C.index+A}for(N(t.substr(S)),x=E;x.parent;x=x.parent)x.cN&&(y+=I);return{r:M,value:y,language:e,top:E}}catch(O){if(O.message&&-1!==O.message.indexOf("Illegal"))return{r:0,value:n(t)};throw O}}function g(e,t){t=t||j.languages||B(L);var r={r:0,value:n(e)},a=r;return t.filter(w).filter(x).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return j.tabReplace||j.useBR?e.replace(C,function(e,n){return j.useBR&&"\n"===e?"
":j.tabReplace?n.replace(/\t/g,j.tabReplace):""}):e}function d(e,n,t){var r=n?y[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function h(e){var n,t,r,o,s,l=i(e);a(l)||(j.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,s=n.textContent,r=l?f(l,s,!0):g(s),t=c(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=u(t,c(o),s)),r.value=p(r.value),e.innerHTML=r.value,e.className=d(e.className,l,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){j=o(j,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,h)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=L[n]=t(e);r.aliases&&r.aliases.forEach(function(e){y[e]=n})}function R(){return B(L)}function w(e){return e=(e||"").toLowerCase(),L[e]||L[y[e]]}function x(e){var n=w(e);return n&&!n.disableAutodetect}var E=[],B=Object.keys,L={},y={},k=/^(no-?highlight|plain|text)$/i,M=/\blang(?:uage)?-([\w-]+)\b/i,C=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,I="
",j={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=h,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.autoDetection=x,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("dockerfile",function(e){return{aliases:["docker"],cI:!0,k:"from maintainer expose env arg user onbuild stopsignal",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:"run cmd entrypoint volume add copy workdir label healthcheck shell",starts:{e:/[^\\]\n/,sL:"bash"}}],i:")?[^\s\(]+(\s+[^\s\(]+)\s*=/,r:5,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"type",b://,k:"reified",r:0},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,r:0,c:[{b:/:/,e:/[=,\/]/,eW:!0,c:[{cN:"type",b:e.UIR},e.CLCM,e.CBCM],r:0},e.CLCM,e.CBCM,s,l,c,e.CNM]},e.CBCM]},{cN:"class",bK:"class interface trait",e:/[:\{(]|$/,eE:!0,i:"extends implements",c:[{bK:"public protected internal private constructor"},e.UTM,{cN:"type",b://,eB:!0,eE:!0,r:0},{cN:"type",b:/[,:]\s*/,e:/[<\(,]|$/,eB:!0,rE:!0},s,l]},c,{cN:"meta",b:"^#!/usr/bin/env",e:"$",i:"\n"},o]}});hljs.registerLanguage("java",function(e){var a="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",t=a+"(<"+a+"(\\s*,\\s*"+a+")*>)?",r="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",c={cN:"number",b:s,r:0};return{aliases:["jsp"],k:r,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+t+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:r,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:r,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},c,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"meta",b:/<\?xml/,e:/\?>/,r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0},{b:'b"',e:'"',skip:!0},{b:"b'",e:"'",skip:!0},s.inherit(s.ASM,{i:null,cN:null,c:null,skip:!0}),s.inherit(s.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("properties",function(r){var t="[ \\t\\f]*",e="[ \\t\\f]+",s="("+t+"[:=]"+t+"|"+e+")",n="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",c={e:s,r:0,starts:{cN:"string",e:/$/,r:0,c:[{b:"\\\\\\n"}]}};return{cI:!0,i:/\S/,c:[r.C("^\\s*[!#]","$"),{b:n+s,rB:!0,c:[{cN:"attr",b:n,endsParent:!0,r:0}],starts:c},{b:a+s,rB:!0,r:0,c:[{cN:"meta",b:a,endsParent:!0,r:0}],starts:c},{cN:"attr",r:0,b:a+t+"$"}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("asciidoc",function(e){return{aliases:["adoc"],c:[e.C("^/{4,}\\n","\\n/{4,}$",{r:10}),e.C("^//","$",{r:0}),{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"section",r:10,v:[{b:"^(={1,5}) .+?( \\1)?$"},{b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$"}]},{cN:"meta",b:"^:.+?:",e:"\\s",eE:!0,r:10},{cN:"meta",b:"^\\[.+?\\]$",r:0},{cN:"quote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"symbol",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"string",v:[{b:"``.+?''"},{b:"`.+?'"}]},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{b:"^'{3,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:!0,c:[{b:"(link|image:?):",r:0},{cN:"link",b:"\\w",e:"[^\\[]+",r:0},{cN:"string",b:"\\[",e:"\\]",eB:!0,eE:!0,r:0}],r:10}]}});hljs.registerLanguage("aspectj",function(e){var t="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else extends implements break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws privileged aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization staticinitialization withincode target within execution getWithinTypeName handler thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents warning error soft precedence thisAspectInstance",i="get set args call";return{k:t,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"aspect",e:/[{;=]/,eE:!0,i:/[:;"\[\]]/,c:[{bK:"extends implements pertypewithin perthis pertarget percflowbelow percflow issingleton"},e.UTM,{b:/\([^\)]*/,e:/[)]+/,k:t+" "+i,eE:!1}]},{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,r:0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"pointcut after before around throwing returning",e:/[)]/,eE:!1,i:/["\[\]]/,c:[{b:e.UIR+"\\s*\\(",rB:!0,c:[e.UTM]}]},{b:/[:]/,rB:!0,e:/[{;]/,r:0,eE:!1,k:t,i:/["\[\]]/,c:[{b:e.UIR+"\\s*\\(",k:t+" "+i,r:0},e.QSM]},{bK:"new throw",r:0},{cN:"function",b:/\w+ +\w+(\.)?\w+\s*\([^\)]*\)\s*((throws)[\w\s,]+)?[\{;]/,rB:!0,e:/[{;=]/,k:t,eE:!0,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,r:0,k:t,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},e.CNM,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("gradle",function(e){return{cI:!0,k:{keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment with",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage("go",function(e){var t={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:t,i:"",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}}); \ No newline at end of file diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/a11y-dark.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/a11y-dark.min.css new file mode 100644 index 00000000..b93b742a --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/a11y-dark.min.css @@ -0,0 +1,99 @@ +/* a11y-dark theme */ +/* Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css */ +/* @author: ericwbailey */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #d4d0ab; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #ffa07a; +} + +/* Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #f5ab35; +} + +/* Yellow */ +.hljs-attribute { + color: #ffd700; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #abe338; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #00e0e0; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #dcc6e0; +} + +.hljs { + display: block; + overflow-x: auto; + background: #2b2b2b; + color: #f8f8f2; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +@media screen and (-ms-high-contrast: active) { + .hljs-addition, + .hljs-attribute, + .hljs-built_in, + .hljs-builtin-name, + .hljs-bullet, + .hljs-comment, + .hljs-link, + .hljs-literal, + .hljs-meta, + .hljs-number, + .hljs-params, + .hljs-string, + .hljs-symbol, + .hljs-type, + .hljs-quote { + color: highlight; + } + + .hljs-keyword, + .hljs-selector-tag { + font-weight: bold; + } +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/an-old-hope.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/an-old-hope.min.css new file mode 100644 index 00000000..a6d56f4b --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/an-old-hope.min.css @@ -0,0 +1,89 @@ +/* + +An Old Hope – Star Wars Syntax (c) Gustavo Costa +Original theme - Ocean Dark Theme – by https://github.com/gavsiu +Based on Jesse Leite's Atom syntax theme 'An Old Hope' – https://github.com/JesseLeite/an-old-hope-syntax-atom + +*/ + +/* Death Star Comment */ +.hljs-comment, +.hljs-quote +{ + color: #B6B18B; +} + +/* Darth Vader */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion +{ + color: #EB3C54; +} + +/* Threepio */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link +{ + color: #E7CE56; +} + +/* Luke Skywalker */ +.hljs-attribute +{ + color: #EE7C2B; +} + +/* Obi Wan Kenobi */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition +{ + color: #4FB4D7; +} + +/* Yoda */ +.hljs-title, +.hljs-section +{ + color: #78BB65; +} + +/* Mace Windu */ +.hljs-keyword, +.hljs-selector-tag +{ + color: #B45EA4; +} + +/* Millenium Falcon */ +.hljs +{ + display: block; + overflow-x: auto; + background: #1C1D21; + color: #c0c5ce; + padding: 0.5em; +} + +.hljs-emphasis +{ + font-style: italic; +} + +.hljs-strong +{ + font-weight: bold; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/atom-one-dark-reasonable.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/atom-one-dark-reasonable.min.css new file mode 100644 index 00000000..fd41c996 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/atom-one-dark-reasonable.min.css @@ -0,0 +1,77 @@ +/* + +Atom One Dark With support for ReasonML by Gidi Morris, based off work by Daniel Gamage + +Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax + +*/ +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + line-height: 1.3em; + color: #abb2bf; + background: #282c34; + border-radius: 5px; +} +.hljs-keyword, .hljs-operator { + color: #F92672; +} +.hljs-pattern-match { + color: #F92672; +} +.hljs-pattern-match .hljs-constructor { + color: #61aeee; +} +.hljs-function { + color: #61aeee; +} +.hljs-function .hljs-params { + color: #A6E22E; +} +.hljs-function .hljs-params .hljs-typing { + color: #FD971F; +} +.hljs-module-access .hljs-module { + color: #7e57c2; +} +.hljs-constructor { + color: #e2b93d; +} +.hljs-constructor .hljs-string { + color: #9CCC65; +} +.hljs-comment, .hljs-quote { + color: #b18eb1; + font-style: italic; +} +.hljs-doctag, .hljs-formula { + color: #c678dd; +} +.hljs-section, .hljs-name, .hljs-selector-tag, .hljs-deletion, .hljs-subst { + color: #e06c75; +} +.hljs-literal { + color: #56b6c2; +} +.hljs-string, .hljs-regexp, .hljs-addition, .hljs-attribute, .hljs-meta-string { + color: #98c379; +} +.hljs-built_in, .hljs-class .hljs-title { + color: #e6c07b; +} +.hljs-attr, .hljs-variable, .hljs-template-variable, .hljs-type, .hljs-selector-class, .hljs-selector-attr, .hljs-selector-pseudo, .hljs-number { + color: #d19a66; +} +.hljs-symbol, .hljs-bullet, .hljs-link, .hljs-meta, .hljs-selector-id, .hljs-title { + color: #61aeee; +} +.hljs-emphasis { + font-style: italic; +} +.hljs-strong { + font-weight: bold; +} +.hljs-link { + text-decoration: underline; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/atom-one-dark.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/atom-one-dark.min.css new file mode 100644 index 00000000..1616aafe --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/atom-one-dark.min.css @@ -0,0 +1,96 @@ +/* + +Atom One Dark by Daniel Gamage +Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax + +base: #282c34 +mono-1: #abb2bf +mono-2: #818896 +mono-3: #5c6370 +hue-1: #56b6c2 +hue-2: #61aeee +hue-3: #c678dd +hue-4: #98c379 +hue-5: #e06c75 +hue-5-2: #be5046 +hue-6: #d19a66 +hue-6-2: #e6c07b + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #abb2bf; + background: #282c34; +} + +.hljs-comment, +.hljs-quote { + color: #5c6370; + font-style: italic; +} + +.hljs-doctag, +.hljs-keyword, +.hljs-formula { + color: #c678dd; +} + +.hljs-section, +.hljs-name, +.hljs-selector-tag, +.hljs-deletion, +.hljs-subst { + color: #e06c75; +} + +.hljs-literal { + color: #56b6c2; +} + +.hljs-string, +.hljs-regexp, +.hljs-addition, +.hljs-attribute, +.hljs-meta-string { + color: #98c379; +} + +.hljs-built_in, +.hljs-class .hljs-title { + color: #e6c07b; +} + +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-type, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-number { + color: #d19a66; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-meta, +.hljs-selector-id, +.hljs-title { + color: #61aeee; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-link { + text-decoration: underline; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/atom-one-light.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/atom-one-light.min.css new file mode 100644 index 00000000..d5bd1d2a --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/atom-one-light.min.css @@ -0,0 +1,96 @@ +/* + +Atom One Light by Daniel Gamage +Original One Light Syntax theme from https://github.com/atom/one-light-syntax + +base: #fafafa +mono-1: #383a42 +mono-2: #686b77 +mono-3: #a0a1a7 +hue-1: #0184bb +hue-2: #4078f2 +hue-3: #a626a4 +hue-4: #50a14f +hue-5: #e45649 +hue-5-2: #c91243 +hue-6: #986801 +hue-6-2: #c18401 + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #383a42; + background: #fafafa; +} + +.hljs-comment, +.hljs-quote { + color: #a0a1a7; + font-style: italic; +} + +.hljs-doctag, +.hljs-keyword, +.hljs-formula { + color: #a626a4; +} + +.hljs-section, +.hljs-name, +.hljs-selector-tag, +.hljs-deletion, +.hljs-subst { + color: #e45649; +} + +.hljs-literal { + color: #0184bb; +} + +.hljs-string, +.hljs-regexp, +.hljs-addition, +.hljs-attribute, +.hljs-meta-string { + color: #50a14f; +} + +.hljs-built_in, +.hljs-class .hljs-title { + color: #c18401; +} + +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-type, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-number { + color: #986801; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-meta, +.hljs-selector-id, +.hljs-title { + color: #4078f2; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-link { + text-decoration: underline; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/dracula.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/dracula.min.css new file mode 100644 index 00000000..d591db68 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/dracula.min.css @@ -0,0 +1,76 @@ +/* + +Dracula Theme v1.2.0 + +https://github.com/zenorocha/dracula-theme + +Copyright 2015, All rights reserved + +Code licensed under the MIT license +http://zenorocha.mit-license.org + +@author Éverton Ribeiro +@author Zeno Rocha + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #282a36; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-section, +.hljs-link { + color: #8be9fd; +} + +.hljs-function .hljs-keyword { + color: #ff79c6; +} + +.hljs, +.hljs-subst { + color: #f8f8f2; +} + +.hljs-string, +.hljs-title, +.hljs-name, +.hljs-type, +.hljs-attribute, +.hljs-symbol, +.hljs-bullet, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #f1fa8c; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion, +.hljs-meta { + color: #6272a4; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-title, +.hljs-section, +.hljs-doctag, +.hljs-type, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/github.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/github.min.css new file mode 100644 index 00000000..791932b8 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/github.min.css @@ -0,0 +1,99 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #333; + background: #f8f8f8; +} + +.hljs-comment, +.hljs-quote { + color: #998; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #008080; +} + +.hljs-string, +.hljs-doctag { + color: #d14; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #900; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-regexp, +.hljs-link { + color: #009926; +} + +.hljs-symbol, +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/monokai-sublime.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/monokai-sublime.min.css new file mode 100644 index 00000000..2864170d --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/monokai-sublime.min.css @@ -0,0 +1,83 @@ +/* + +Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/ + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #23241f; +} + +.hljs, +.hljs-tag, +.hljs-subst { + color: #f8f8f2; +} + +.hljs-strong, +.hljs-emphasis { + color: #a8a8a2; +} + +.hljs-bullet, +.hljs-quote, +.hljs-number, +.hljs-regexp, +.hljs-literal, +.hljs-link { + color: #ae81ff; +} + +.hljs-code, +.hljs-title, +.hljs-section, +.hljs-selector-class { + color: #a6e22e; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-name, +.hljs-attr { + color: #f92672; +} + +.hljs-symbol, +.hljs-attribute { + color: #66d9ef; +} + +.hljs-params, +.hljs-class .hljs-title { + color: #f8f8f2; +} + +.hljs-string, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-selector-id, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-addition, +.hljs-variable, +.hljs-template-variable { + color: #e6db74; +} + +.hljs-comment, +.hljs-deletion, +.hljs-meta { + color: #75715e; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/monokai.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/monokai.min.css new file mode 100644 index 00000000..775d53f9 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/monokai.min.css @@ -0,0 +1,70 @@ +/* +Monokai style - ported by Luigi Maselli - http://grigio.org +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #272822; color: #ddd; +} + +.hljs-tag, +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-strong, +.hljs-name { + color: #f92672; +} + +.hljs-code { + color: #66d9ef; +} + +.hljs-class .hljs-title { + color: white; +} + +.hljs-attribute, +.hljs-symbol, +.hljs-regexp, +.hljs-link { + color: #bf79db; +} + +.hljs-string, +.hljs-bullet, +.hljs-subst, +.hljs-title, +.hljs-section, +.hljs-emphasis, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #a6e22e; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion, +.hljs-meta { + color: #75715e; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-doctag, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-selector-id { + font-weight: bold; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/solarized-light.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/solarized-light.min.css new file mode 100644 index 00000000..fdcfcc72 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/solarized-light.min.css @@ -0,0 +1,84 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #fdf6e3; + color: #657b83; +} + +.hljs-comment, +.hljs-quote { + color: #93a1a1; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-addition { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-string, +.hljs-meta .hljs-meta-string, +.hljs-literal, +.hljs-doctag, +.hljs-regexp { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-section, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-class .hljs-title, +.hljs-type { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-symbol, +.hljs-bullet, +.hljs-subst, +.hljs-meta, +.hljs-meta .hljs-keyword, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-link { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-built_in, +.hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #eee8d5; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/zenburn.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/zenburn.min.css new file mode 100644 index 00000000..07be5020 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/highlight/styles/zenburn.min.css @@ -0,0 +1,80 @@ +/* + +Zenburn style from voldmar.ru (c) Vladimir Epifanov +based on dark.css by Ivan Sagalaev + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #3f3f3f; + color: #dcdcdc; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-tag { + color: #e3ceab; +} + +.hljs-template-tag { + color: #dcdcdc; +} + +.hljs-number { + color: #8cd0d3; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-attribute { + color: #efdcbc; +} + +.hljs-literal { + color: #efefaf; +} + +.hljs-subst { + color: #8f8f8f; +} + +.hljs-title, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-section, +.hljs-type { + color: #efef8f; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link { + color: #dca3a3; +} + +.hljs-deletion, +.hljs-string, +.hljs-built_in, +.hljs-builtin-name { + color: #cc9393; +} + +.hljs-addition, +.hljs-comment, +.hljs-quote, +.hljs-meta { + color: #7f9f7f; +} + + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/toc.js b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/toc.js new file mode 100644 index 00000000..a6e933bf --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/toc.js @@ -0,0 +1,107 @@ +var toctitle = document.getElementById('toctitle'); +var path = window.location.pathname; +if (toctitle != null) { + var oldtoc = toctitle.nextElementSibling; + var newtoc = document.createElement('div'); + newtoc.setAttribute('id', 'tocbot'); + newtoc.setAttribute('class', 'js-toc desktop-toc'); + oldtoc.setAttribute('class', 'mobile-toc'); + oldtoc.parentNode.appendChild(newtoc); + tocbot.init({ + contentSelector: '#content', + headingSelector: 'h1, h2, h3, h4, h5', + positionFixedSelector: 'body', + fixedSidebarOffset: 90, + smoothScroll: false + }); + if (!path.endsWith("index.html") && !path.endsWith("/")) { + var link = document.createElement("a"); + link.setAttribute("href", "index.html"); + link.innerHTML = " Back to index"; + var block = document.createElement("div"); + block.setAttribute('class', 'back-action'); + block.appendChild(link); + var toc = document.getElementById('toc'); + var next = document.getElementById('toctitle').nextElementSibling; + toc.insertBefore(block, next); + } +} + +var headerHtml = '
\n' + + '

\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '

\n' + + '
'; + +var header = document.createElement("div"); +header.innerHTML = headerHtml; +document.body.insertBefore(header, document.body.firstChild); \ No newline at end of file diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/tocbot/tocbot.css b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/tocbot/tocbot.css new file mode 100644 index 00000000..0632de23 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/tocbot/tocbot.css @@ -0,0 +1 @@ +.toc{overflow-y:auto}.toc>.toc-list{overflow:hidden;position:relative}.toc>.toc-list li{list-style:none}.toc-list{margin:0;padding-left:10px}a.toc-link{color:currentColor;height:100%}.is-collapsible{max-height:1000px;overflow:hidden;transition:all 300ms ease-in-out}.is-collapsed{max-height:0}.is-position-fixed{position:fixed !important;top:0}.is-active-link{font-weight:700}.toc-link::before{background-color:#EEE;content:' ';display:inline-block;height:inherit;left:0;margin-top:-1px;position:absolute;width:2px}.is-active-link::before{background-color:#54BC4B} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/js/tocbot/tocbot.min.js b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/tocbot/tocbot.min.js new file mode 100644 index 00000000..943d8fdb --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/js/tocbot/tocbot.min.js @@ -0,0 +1 @@ +!function(e){function t(o){if(n[o])return n[o].exports;var l=n[o]={i:o,l:!1,exports:{}};return e[o].call(l.exports,l,l.exports,t),l.l=!0,l.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,n){(function(o){var l,i,s;!function(n,o){i=[],l=o(n),void 0!==(s="function"==typeof l?l.apply(t,i):l)&&(e.exports=s)}(void 0!==o?o:this.window||this.global,function(e){"use strict";function t(){for(var e={},t=0;te.fixedSidebarOffset?-1===n.className.indexOf(e.positionFixedClass)&&(n.className+=h+e.positionFixedClass):n.className=n.className.split(h+e.positionFixedClass).join("")}function s(t){var n=document.documentElement.scrollTop||f.scrollTop;e.positionFixedSelector&&i();var o,l=t;if(m&&null!==document.querySelector(e.tocSelector)&&l.length>0){d.call(l,function(t,i){if(t.offsetTop>n+e.headingsOffset+10){return o=l[0===i?i:i-1],!0}if(i===l.length-1)return o=l[l.length-1],!0});var s=document.querySelector(e.tocSelector).querySelectorAll("."+e.linkClass);u.call(s,function(t){t.className=t.className.split(h+e.activeLinkClass).join("")});var c=document.querySelector(e.tocSelector).querySelectorAll("."+e.listItemClass);u.call(c,function(t){t.className=t.className.split(h+e.activeListItemClass).join("")});var a=document.querySelector(e.tocSelector).querySelector("."+e.linkClass+".node-name--"+o.nodeName+'[href="#'+o.id+'"]');-1===a.className.indexOf(e.activeLinkClass)&&(a.className+=h+e.activeLinkClass);var p=a.parentNode;p&&-1===p.className.indexOf(e.activeListItemClass)&&(p.className+=h+e.activeListItemClass);var C=document.querySelector(e.tocSelector).querySelectorAll("."+e.listClass+"."+e.collapsibleClass);u.call(C,function(t){-1===t.className.indexOf(e.isCollapsedClass)&&(t.className+=h+e.isCollapsedClass)}),a.nextSibling&&-1!==a.nextSibling.className.indexOf(e.isCollapsedClass)&&(a.nextSibling.className=a.nextSibling.className.split(h+e.isCollapsedClass).join("")),r(a.parentNode.parentNode)}}function r(t){return-1!==t.className.indexOf(e.collapsibleClass)&&-1!==t.className.indexOf(e.isCollapsedClass)?(t.className=t.className.split(h+e.isCollapsedClass).join(""),r(t.parentNode.parentNode)):t}function c(t){var n=t.target||t.srcElement;"string"==typeof n.className&&-1!==n.className.indexOf(e.linkClass)&&(m=!1)}function a(){m=!0}var u=[].forEach,d=[].some,f=document.body,m=!0,h=" ";return{enableTocAnimation:a,disableTocAnimation:c,render:n,updateToc:s}}},function(e,t){e.exports=function(e){function t(e){return e[e.length-1]}function n(e){return+e.nodeName.split("H").join("")}function o(t){var o={id:t.id,children:[],nodeName:t.nodeName,headingLevel:n(t),textContent:t.textContent.trim()};return e.includeHtml&&(o.childNodes=t.childNodes),o}function l(l,i){for(var s=o(l),r=n(l),c=i,a=t(c),u=a?a.headingLevel:0,d=r-u;d>0;)a=t(c),a&&void 0!==a.children&&(c=a.children),d--;return r>=e.collapseDepth&&(s.isCollapsed=!0),c.push(s),c}function i(t,n){var o=n;e.ignoreSelector&&(o=n.split(",").map(function(t){return t.trim()+":not("+e.ignoreSelector+")"}));try{return document.querySelector(t).querySelectorAll(o)}catch(e){return console.warn("Element not found: "+t),null}}function s(e){return r.call(e,function(e,t){return l(o(t),e.nest),e},{nest:[]})}var r=[].reduce;return{nestHeadingsArray:s,selectHeadings:i}}},function(e,t){function n(e){function t(e){return"a"===e.tagName.toLowerCase()&&(e.hash.length>0||"#"===e.href.charAt(e.href.length-1))&&(n(e.href)===s||n(e.href)+"#"===s)}function n(e){return e.slice(0,e.lastIndexOf("#"))}function l(e){var t=document.getElementById(e.substring(1));t&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())}!function(){document.documentElement.style}();var i=e.duration,s=location.hash?n(location.href):location.href;!function(){function n(n){!t(n.target)||n.target.className.indexOf("no-smooth-scroll")>-1||"#"===n.target.href.charAt(n.target.href.length-2)&&"!"===n.target.href.charAt(n.target.href.length-1)||-1===n.target.className.indexOf(e.linkClass)||o(n.target.hash,{duration:i,callback:function(){l(n.target.hash)}})}document.body.addEventListener("click",n,!1)}()}function o(e,t){function n(e){s=e-i,window.scrollTo(0,c.easing(s,r,u,d)),s + + + + + + +Client Side Usage + + + + + + + + + + +
+
+
+
+

This quick start walks through using both the server and the client of Spring Cloud Config Server.

+
+
+

First, start the server, as follows:

+
+
+
+
$ cd spring-cloud-config-server
+$ ../mvnw spring-boot:run
+
+
+
+

The server is a Spring Boot application, so you can run it from your IDE if you prefer to do so (the main class is ConfigServerApplication).

+
+
+

Next try out a client, as follows:

+
+
+
+
$ curl localhost:8888/foo/development
+{"name":"foo","label":"master","propertySources":[
+  {"name":"https://github.com/scratches/config-repo/foo-development.properties","source":{"bar":"spam"}},
+  {"name":"https://github.com/scratches/config-repo/foo.properties","source":{"foo":"bar"}}
+]}
+
+
+
+

The default strategy for locating property sources is to clone a git repository (at spring.cloud.config.server.git.uri) and use it to initialize a mini SpringApplication. +The mini-application’s Environment is used to enumerate property sources and publish them at a JSON endpoint.

+
+
+

The HTTP service has resources in the following form:

+
+
+
+
/{application}/{profile}[/{label}]
+/{application}-{profile}.yml
+/{label}/{application}-{profile}.yml
+/{application}-{profile}.properties
+/{label}/{application}-{profile}.properties
+
+
+
+

where application is injected as the spring.config.name in the SpringApplication (what is normally application in a regular Spring Boot app), profile is an active profile (or comma-separated list of properties), and label is an optional git label (defaults to master.)

+
+
+

Spring Cloud Config Server pulls configuration for remote clients from various sources. The following example gets configuration from a git repository (which must be provided), as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+
+
+
+

Other sources are any JDBC compatible database, Subversion, Hashicorp Vault, Credhub and local filesystems.

+
+
+
+
+

Client Side Usage

+
+

To use these features in an application, you can build it as a Spring Boot application that depends on spring-cloud-config-client (for an example, see the test cases for the config-client or the sample application). +The most convenient way to add the dependency is with a Spring Boot starter org.springframework.cloud:spring-cloud-starter-config. +There is also a parent pom and BOM (spring-cloud-starter-parent) for Maven users and a Spring IO version management properties file for Gradle and Spring CLI users. The following example shows a typical Maven configuration:

+
+
+
pom.xml
+
+
   <parent>
+       <groupId>org.springframework.boot</groupId>
+       <artifactId>spring-boot-starter-parent</artifactId>
+       <version>{spring-boot-docs-version}</version>
+       <relativePath /> <!-- lookup parent from repository -->
+   </parent>
+
+<dependencyManagement>
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-dependencies</artifactId>
+			<version>{spring-cloud-version}</version>
+			<type>pom</type>
+			<scope>import</scope>
+		</dependency>
+	</dependencies>
+</dependencyManagement>
+
+<dependencies>
+	<dependency>
+		<groupId>org.springframework.cloud</groupId>
+		<artifactId>spring-cloud-starter-config</artifactId>
+	</dependency>
+	<dependency>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-test</artifactId>
+		<scope>test</scope>
+	</dependency>
+</dependencies>
+
+<build>
+	<plugins>
+           <plugin>
+               <groupId>org.springframework.boot</groupId>
+               <artifactId>spring-boot-maven-plugin</artifactId>
+           </plugin>
+	</plugins>
+</build>
+
+   <!-- repositories also needed for snapshots and milestones -->
+
+
+
+

Now you can create a standard Spring Boot application, such as the following HTTP server:

+
+
+
+
@SpringBootApplication
+@RestController
+public class Application {
+
+    @RequestMapping("/")
+    public String home() {
+        return "Hello World!";
+    }
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+
+}
+
+
+
+

When this HTTP server runs, it picks up the external configuration from the default local config server (if it is running) on port 8888. +To modify the startup behavior, you can change the location of the config server by using bootstrap.properties (similar to application.properties but for the bootstrap phase of an application context), as shown in the following example:

+
+
+
+
spring.cloud.config.uri: http://myconfigserver.com
+
+
+
+

By default, if no application name is set, application will be used. To modify the name, the following property can be added to the bootstrap.properties file:

+
+
+
+
spring.application.name: myapp
+
+
+
+ + + + + +
+ + +When setting the property ${spring.application.name} do not prefix your app name with the reserved word application- to prevent issues resolving the correct property source. +
+
+
+

The bootstrap properties show up in the /env endpoint as a high-priority property source, as shown in the following example.

+
+
+
+
$ curl localhost:8080/env
+{
+  "profiles":[],
+  "configService:https://github.com/spring-cloud-samples/config-repo/bar.properties":{"foo":"bar"},
+  "servletContextInitParams":{},
+  "systemProperties":{...},
+  ...
+}
+
+
+
+

A property source called ``configService:<URL of remote repository>/<file name> contains the foo property with a value of bar and is highest priority.

+
+
+ + + + + +
+ + +The URL in the property source name is the git repository, not the config server URL. +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/sagan-index.html b/spring-cloud-config/2.2.0.RELEASE/reference/html/sagan-index.html new file mode 100644 index 00000000..1f28e4da --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/sagan-index.html @@ -0,0 +1,193 @@ + + + + + + + +Features + + + + + + + + + + +
+
+
+
+

Spring Cloud Config provides server and client-side support for externalized configuration in a distributed system. With the Config Server you have a central place to manage external properties for applications across all environments. The concepts on both client and server map identically to the Spring Environment and PropertySource abstractions, so they fit very well with Spring applications, but can be used with any application running in any language. As an application moves through the deployment pipeline from dev to test and into production you can manage the configuration between those environments and be certain that applications have everything they need to run when they migrate. The default implementation of the server storage backend uses git so it easily supports labelled versions of configuration environments, as well as being accessible to a wide range of tooling for managing the content. It is easy to add alternative implementations and plug them in with Spring configuration.

+
+
+
+
+

Features

+
+
+

Spring Cloud Config Server features:

+
+
+
    +
  • +

    HTTP, resource-based API for external configuration (name-value pairs, or equivalent YAML content)

    +
  • +
  • +

    Encrypt and decrypt property values (symmetric or asymmetric)

    +
  • +
  • +

    Embeddable easily in a Spring Boot application using @EnableConfigServer

    +
  • +
+
+
+

Config Client features (for Spring applications):

+
+
+
    +
  • +

    Bind to the Config Server and initialize Spring Environment with remote property sources

    +
  • +
  • +

    Encrypt and decrypt property values (symmetric or asymmetric)

    +
  • +
+
+
+
+
+

Getting Started

+
+
+

As long as Spring Boot Actuator and Spring Config Client are on the +classpath any Spring Boot application will try to contact a config +server on http://localhost:8888, the default value of +spring.cloud.config.uri. If you would like to change this default, +you can set spring.cloud.config.uri in bootstrap.[yml | properties] +or via system properties or environment variables.

+
+
+
+
@Configuration
+@EnableAutoConfiguration
+@RestController
+public class Application {
+
+  @Value("${config.name}")
+  String name = "World";
+
+  @RequestMapping("/")
+  public String home() {
+    return "Hello " + name;
+  }
+
+  public static void main(String[] args) {
+    SpringApplication.run(Application.class, args);
+  }
+
+}
+
+
+
+

The value of config.name in the sample (or any other values you bind to in the normal Spring Boot way) can come from local configuration or from the remote Config Server. The Config Server will take precedence by default. To see this look at the /env endpoint in the application and see the configServer property sources.

+
+
+

To run your own server use the spring-cloud-config-server dependency and @EnableConfigServer. If you set spring.config.name=configserver the app will run on port 8888 and serve data from a sample repository. You need a spring.cloud.config.server.git.uri to locate the configuration data for your own needs (by default it is the location of a git repository, and can be a local file:.. URL).

+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/html/spring-cloud-config.html b/spring-cloud-config/2.2.0.RELEASE/reference/html/spring-cloud-config.html new file mode 100644 index 00000000..2330c873 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/html/spring-cloud-config.html @@ -0,0 +1,2777 @@ + + + + + + + +Spring Cloud Config + + + + + + + + + + +
+
+
+
+

2.2.0.RELEASE

+
+
+

Spring Cloud Config provides server-side and client-side support for externalized configuration in a distributed system. With the Config Server, you have a central place to manage external properties for applications across all environments. +The concepts on both client and server map identically to the Spring Environment and PropertySource abstractions, so they fit very well with Spring applications but can be used with any application running in any language. +As an application moves through the deployment pipeline from dev to test and into production, you can manage the configuration between those environments and be certain that applications have everything they need to run when they migrate. +The default implementation of the server storage backend uses git, so it easily supports labelled versions of configuration environments as well as being accessible to a wide range of tooling for managing the content. +It is easy to add alternative implementations and plug them in with Spring configuration.

+
+
+
+
+

Quick Start

+
+
+

This quick start walks through using both the server and the client of Spring Cloud Config Server.

+
+
+

First, start the server, as follows:

+
+
+
+
$ cd spring-cloud-config-server
+$ ../mvnw spring-boot:run
+
+
+
+

The server is a Spring Boot application, so you can run it from your IDE if you prefer to do so (the main class is ConfigServerApplication).

+
+
+

Next try out a client, as follows:

+
+
+
+
$ curl localhost:8888/foo/development
+{"name":"foo","label":"master","propertySources":[
+  {"name":"https://github.com/scratches/config-repo/foo-development.properties","source":{"bar":"spam"}},
+  {"name":"https://github.com/scratches/config-repo/foo.properties","source":{"foo":"bar"}}
+]}
+
+
+
+

The default strategy for locating property sources is to clone a git repository (at spring.cloud.config.server.git.uri) and use it to initialize a mini SpringApplication. +The mini-application’s Environment is used to enumerate property sources and publish them at a JSON endpoint.

+
+
+

The HTTP service has resources in the following form:

+
+
+
+
/{application}/{profile}[/{label}]
+/{application}-{profile}.yml
+/{label}/{application}-{profile}.yml
+/{application}-{profile}.properties
+/{label}/{application}-{profile}.properties
+
+
+
+

where application is injected as the spring.config.name in the SpringApplication (what is normally application in a regular Spring Boot app), profile is an active profile (or comma-separated list of properties), and label is an optional git label (defaults to master.)

+
+
+

Spring Cloud Config Server pulls configuration for remote clients from various sources. The following example gets configuration from a git repository (which must be provided), as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+
+
+
+

Other sources are any JDBC compatible database, Subversion, Hashicorp Vault, Credhub and local filesystems.

+
+
+

Client Side Usage

+
+

To use these features in an application, you can build it as a Spring Boot application that depends on spring-cloud-config-client (for an example, see the test cases for the config-client or the sample application). +The most convenient way to add the dependency is with a Spring Boot starter org.springframework.cloud:spring-cloud-starter-config. +There is also a parent pom and BOM (spring-cloud-starter-parent) for Maven users and a Spring IO version management properties file for Gradle and Spring CLI users. The following example shows a typical Maven configuration:

+
+
+
pom.xml
+
+
   <parent>
+       <groupId>org.springframework.boot</groupId>
+       <artifactId>spring-boot-starter-parent</artifactId>
+       <version>{spring-boot-docs-version}</version>
+       <relativePath /> <!-- lookup parent from repository -->
+   </parent>
+
+<dependencyManagement>
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-dependencies</artifactId>
+			<version>{spring-cloud-version}</version>
+			<type>pom</type>
+			<scope>import</scope>
+		</dependency>
+	</dependencies>
+</dependencyManagement>
+
+<dependencies>
+	<dependency>
+		<groupId>org.springframework.cloud</groupId>
+		<artifactId>spring-cloud-starter-config</artifactId>
+	</dependency>
+	<dependency>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-test</artifactId>
+		<scope>test</scope>
+	</dependency>
+</dependencies>
+
+<build>
+	<plugins>
+           <plugin>
+               <groupId>org.springframework.boot</groupId>
+               <artifactId>spring-boot-maven-plugin</artifactId>
+           </plugin>
+	</plugins>
+</build>
+
+   <!-- repositories also needed for snapshots and milestones -->
+
+
+
+

Now you can create a standard Spring Boot application, such as the following HTTP server:

+
+
+
+
@SpringBootApplication
+@RestController
+public class Application {
+
+    @RequestMapping("/")
+    public String home() {
+        return "Hello World!";
+    }
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+
+}
+
+
+
+

When this HTTP server runs, it picks up the external configuration from the default local config server (if it is running) on port 8888. +To modify the startup behavior, you can change the location of the config server by using bootstrap.properties (similar to application.properties but for the bootstrap phase of an application context), as shown in the following example:

+
+
+
+
spring.cloud.config.uri: http://myconfigserver.com
+
+
+
+

By default, if no application name is set, application will be used. To modify the name, the following property can be added to the bootstrap.properties file:

+
+
+
+
spring.application.name: myapp
+
+
+
+ + + + + +
+ + +When setting the property ${spring.application.name} do not prefix your app name with the reserved word application- to prevent issues resolving the correct property source. +
+
+
+

The bootstrap properties show up in the /env endpoint as a high-priority property source, as shown in the following example.

+
+
+
+
$ curl localhost:8080/env
+{
+  "profiles":[],
+  "configService:https://github.com/spring-cloud-samples/config-repo/bar.properties":{"foo":"bar"},
+  "servletContextInitParams":{},
+  "systemProperties":{...},
+  ...
+}
+
+
+
+

A property source called ``configService:<URL of remote repository>/<file name> contains the foo property with a value of bar and is highest priority.

+
+
+ + + + + +
+ + +The URL in the property source name is the git repository, not the config server URL. +
+
+
+
+
+
+

Spring Cloud Config Server

+
+
+

Spring Cloud Config Server provides an HTTP resource-based API for external configuration (name-value pairs or equivalent YAML content). +The server is embeddable in a Spring Boot application, by using the @EnableConfigServer annotation. +Consequently, the following application is a config server:

+
+
+
ConfigServer.java
+
+
@SpringBootApplication
+@EnableConfigServer
+public class ConfigServer {
+  public static void main(String[] args) {
+    SpringApplication.run(ConfigServer.class, args);
+  }
+}
+
+
+
+

Like all Spring Boot applications, it runs on port 8080 by default, but you can switch it to the more conventional port 8888 in various ways. +The easiest, which also sets a default configuration repository, is by launching it with spring.config.name=configserver (there is a configserver.yml in the Config Server jar). +Another is to use your own application.properties, as shown in the following example:

+
+
+
application.properties
+
+
server.port: 8888
+spring.cloud.config.server.git.uri: file://${user.home}/config-repo
+
+
+
+

where ${user.home}/config-repo is a git repository containing YAML and properties files.

+
+
+ + + + + +
+ + +On Windows, you need an extra "/" in the file URL if it is absolute with a drive prefix (for example,file:///${user.home}/config-repo). +
+
+
+ + + + + +
+ + +
+

The following listing shows a recipe for creating the git repository in the preceding example:

+
+
+
+
$ cd $HOME
+$ mkdir config-repo
+$ cd config-repo
+$ git init .
+$ echo info.foo: bar > application.properties
+$ git add -A .
+$ git commit -m "Add application.properties"
+
+
+
+
+
+ + + + + +
+ + +Using the local filesystem for your git repository is intended for testing only. +You should use a server to host your configuration repositories in production. +
+
+
+ + + + + +
+ + +The initial clone of your configuration repository can be quick and efficient if you keep only text files in it. +If you store binary files, especially large ones, you may experience delays on the first request for configuration or encounter out of memory errors in the server. +
+
+
+

Environment Repository

+
+

Where should you store the configuration data for the Config Server? +The strategy that governs this behaviour is the EnvironmentRepository, serving Environment objects. +This Environment is a shallow copy of the domain from the Spring Environment (including propertySources as the main feature). +The Environment resources are parametrized by three variables:

+
+
+
    +
  • +

    {application}, which maps to spring.application.name on the client side.

    +
  • +
  • +

    {profile}, which maps to spring.profiles.active on the client (comma-separated list).

    +
  • +
  • +

    {label}, which is a server side feature labelling a "versioned" set of config files.

    +
  • +
+
+
+

Repository implementations generally behave like a Spring Boot application, loading configuration files from a spring.config.name equal to the {application} parameter, and spring.profiles.active equal to the {profiles} parameter. +Precedence rules for profiles are also the same as in a regular Spring Boot application: Active profiles take precedence over defaults, and, if there are multiple profiles, the last one wins (similar to adding entries to a Map).

+
+
+

The following sample client application has this bootstrap configuration:

+
+
+
bootstrap.yml
+
+
spring:
+  application:
+    name: foo
+  profiles:
+    active: dev,mysql
+
+
+
+

(As usual with a Spring Boot application, these properties could also be set by environment variables or command line arguments).

+
+
+

If the repository is file-based, the server creates an +Environment from application.yml (shared between all clients) and +foo.yml (with foo.yml taking precedence). +If the YAML files have documents inside them that point to Spring profiles, those are applied with higher precedence (in order of the profiles listed). +If there are profile-specific YAML (or properties) files, these are also applied with higher precedence than the defaults. +Higher precedence translates to a PropertySource listed earlier in the Environment. +(These same rules apply in a standalone Spring Boot application.)

+
+
+

You can set spring.cloud.config.server.accept-empty to false so that Server would return a HTTP 404 status, if the application is not found.By default, this flag is set to true.

+
+
+

Git Backend

+
+

The default implementation of EnvironmentRepository uses a Git backend, which is very convenient for managing upgrades and physical environments and for auditing changes. +To change the location of the repository, you can set the spring.cloud.config.server.git.uri configuration property in the Config Server (for example in application.yml). +If you set it with a file: prefix, it should work from a local repository so that you can get started quickly and easily without a server. However, in that case, the server operates directly on the local repository without cloning it (it does not matter if it is not bare because the Config Server never makes changes to the "remote" repository). +To scale the Config Server up and make it highly available, you need to have all instances of the server pointing to the same repository, so only a shared file system would work. +Even in that case, it is better to use the ssh: protocol for a shared filesystem repository, so that the server can clone it and use a local working copy as a cache.

+
+
+

This repository implementation maps the {label} parameter of the HTTP resource to a git label (commit id, branch name, or tag). +If the git branch or tag name contains a slash (/), then the label in the HTTP URL should instead be specified with the special string (_) (to avoid ambiguity with other URL paths). +For example, if the label is foo/bar, replacing the slash would result in the following label: foo(_)bar. +The inclusion of the special string (_) can also be applied to the {application} parameter. +If you use a command-line client such as curl, be careful with the brackets in the URL — you should escape them from the shell with single quotes ('').

+
+
+
Skipping SSL Certificate Validation
+
+

The configuration server’s validation of the Git server’s SSL certificate can be disabled by setting the git.skipSslValidation property to true (default is false).

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://example.com/my/repo
+          skipSslValidation: true
+
+
+
+
+
Setting HTTP Connection Timeout
+
+

You can configure the time, in seconds, that the configuration server will wait to acquire an HTTP connection. Use the git.timeout property.

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://example.com/my/repo
+          timeout: 4
+
+
+
+
+
Placeholders in Git URI
+
+

Spring Cloud Config Server supports a git repository URL with placeholders for the {application} and {profile} (and {label} if you need it, but remember that the label is applied as a git label anyway). +So you can support a “one repository per application” policy by using a structure similar to the following:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/myorg/{application}
+
+
+
+

You can also support a “one repository per profile” policy by using a similar pattern but with +{profile}.

+
+
+

Additionally, using the special string "(_)" within your {application} parameters can enable support for multiple +organizations, as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/{application}
+
+
+
+

where {application} is provided at request time in the following format: organization(_)application.

+
+
+
+
Pattern Matching and Multiple Repositories
+
+

Spring Cloud Config also includes support for more complex requirements with pattern +matching on the application and profile name. +The pattern format is a comma-separated list of {application}/{profile} names with wildcards (note that a pattern beginning with a wildcard may need to be quoted), as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          repos:
+            simple: https://github.com/simple/config-repo
+            special:
+              pattern: special*/dev*,*special*/dev*
+              uri: https://github.com/special/config-repo
+            local:
+              pattern: local*
+              uri: file:/home/configsvc/config-repo
+
+
+
+

If {application}/{profile} does not match any of the patterns, it uses the default URI defined under spring.cloud.config.server.git.uri. +In the above example, for the “simple” repository, the pattern is simple/* (it only matches one application named simple in all profiles). The “local” repository matches all application names beginning with local in all profiles (the /* suffix is added automatically to any pattern that does not have a profile matcher).

+
+
+ + + + + +
+ + +The “one-liner” short cut used in the “simple” example can be used only if the only property to be set is the URI. +If you need to set anything else (credentials, pattern, and so on) you need to use the full form. +
+
+
+

The pattern property in the repo is actually an array, so you can use a YAML array (or [0], [1], etc. suffixes in properties files) to bind to multiple patterns. +You may need to do so if you are going to run apps with multiple profiles, as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          repos:
+            development:
+              pattern:
+                - '*/development'
+                - '*/staging'
+              uri: https://github.com/development/config-repo
+            staging:
+              pattern:
+                - '*/qa'
+                - '*/production'
+              uri: https://github.com/staging/config-repo
+
+
+
+ + + + + +
+ + +Spring Cloud guesses that a pattern containing a profile that does not end in * implies that you actually want to match a list of profiles starting with this pattern (so */staging is a shortcut for ["*/staging", "*/staging,*"], and so on). +This is common where, for instance, you need to run applications in the “development” profile locally but also the “cloud” profile remotely. +
+
+
+

Every repository can also optionally store config files in sub-directories, and patterns to search for those directories can be specified as searchPaths. +The following example shows a config file at the top level:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          searchPaths: foo,bar*
+
+
+
+

In the preceding example, the server searches for config files in the top level and in the foo/ sub-directory and also any sub-directory whose name begins with bar.

+
+
+

By default, the server clones remote repositories when configuration +is first requested. +The server can be configured to clone the repositories at startup, as shown in the following top-level example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://git/common/config-repo.git
+          repos:
+            team-a:
+                pattern: team-a-*
+                cloneOnStart: true
+                uri: https://git/team-a/config-repo.git
+            team-b:
+                pattern: team-b-*
+                cloneOnStart: false
+                uri: https://git/team-b/config-repo.git
+            team-c:
+                pattern: team-c-*
+                uri: https://git/team-a/config-repo.git
+
+
+
+

In the preceding example, the server clones team-a’s config-repo on startup, before it +accepts any requests. +All other repositories are not cloned until configuration from the repository is requested.

+
+
+ + + + + +
+ + +Setting a repository to be cloned when the Config Server starts up can help to identify a misconfigured configuration source (such as an invalid repository URI) quickly, while the Config Server is starting up. +With cloneOnStart not enabled for a configuration source, the Config Server may start successfully with a misconfigured or invalid configuration source and not detect an error until an application requests configuration from that configuration source. +
+
+
+
+
Authentication
+
+

To use HTTP basic authentication on the remote repository, add the username and password properties separately (not in the URL), as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          username: trolley
+          password: strongpassword
+
+
+
+

If you do not use HTTPS and user credentials, SSH should also work out of the box when you store keys in the default directories (~/.ssh) and the URI points to an SSH location, such as git@github.com:configuration/cloud-configuration. +It is important that an entry for the Git server be present in the ~/.ssh/known_hosts file and that it is in ssh-rsa format. +Other formats (such as ecdsa-sha2-nistp256) are not supported. +To avoid surprises, you should ensure that only one entry is present in the known_hosts file for the Git server and that it matches the URL you provided to the config server. +If you use a hostname in the URL, you want to have exactly that (not the IP) in the known_hosts file. +The repository is accessed by using JGit, so any documentation you find on that should be applicable. +HTTPS proxy settings can be set in ~/.git/config or (in the same way as for any other JVM process) with +system properties (-Dhttps.proxyHost and -Dhttps.proxyPort).

+
+
+ + + + + +
+ + +If you do not know where your ~/.git directory is, use git config --global to manipulate the settings (for example, git config --global http.sslVerify false). +
+
+
+
+
Authentication with AWS CodeCommit
+
+

Spring Cloud Config Server also supports AWS CodeCommit authentication. +AWS CodeCommit uses an authentication helper when using Git from the command line. +This helper is not used with the JGit library, so a JGit CredentialProvider for AWS CodeCommit is created if the Git URI matches the AWS CodeCommit pattern. +AWS CodeCommit URIs follow this pattern://git-codecommit.${AWS_REGION}.amazonaws.com/${repopath}.

+
+
+

If you provide a username and password with an AWS CodeCommit URI, they must be the AWS accessKeyId and secretAccessKey that provide access to the repository. +If you do not specify a username and password, the accessKeyId and secretAccessKey are retrieved by using the AWS Default Credential Provider Chain.

+
+
+

If your Git URI matches the CodeCommit URI pattern (shown earlier), you must provide valid AWS credentials in the username and password or in one of the locations supported by the default credential provider chain. +AWS EC2 instances may use IAM Roles for EC2 Instances.

+
+
+ + + + + +
+ + +The aws-java-sdk-core jar is an optional dependency. +If the aws-java-sdk-core jar is not on your classpath, the AWS Code Commit credential provider is not created, regardless of the git server URI. +
+
+
+
+
Authentication with Google Cloud Source
+
+

Spring Cloud Config Server also supports authenticating against Google Cloud Source repositories.

+
+
+

If your Git URI uses the http or https protocol and the domain name is source.developers.google.com, the Google Cloud Source credentials provider will be used. A Google Cloud Source repository URI has the format https://source.developers.google.com/p/${GCP_PROJECT}/r/${REPO}. To obtain the URI for your repository, click on "Clone" in the Google Cloud Source UI, and select "Manually generated credentials". Do not generate any credentials, simply copy the displayed URI.

+
+
+

The Google Cloud Source credentials provider will use Google Cloud Platform application default credentials. See Google Cloud SDK documentation on how to create application default credentials for a system. This approach will work for user accounts in dev environments and for service accounts in production environments.

+
+
+ + + + + +
+ + +com.google.auth:google-auth-library-oauth2-http is an optional dependency. +If the google-auth-library-oauth2-http jar is not on your classpath, the Google Cloud Source credential provider is not created, regardless of the git server URI. +
+
+
+
+
Git SSH configuration using properties
+
+

By default, the JGit library used by Spring Cloud Config Server uses SSH configuration files such as ~/.ssh/known_hosts and /etc/ssh/ssh_config when connecting to Git repositories by using an SSH URI. +In cloud environments such as Cloud Foundry, the local filesystem may be ephemeral or not easily accessible. +For those cases, SSH configuration can be set by using Java properties. +In order to activate property-based SSH configuration, the spring.cloud.config.server.git.ignoreLocalSshSettings property must be set to true, as shown in the following example:

+
+
+
+
  spring:
+    cloud:
+      config:
+        server:
+          git:
+            uri: git@gitserver.com:team/repo1.git
+            ignoreLocalSshSettings: true
+            hostKey: someHostKey
+            hostKeyAlgorithm: ssh-rsa
+            privateKey: |
+                         -----BEGIN RSA PRIVATE KEY-----
+                         MIIEpgIBAAKCAQEAx4UbaDzY5xjW6hc9jwN0mX33XpTDVW9WqHp5AKaRbtAC3DqX
+                         IXFMPgw3K45jxRb93f8tv9vL3rD9CUG1Gv4FM+o7ds7FRES5RTjv2RT/JVNJCoqF
+                         ol8+ngLqRZCyBtQN7zYByWMRirPGoDUqdPYrj2yq+ObBBNhg5N+hOwKjjpzdj2Ud
+                         1l7R+wxIqmJo1IYyy16xS8WsjyQuyC0lL456qkd5BDZ0Ag8j2X9H9D5220Ln7s9i
+                         oezTipXipS7p7Jekf3Ywx6abJwOmB0rX79dV4qiNcGgzATnG1PkXxqt76VhcGa0W
+                         DDVHEEYGbSQ6hIGSh0I7BQun0aLRZojfE3gqHQIDAQABAoIBAQCZmGrk8BK6tXCd
+                         fY6yTiKxFzwb38IQP0ojIUWNrq0+9Xt+NsypviLHkXfXXCKKU4zUHeIGVRq5MN9b
+                         BO56/RrcQHHOoJdUWuOV2qMqJvPUtC0CpGkD+valhfD75MxoXU7s3FK7yjxy3rsG
+                         EmfA6tHV8/4a5umo5TqSd2YTm5B19AhRqiuUVI1wTB41DjULUGiMYrnYrhzQlVvj
+                         5MjnKTlYu3V8PoYDfv1GmxPPh6vlpafXEeEYN8VB97e5x3DGHjZ5UrurAmTLTdO8
+                         +AahyoKsIY612TkkQthJlt7FJAwnCGMgY6podzzvzICLFmmTXYiZ/28I4BX/mOSe
+                         pZVnfRixAoGBAO6Uiwt40/PKs53mCEWngslSCsh9oGAaLTf/XdvMns5VmuyyAyKG
+                         ti8Ol5wqBMi4GIUzjbgUvSUt+IowIrG3f5tN85wpjQ1UGVcpTnl5Qo9xaS1PFScQ
+                         xrtWZ9eNj2TsIAMp/svJsyGG3OibxfnuAIpSXNQiJPwRlW3irzpGgVx/AoGBANYW
+                         dnhshUcEHMJi3aXwR12OTDnaLoanVGLwLnkqLSYUZA7ZegpKq90UAuBdcEfgdpyi
+                         PhKpeaeIiAaNnFo8m9aoTKr+7I6/uMTlwrVnfrsVTZv3orxjwQV20YIBCVRKD1uX
+                         VhE0ozPZxwwKSPAFocpyWpGHGreGF1AIYBE9UBtjAoGBAI8bfPgJpyFyMiGBjO6z
+                         FwlJc/xlFqDusrcHL7abW5qq0L4v3R+FrJw3ZYufzLTVcKfdj6GelwJJO+8wBm+R
+                         gTKYJItEhT48duLIfTDyIpHGVm9+I1MGhh5zKuCqIhxIYr9jHloBB7kRm0rPvYY4
+                         VAykcNgyDvtAVODP+4m6JvhjAoGBALbtTqErKN47V0+JJpapLnF0KxGrqeGIjIRV
+                         cYA6V4WYGr7NeIfesecfOC356PyhgPfpcVyEztwlvwTKb3RzIT1TZN8fH4YBr6Ee
+                         KTbTjefRFhVUjQqnucAvfGi29f+9oE3Ei9f7wA+H35ocF6JvTYUsHNMIO/3gZ38N
+                         CPjyCMa9AoGBAMhsITNe3QcbsXAbdUR00dDsIFVROzyFJ2m40i4KCRM35bC/BIBs
+                         q0TY3we+ERB40U8Z2BvU61QuwaunJ2+uGadHo58VSVdggqAo0BSkH58innKKt96J
+                         69pcVH/4rmLbXdcmNYGm6iu+MlPQk4BUZknHSmVHIFdJ0EPupVaQ8RHT
+                         -----END RSA PRIVATE KEY-----
+
+
+
+

The following table describes the SSH configuration properties.

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. SSH Configuration Properties
Property NameRemarks

ignoreLocalSshSettings

If true, use property-based instead of file-based SSH config. Must be set at as spring.cloud.config.server.git.ignoreLocalSshSettings, not inside a repository definition.

privateKey

Valid SSH private key. Must be set if ignoreLocalSshSettings is true and Git URI is SSH format.

hostKey

Valid SSH host key. Must be set if hostKeyAlgorithm is also set.

hostKeyAlgorithm

One of ssh-dss, ssh-rsa, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, or ecdsa-sha2-nistp521. Must be set if hostKey is also set.

strictHostKeyChecking

true or false. If false, ignore errors with host key.

knownHostsFile

Location of custom .known_hosts file.

preferredAuthentications

Override server authentication method order. This should allow for evading login prompts if server has keyboard-interactive authentication before the publickey method.

+
+
+
Placeholders in Git Search Paths
+
+

Spring Cloud Config Server also supports a search path with placeholders for the {application} and {profile} (and {label} if +you need it), as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          searchPaths: '{application}'
+
+
+
+

The preceding listing causes a search of the repository for files in the same name as the directory (as well as the top level). +Wildcards are also valid in a search path with placeholders (any matching directory is included in the search).

+
+
+
+
Force pull in Git Repositories
+
+

As mentioned earlier, Spring Cloud Config Server makes a clone of the remote git repository in case the local copy gets dirty (for example, +folder content changes by an OS process) such that Spring Cloud Config Server cannot update the local copy from remote repository.

+
+
+

To solve this issue, there is a force-pull property that makes Spring Cloud Config Server force pull from the remote repository if the local copy is dirty, as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          force-pull: true
+
+
+
+

If you have a multiple-repositories configuration, you can configure the force-pull property per repository, as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://git/common/config-repo.git
+          force-pull: true
+          repos:
+            team-a:
+                pattern: team-a-*
+                uri: https://git/team-a/config-repo.git
+                force-pull: true
+            team-b:
+                pattern: team-b-*
+                uri: https://git/team-b/config-repo.git
+                force-pull: true
+            team-c:
+                pattern: team-c-*
+                uri: https://git/team-a/config-repo.git
+
+
+
+ + + + + +
+ + +The default value for force-pull property is false. +
+
+
+
+
Deleting untracked branches in Git Repositories
+
+

As Spring Cloud Config Server has a clone of the remote git repository +after check-outing branch to local repo (e.g fetching properties by label) it will keep this branch +forever or till the next server restart (which creates new local repo). +So there could be a case when remote branch is deleted but local copy of it is still available for fetching. +And if Spring Cloud Config Server client service starts with --spring.cloud.config.label=deletedRemoteBranch,master +it will fetch properties from deletedRemoteBranch local branch, but not from master.

+
+
+

In order to keep local repository branches clean and up to remote - deleteUntrackedBranches property could be set. +It will make Spring Cloud Config Server force delete untracked branches from local repository. +Example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          deleteUntrackedBranches: true
+
+
+
+ + + + + +
+ + +The default value for deleteUntrackedBranches property is false. +
+
+
+
+
Git Refresh Rate
+
+

You can control how often the config server will fetch updated configuration data +from your Git backend by using spring.cloud.config.server.git.refreshRate. The +value of this property is specified in seconds. By default the value is 0, meaning +the config server will fetch updated configuration from the Git repo every time it +is requested.

+
+
+
+
+

Version Control Backend Filesystem Use

+
+ + + + + +
+ + +With VCS-based backends (git, svn), files are checked out or cloned to the local filesystem. +By default, they are put in the system temporary directory with a prefix of config-repo-. +On linux, for example, it could be /tmp/config-repo-<randomid>. +Some operating systems routinely clean out temporary directories. +This can lead to unexpected behavior, such as missing properties. +To avoid this problem, change the directory that Config Server uses by setting spring.cloud.config.server.git.basedir or spring.cloud.config.server.svn.basedir to a directory that does not reside in the system temp structure. +
+
+
+
+

File System Backend

+
+

There is also a “native” profile in the Config Server that does not use Git but loads the config files from the local classpath or file system (any static URL you want to point to with spring.cloud.config.server.native.searchLocations). +To use the native profile, launch the Config Server with spring.profiles.active=native.

+
+
+ + + + + +
+ + +Remember to use the file: prefix for file resources (the default without a prefix is usually the classpath). +As with any Spring Boot configuration, you can embed ${}-style environment placeholders, but remember that absolute paths in Windows require an extra / (for example, file:///${user.home}/config-repo). +
+
+
+ + + + + +
+ + +The default value of the searchLocations is identical to a local Spring Boot application (that is, [classpath:/, classpath:/config, +file:./, file:./config]). +This does not expose the application.properties from the server to all clients, because any property sources present in the server are removed before being sent to the client. +
+
+
+ + + + + +
+ + +A filesystem backend is great for getting started quickly and for testing. +To use it in production, you need to be sure that the file system is reliable and shared across all instances of the Config Server. +
+
+
+

The search locations can contain placeholders for {application}, {profile}, and {label}. +In this way, you can segregate the directories in the path and choose a strategy that makes sense for you (such as subdirectory per application or subdirectory per profile).

+
+
+

If you do not use placeholders in the search locations, this repository also appends the {label} parameter of the HTTP resource to a suffix on the search path, so properties files are loaded from each search location and a subdirectory with the same name as the label (the labelled properties take precedence in the Spring Environment). +Thus, the default behaviour with no placeholders is the same as adding a search location ending with /{label}/. +For example, file:/tmp/config is the same as file:/tmp/config,file:/tmp/config/{label}. +This behavior can be disabled by setting spring.cloud.config.server.native.addLabelLocations=false.

+
+
+
+

Vault Backend

+
+

Spring Cloud Config Server also supports Vault as a backend.

+
+
+
+
+

Vault is a tool for securely accessing secrets. +A secret is anything that to which you want to tightly control access, such as API keys, passwords, certificates, and other sensitive information. Vault provides a unified interface to any secret while providing tight access control and recording a detailed audit log.

+
+
+
+
+

For more information on Vault, see the Vault quick start guide.

+
+
+

To enable the config server to use a Vault backend, you can run your config server with the vault profile. +For example, in your config server’s application.properties, you can add spring.profiles.active=vault.

+
+
+

By default, the config server assumes that your Vault server runs at http://127.0.0.1:8200. +It also assumes that the name of backend is secret and the key is application. +All of these defaults can be configured in your config server’s application.properties. +The following table describes configurable Vault properties:

+
+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDefault Value

host

127.0.0.1

port

8200

scheme

http

backend

secret

defaultKey

application

profileSeparator

,

kvVersion

1

skipSslValidation

false

timeout

5

namespace

null

+
+ + + + + +
+ + +All of the properties in the preceding table must be prefixed with spring.cloud.config.server.vault or placed in the correct Vault section of a composite configuration. +
+
+
+

All configurable properties can be found in org.springframework.cloud.config.server.environment.VaultEnvironmentProperties.

+
+
+

Vault 0.10.0 introduced a versioned key-value backend (k/v backend version 2) that exposes a different API than earlier versions, it now requires a data/ between the mount path and the actual context path and wraps secrets in a data object. Setting kvVersion=2 will take this into account.

+
+
+

Optionally, there is support for the Vault Enterprise X-Vault-Namespace header. To have it sent to Vault set the namespace property.

+
+
+

With your config server running, you can make HTTP requests to the server to retrieve +values from the Vault backend. +To do so, you need a token for your Vault server.

+
+
+

First, place some data in you Vault, as shown in the following example:

+
+
+
+
$ vault kv put secret/application foo=bar baz=bam
+$ vault kv put secret/myapp foo=myappsbar
+
+
+
+

Second, make an HTTP request to your config server to retrieve the values, as shown in the following example:

+
+
+

$ curl -X "GET" "http://localhost:8888/myapp/default" -H "X-Config-Token: yourtoken"

+
+
+

You should see a response similar to the following:

+
+
+
+
{
+   "name":"myapp",
+   "profiles":[
+      "default"
+   ],
+   "label":null,
+   "version":null,
+   "state":null,
+   "propertySources":[
+      {
+         "name":"vault:myapp",
+         "source":{
+            "foo":"myappsbar"
+         }
+      },
+      {
+         "name":"vault:application",
+         "source":{
+            "baz":"bam",
+            "foo":"bar"
+         }
+      }
+   ]
+}
+
+
+
+
Multiple Properties Sources
+
+

When using Vault, you can provide your applications with multiple properties sources. +For example, assume you have written data to the following paths in Vault:

+
+
+
+
secret/myApp,dev
+secret/myApp
+secret/application,dev
+secret/application
+
+
+
+

Properties written to secret/application are available to all applications using the Config Server. +An application with the name, myApp, would have any properties written to secret/myApp and secret/application available to it. +When myApp has the dev profile enabled, properties written to all of the above paths would be available to it, with properties in the first path in the list taking priority over the others.

+
+
+
+
+

Accessing Backends Through a Proxy

+
+

The configuration server can access a Git or Vault backend through an HTTP or HTTPS proxy. This behavior is controlled for either Git or Vault by settings under proxy.http and proxy.https. These settings are per repository, so if you are using a composite environment repository you must configure proxy settings for each backend in the composite individually. If using a network which requires separate proxy servers for HTTP and HTTPS URLs, you can configure both the HTTP and the HTTPS proxy settings for a single backend.

+
+
+

The following table describes the proxy configuration properties for both HTTP and HTTPS proxies. All of these properties must be prefixed by proxy.http or proxy.https.

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Proxy Configuration Properties
Property NameRemarks

host

The host of the proxy.

port

The port with which to access the proxy.

nonProxyHosts

Any hosts which the configuration server should access outside the proxy. If values are provided for both proxy.http.nonProxyHosts and proxy.https.nonProxyHosts, the proxy.http value will be used.

username

The username with which to authenticate to the proxy. If values are provided for both proxy.http.username and proxy.https.username, the proxy.http value will be used.

password

The password with which to authenticate to the proxy. If values are provided for both proxy.http.password and proxy.https.password, the proxy.http value will be used.

+
+

The following configuration uses an HTTPS proxy to access a Git repository.

+
+
+
+
spring:
+  profiles:
+    active: git
+  cloud:
+    config:
+      server:
+        git:
+          uri: https://github.com/spring-cloud-samples/config-repo
+          proxy:
+            https:
+              host: my-proxy.host.io
+              password: myproxypassword
+              port: '3128'
+              username: myproxyusername
+              nonProxyHosts: example.com
+
+
+
+
+

Sharing Configuration With All Applications

+
+

Sharing configuration between all applications varies according to which approach you take, as described in the following topics:

+
+ +
+
File Based Repositories
+
+

With file-based (git, svn, and native) repositories, resources with file names in application* (application.properties, application.yml, application-*.properties, and so on) are shared between all client applications. +You can use resources with these file names to configure global defaults and have them be overridden by application-specific files as necessary.

+
+
+

The property overrides feature can also be used for setting global defaults, with placeholders applications +allowed to override them locally.

+
+
+ + + + + +
+ + +With the “native” profile (a local file system backend) , you should use an explicit search location that is not part of the server’s own configuration. +Otherwise, the application* resources in the default search locations get removed because they are part of the server. +
+
+
+
+
Vault Server
+
+

When using Vault as a backend, you can share configuration with all applications by placing configuration in secret/application. +For example, if you run the following Vault command, all applications using the config server will have the properties foo and baz available to them:

+
+
+
+
$ vault write secret/application foo=bar baz=bam
+
+
+
+
+
+

JDBC Backend

+
+

Spring Cloud Config Server supports JDBC (relational database) as a backend for configuration properties. +You can enable this feature by adding spring-jdbc to the classpath and using the jdbc profile or by adding a bean of type JdbcEnvironmentRepository. +If you include the right dependencies on the classpath (see the user guide for more details on that), Spring Boot configures a data source.

+
+
+

The database needs to have a table called PROPERTIES with columns called APPLICATION, PROFILE, and LABEL (with the usual Environment meaning), plus KEY and VALUE for the key and value pairs in Properties style. +All fields are of type String in Java, so you can make them VARCHAR of whatever length you need. +Property values behave in the same way as they would if they came from Spring Boot properties files named {application}-{profile}.properties, including all the encryption and decryption, which will be applied as post-processing steps (that is, not in the repository implementation directly).

+
+
+
+

Redis Backend

+
+

Spring Cloud Config Server supports Redis as a backend for configuration properties. +You can enable this feature by adding a dependency to Spring Data Redis.

+
+
+
pom.xml
+
+
<dependencies>
+	<dependency>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-data-redis</artifactId>
+	</dependency>
+</dependencies>
+
+
+
+

The following configuration uses Spring Data RedisTemplate to access a Redis. We can use spring.redis.* properties to override default connection settings.

+
+
+
+
spring:
+  profiles:
+    active: redis
+  redis:
+    host: redis
+    port: 16379
+
+
+
+

The properties should be stored as fields in a hash. The name of hash should be the same as spring.application.name property or conjunction of spring.application.name and spring.profiles.active[n].

+
+
+
+
HMSET sample-app server.port "8100" sample.topic.name "test" test.property1 "property1"
+
+
+
+

After executing the command visible above a hash should contain the following keys with values:

+
+
+
+
HGETALL sample-app
+{
+  "server.port": "8100",
+  "sample.topic.name": "test",
+  "test.property1": "property1"
+}
+
+
+
+ + + + + +
+ + +When no profile is specified default will be used. +
+
+
+
+

AWS S3 Backend

+
+

Spring Cloud Config Server supports AWS S3 as a backend for configuration properties. +You can enable this feature by adding a dependency to the AWS Java SDK For Amazon S3.

+
+
+
pom.xml
+
+
<dependencies>
+	<dependency>
+		<groupId>com.amazonaws</groupId>
+		<artifactId>aws-java-sdk-s3</artifactId>
+	</dependency>
+</dependencies>
+
+
+
+

The following configuration uses the AWS S3 client to access configuration files. We can use spring.awss3.* properties to select the bucket where your configuration is stored.

+
+
+
+
spring:
+  profiles:
+    active: awss3
+  cloud:
+    config:
+      server:
+        awss3:
+          region: us-east-1
+          bucket: bucket1
+
+
+
+

It is also possible to specify an AWS URL to override the standard endpoint of your S3 service with spring.awss3.endpoint. This allows support for beta regions of S3, and other S3 compatible storage APIs.

+
+
+

Credentials are found using the Default AWS Credential Provider Chain. Versioned and encrypted buckets are supported without further configuration.

+
+
+

Configuration files are stored in your bucket as {application}-{profile}.properties, {application}-{profile}.yml or {application}-{profile}.json. An optional label can be provided to specify a directory path to the file.

+
+
+ + + + + +
+ + +When no profile is specified default will be used. +
+
+
+
+

CredHub Backend

+
+

Spring Cloud Config Server supports CredHub as a backend for configuration properties. +You can enable this feature by adding a dependency to Spring CredHub.

+
+
+
pom.xml
+
+
<dependencies>
+	<dependency>
+		<groupId>org.springframework.credhub</groupId>
+		<artifactId>spring-credhub-starter</artifactId>
+	</dependency>
+</dependencies>
+
+
+
+

The following configuration uses mutual TLS to access a CredHub:

+
+
+
+
spring:
+  profiles:
+    active: credhub
+  cloud:
+    config:
+      server:
+        credhub:
+          url: https://credhub:8844
+
+
+
+

The properties should be stored as JSON, such as:

+
+
+
+
credhub set --name "/demo-app/default/master/toggles" --type=json
+value: {"toggle.button": "blue", "toggle.link": "red"}
+
+
+
+
+
credhub set --name "/demo-app/default/master/abs" --type=json
+value: {"marketing.enabled": true, "external.enabled": false}
+
+
+
+

All client applications with the name spring.cloud.config.name=demo-app will have the following properties available to them:

+
+
+
+
{
+    toggle.button: "blue",
+    toggle.link: "red",
+    marketing.enabled: true,
+    external.enabled: false
+}
+
+
+
+ + + + + +
+ + +When no profile is specified default will be used and when no label is specified master will be used as a default value. +
+
+
+
OAuth 2.0
+
+

You can authenticate with OAuth 2.0 using UAA as a provider.

+
+
+
pom.xml
+
+
<dependencies>
+	<dependency>
+		<groupId>org.springframework.security</groupId>
+		<artifactId>spring-security-config</artifactId>
+	</dependency>
+	<dependency>
+		<groupId>org.springframework.security</groupId>
+		<artifactId>spring-security-oauth2-client</artifactId>
+	</dependency>
+</dependencies>
+
+
+
+

The following configuration uses OAuth 2.0 and UAA to access a CredHub:

+
+
+
+
spring:
+  profiles:
+    active: credhub
+  cloud:
+    config:
+      server:
+        credhub:
+          url: https://credhub:8844
+          oauth2:
+            registration-id: credhub-client
+  security:
+    oauth2:
+      client:
+        registration:
+          credhub-client:
+            provider: uaa
+            client-id: credhub_config_server
+            client-secret: asecret
+            authorization-grant-type: client_credentials
+        provider:
+          uaa:
+            token-uri: https://uaa:8443/oauth/token
+
+
+
+ + + + + +
+ + +The used UAA client-id should have credhub.read as scope. +
+
+
+
+
+

Composite Environment Repositories

+
+

In some scenarios, you may wish to pull configuration data from multiple environment repositories. +To do so, you can enable the composite profile in your configuration server’s application properties or YAML file. +If, for example, you want to pull configuration data from a Subversion repository as well as two Git repositories, you can set the following properties for your configuration server:

+
+
+
+
spring:
+  profiles:
+    active: composite
+  cloud:
+    config:
+      server:
+        composite:
+        -
+          type: svn
+          uri: file:///path/to/svn/repo
+        -
+          type: git
+          uri: file:///path/to/rex/git/repo
+        -
+          type: git
+          uri: file:///path/to/walter/git/repo
+
+
+
+

Using this configuration, precedence is determined by the order in which repositories are listed under the composite key. +In the above example, the Subversion repository is listed first, so a value found in the Subversion repository will override values found for the same property in one of the Git repositories. +A value found in the rex Git repository will be used before a value found for the same property in the walter Git repository.

+
+
+

If you want to pull configuration data only from repositories that are each of distinct types, you can enable the corresponding profiles, rather than the composite profile, in your configuration server’s application properties or YAML file. +If, for example, you want to pull configuration data from a single Git repository and a single HashiCorp Vault server, you can set the following properties for your configuration server:

+
+
+
+
spring:
+  profiles:
+    active: git, vault
+  cloud:
+    config:
+      server:
+        git:
+          uri: file:///path/to/git/repo
+          order: 2
+        vault:
+          host: 127.0.0.1
+          port: 8200
+          order: 1
+
+
+
+

Using this configuration, precedence can be determined by an order property. +You can use the order property to specify the priority order for all your repositories. +The lower the numerical value of the order property, the higher priority it has. +The priority order of a repository helps resolve any potential conflicts between repositories that contain values for the same properties.

+
+
+ + + + + +
+ + +If your composite environment includes a Vault server as in the previous example, you must include a Vault token in every request made to the configuration server. See Vault Backend. +
+
+
+ + + + + +
+ + +Any type of failure when retrieving values from an environment repository results in a failure for the entire composite environment. +
+
+
+ + + + + +
+ + +When using a composite environment, it is important that all repositories contain the same labels. +If you have an environment similar to those in the preceding examples and you request configuration data with the master label but the Subversion repository does not contain a branch called master, the entire request fails. +
+
+
+
Custom Composite Environment Repositories
+
+

In addition to using one of the environment repositories from Spring Cloud, you can also provide your own EnvironmentRepository bean to be included as part of a composite environment. +To do so, your bean must implement the EnvironmentRepository interface. +If you want to control the priority of your custom EnvironmentRepository within the composite environment, you should also implement the Ordered interface and override the getOrdered method. +If you do not implement the Ordered interface, your EnvironmentRepository is given the lowest priority.

+
+
+
+
+

Property Overrides

+
+

The Config Server has an “overrides” feature that lets the operator provide configuration properties to all applications. +The overridden properties cannot be accidentally changed by the application with the normal Spring Boot hooks. +To declare overrides, add a map of name-value pairs to spring.cloud.config.server.overrides, as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        overrides:
+          foo: bar
+
+
+
+

The preceding examples causes all applications that are config clients to read foo=bar, independent of their own configuration.

+
+
+ + + + + +
+ + +A configuration system cannot force an application to use configuration data in any particular way. +Consequently, overrides are not enforceable. +However, they do provide useful default behavior for Spring Cloud Config clients. +
+
+
+ + + + + +
+ + +Normally, Spring environment placeholders with ${} can be escaped (and resolved on the client) by using backslash (\) to escape the $ or the {. +For example, \${app.foo:bar} resolves to bar, unless the app provides its own app.foo. +
+
+
+ + + + + +
+ + +In YAML, you do not need to escape the backslash itself. +However, in properties files, you do need to escape the backslash, when you configure the overrides on the server. +
+
+
+

You can change the priority of all overrides in the client to be more like default values, letting applications supply their own values in environment variables or System properties, by setting the spring.cloud.config.overrideNone=true flag (the default is false) in the remote repository.

+
+
+
+
+

Health Indicator

+
+

Config Server comes with a Health Indicator that checks whether the configured EnvironmentRepository is working. +By default, it asks the EnvironmentRepository for an application named app, the default profile, and the default label provided by the EnvironmentRepository implementation.

+
+
+

You can configure the Health Indicator to check more applications along with custom profiles and custom labels, as shown in the following example:

+
+
+
+
spring:
+  cloud:
+    config:
+      server:
+        health:
+          repositories:
+            myservice:
+              label: mylabel
+            myservice-dev:
+              name: myservice
+              profiles: development
+
+
+
+

You can disable the Health Indicator by setting spring.cloud.config.server.health.enabled=false.

+
+
+
+

Security

+
+

You can secure your Config Server in any way that makes sense to you (from physical network security to OAuth2 bearer tokens), because Spring Security and Spring Boot offer support for many security arrangements.

+
+
+

To use the default Spring Boot-configured HTTP Basic security, include Spring Security on the classpath (for example, through spring-boot-starter-security). +The default is a username of user and a randomly generated password. A random password is not useful in practice, so we recommend you configure the password (by setting spring.security.user.password) and encrypt it (see below for instructions on how to do that).

+
+
+
+

Encryption and Decryption

+
+ + + + + +
+ + +To use the encryption and decryption features you need the full-strength JCE installed in your JVM (it is not included by default). +You can download the “Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files” from Oracle and follow the installation instructions (essentially, you need to replace the two policy files in the JRE lib/security directory with the ones that you downloaded). +
+
+
+

If the remote property sources contain encrypted content (values starting with {cipher}), they are decrypted before sending to clients over HTTP. +The main advantage of this setup is that the property values need not be in plain text when they are “at rest” (for example, in a git repository). +If a value cannot be decrypted, it is removed from the property source and an additional property is added with the same key but prefixed with invalid and a value that means “not applicable” (usually <n/a>). +This is largely to prevent cipher text being used as a password and accidentally leaking.

+
+
+

If you set up a remote config repository for config client applications, it might contain an application.yml similar to the following:

+
+
+
application.yml
+
+
spring:
+  datasource:
+    username: dbuser
+    password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'
+
+
+
+

Encrypted values in a .properties file must not be wrapped in quotes. Otherwise, the value is not decrypted. The following example shows values that would work:

+
+
+
application.properties
+
+
spring.datasource.username: dbuser
+spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ
+
+
+
+

You can safely push this plain text to a shared git repository, and the secret password remains protected.

+
+
+

The server also exposes /encrypt and /decrypt endpoints (on the assumption that these are secured and only accessed by authorized agents). +If you edit a remote config file, you can use the Config Server to encrypt values by POSTing to the /encrypt endpoint, as shown in the following example:

+
+
+
+
$ curl localhost:8888/encrypt -d mysecret
+682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
+
+
+
+ + + + + +
+ + +If the value you encrypt has characters in it that need to be URL encoded, you should use the --data-urlencode option to curl to make sure they are encoded properly. +
+
+
+ + + + + +
+ + +Be sure not to include any of the curl command statistics in the encrypted value. +Outputting the value to a file can help avoid this problem. +
+
+
+

The inverse operation is also available through /decrypt (provided the server is +configured with a symmetric key or a full key pair), as shown in the following example:

+
+
+
+
$ curl localhost:8888/decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
+mysecret
+
+
+
+ + + + + +
+ + +If you testing with curl, then use --data-urlencode (instead of -d) or set an explicit Content-Type: text/plain to make sure curl encodes the data correctly when there are special characters ('+' is particularly tricky). +
+
+
+

Take the encrypted value and add the {cipher} prefix before you put it in the YAML or properties file and before you commit and push it to a remote (potentially insecure) store.

+
+
+

The /encrypt and /decrypt endpoints also both accept paths in the form of /*/{application}/{profiles}, which can be used to control cryptography on a per-application (name) and per-profile basis when clients call into the main environment resource.

+
+
+ + + + + +
+ + +To control the cryptography in this granular way, you must also provide a @Bean of type TextEncryptorLocator that creates a different encryptor per name and profiles. +The one that is provided by default does not do so (all encryptions use the same key). +
+
+
+

The spring command line client (with Spring Cloud CLI extensions +installed) can also be used to encrypt and decrypt, as shown in the following example:

+
+
+
+
$ spring encrypt mysecret --key foo
+682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
+$ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
+mysecret
+
+
+
+

To use a key in a file (such as an RSA public key for encryption), prepend +the key value with "@" and provide the file path, as shown in the following example:

+
+
+
+
$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub
+AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+...
+
+
+
+ + + + + +
+ + +The --key argument is mandatory (despite having a -- prefix). +
+
+
+
+

Key Management

+
+

The Config Server can use a symmetric (shared) key or an asymmetric one (RSA key pair). +The asymmetric choice is superior in terms of security, but it is often more convenient to use a symmetric key since it is a single property value to configure in the bootstrap.properties.

+
+
+

To configure a symmetric key, you need to set encrypt.key to a secret String (or use the ENCRYPT_KEY environment variable to keep it out of plain-text configuration files).

+
+
+ + + + + +
+ + +You cannot configure an asymmetric key using encrypt.key. +
+
+
+

To configure an asymmetric key use a keystore (e.g. as +created by the keytool utility that comes with the JDK). The +keystore properties are encrypt.keyStore.* with * equal to

+
+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDescription

encrypt.keyStore.location

Contains a Resource location

encrypt.keyStore.password

Holds the password that unlocks the keystore

encrypt.keyStore.alias

Identifies which key in the store to use

encrypt.keyStore.type

The type of KeyStore to create. Defaults to jks.

+
+

The encryption is done with the public key, and a private key is +needed for decryption. +Thus, in principle, you can configure only the public key in the server if you want to only encrypt (and are prepared to decrypt the values yourself locally with the private key). +In practice, you might not want to do decrypt locally, because it spreads the key management process around all the clients, instead of +concentrating it in the server. +On the other hand, it can be a useful option if your config server is relatively insecure and only a handful of clients need the encrypted properties.

+
+
+
+

Creating a Key Store for Testing

+
+

To create a keystore for testing, you can use a command resembling the following:

+
+
+
+
$ keytool -genkeypair -alias mytestkey -keyalg RSA \
+  -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" \
+  -keypass changeme -keystore server.jks -storepass letmein
+
+
+
+ + + + + +
+ + +When using JDK 11 or above you may get the following warning when using the command above. In this case +you probably want to make sure the keypass and storepass values match. +
+
+
+
+
Warning:  Different store and key passwords not supported for PKCS12 KeyStores. Ignoring user-specified -keypass value.
+
+
+
+

Put the server.jks file in the classpath (for instance) and then, in +your bootstrap.yml, for the Config Server, create the following settings:

+
+
+
+
encrypt:
+  keyStore:
+    location: classpath:/server.jks
+    password: letmein
+    alias: mytestkey
+    secret: changeme
+
+
+
+
+

Using Multiple Keys and Key Rotation

+
+

In addition to the {cipher} prefix in encrypted property values, the Config Server looks for zero or more {name:value} prefixes before the start of the (Base64 encoded) cipher text. +The keys are passed to a TextEncryptorLocator, which can do whatever logic it needs to locate a TextEncryptor for the cipher. +If you have configured a keystore (encrypt.keystore.location), the default locator looks for keys with aliases supplied by the key prefix, with a cipher text like resembling the following:

+
+
+
+
foo:
+  bar: `{cipher}{key:testkey}...`
+
+
+
+

The locator looks for a key named "testkey". +A secret can also be supplied by using a {secret:…​} value in the prefix. +However, if it is not supplied, the default is to use the keystore password (which is what you get when you build a keystore and do not specify a secret). +If you do supply a secret, you should also encrypt the secret using a custom SecretLocator.

+
+
+

When the keys are being used only to encrypt a few bytes of configuration data (that is, they are not being used elsewhere), key rotation is hardly ever necessary on cryptographic grounds. +However, you might occasionally need to change the keys (for example, in the event of a security breach). +In that case, all the clients would need to change their source config files (for example, in git) and use a new {key:…​} prefix in all the ciphers. +Note that the clients need to first check that the key alias is available in the Config Server keystore.

+
+
+ + + + + +
+ + +If you want to let the Config Server handle all encryption as well as decryption, the {name:value} prefixes can also be added as plain text posted to the /encrypt endpoint, . +
+
+
+
+

Serving Encrypted Properties

+
+

Sometimes you want the clients to decrypt the configuration locally, instead of doing it in the server. +In that case, if you provide the encrypt.* configuration to locate a key, you can still have /encrypt and /decrypt endpoints, but you need to explicitly switch off the decryption of outgoing properties by placing spring.cloud.config.server.encrypt.enabled=false in bootstrap.[yml|properties]. +If you do not care about the endpoints, it should work if you do not configure either the key or the enabled flag.

+
+
+
+
+
+

Serving Alternative Formats

+
+
+

The default JSON format from the environment endpoints is perfect for consumption by Spring applications, because it maps directly onto the Environment abstraction. +If you prefer, you can consume the same data as YAML or Java properties by adding a suffix (".yml", ".yaml" or ".properties") to the resource path. +This can be useful for consumption by applications that do not care about the structure of the JSON endpoints or the extra metadata they provide (for example, an application that is not using Spring might benefit from the simplicity of this approach).

+
+
+

The YAML and properties representations have an additional flag (provided as a boolean query parameter called resolvePlaceholders) to signal that placeholders in the source documents (in the standard Spring ${…​} form) should be resolved in the output before rendering, where possible. +This is a useful feature for consumers that do not know about the Spring placeholder conventions.

+
+
+ + + + + +
+ + +There are limitations in using the YAML or properties formats, mainly in relation to the loss of metadata. +For example, the JSON is structured as an ordered list of property sources, with names that correlate with the source. +The YAML and properties forms are coalesced into a single map, even if the origin of the values has multiple sources, and the names of the original source files are lost. +Also, the YAML representation is not necessarily a faithful representation of the YAML source in a backing repository either. It is constructed from a list of flat property sources, and assumptions have to be made about the form of the keys. +
+
+
+
+
+

Serving Plain Text

+
+
+

Instead of using the Environment abstraction (or one of the alternative representations of it in YAML or properties format), your applications might need generic plain-text configuration files that are tailored to their environment. +The Config Server provides these through an additional endpoint at /{application}/{profile}/{label}/{path}, where application, profile, and label have the same meaning as the regular environment endpoint, but path is a path to a file name (such as log.xml). +The source files for this endpoint are located in the same way as for the environment endpoints. +The same search path is used for properties and YAML files. +However, instead of aggregating all matching resources, only the first one to match is returned.

+
+
+

After a resource is located, placeholders in the normal format (${…​}) are resolved by using the effective Environment for the supplied application name, profile, and label. +In this way, the resource endpoint is tightly integrated with the environment endpoints. +Consider the following example for a GIT or SVN repository:

+
+
+
+
application.yml
+nginx.conf
+
+
+
+

where nginx.conf looks like this:

+
+
+
+
server {
+    listen              80;
+    server_name         ${nginx.server.name};
+}
+
+
+
+

and application.yml like this:

+
+
+
+
nginx:
+  server:
+    name: example.com
+---
+spring:
+  profiles: development
+nginx:
+  server:
+    name: develop.com
+
+
+
+

The /foo/default/master/nginx.conf resource might be as follows:

+
+
+
+
server {
+    listen              80;
+    server_name         example.com;
+}
+
+
+
+

and /foo/development/master/nginx.conf like this:

+
+
+
+
server {
+    listen              80;
+    server_name         develop.com;
+}
+
+
+
+ + + + + +
+ + +As with the source files for environment configuration, the profile is used to resolve the file name. +So, if you want a profile-specific file, /*/development/*/logback.xml can be resolved by a file called logback-development.xml (in preference to logback.xml). +
+
+
+ + + + + +
+ + +If you do not want to supply the label and let the server use the default label, you can supply a useDefaultLabel request parameter. +So, the preceding example for the default profile could be /foo/default/nginx.conf?useDefaultLabel. +
+
+
+

Decrpyting Plain Text

+
+

By default, encrypted values in plain text files are not decrypted. In order to enable decryption for plain text files, set spring.cloud.config.server.encrypt.enabled=true and spring.cloud.config.server.encrypt.plainTextEncrypt=true in bootstrap.[yml|properties]

+
+
+ + + + + +
+ + +Decrpyting plain text files is only supported for YAML, JSON, and properties file extensions. +
+
+
+

If this feature is enabled, and an unsupported file extention is requested, any encrypted values in the file will not be decrypted.

+
+
+
+
+
+

Embedding the Config Server

+
+
+

The Config Server runs best as a standalone application. +However, if need be, you can embed it in another application. +To do so, use the @EnableConfigServer annotation. +An optional property named spring.cloud.config.server.bootstrap can be useful in this case. +It is a flag to indicate whether the server should configure itself from its own remote repository. +By default, the flag is off, because it can delay startup. +However, when embedded in another application, it makes sense to initialize the same way as any other application. +When setting spring.cloud.config.server.bootstrap to true you must also use a composite environment repository configuration. +For example

+
+
+
+
spring:
+  application:
+    name: configserver
+  profiles:
+    active: composite
+  cloud:
+    config:
+      server:
+        composite:
+          - type: native
+            search-locations: ${HOME}/Desktop/config
+        bootstrap: true
+
+
+
+ + + + + +
+ + +If you use the bootstrap flag, the config server needs to have its name and repository URI configured in bootstrap.yml. +
+
+
+

To change the location of the server endpoints, you can (optionally) set spring.cloud.config.server.prefix (for example, /config), to serve the resources under a prefix. +The prefix should start but not end with a /. +It is applied to the @RequestMappings in the Config Server (that is, underneath the Spring Boot server.servletPath and server.contextPath prefixes).

+
+
+

If you want to read the configuration for an application directly from the backend repository (instead of from the config server), you +basically want an embedded config server with no endpoints. +You can switch off the endpoints entirely by not using the @EnableConfigServer annotation (set spring.cloud.config.server.bootstrap=true).

+
+
+
+
+

Push Notifications and Spring Cloud Bus

+
+
+

Many source code repository providers (such as Github, Gitlab, Gitea, Gitee, Gogs, or Bitbucket) notify you of changes in a repository through a webhook. +You can configure the webhook through the provider’s user interface as a URL and a set of events in which you are interested. +For instance, Github uses a POST to the webhook with a JSON body containing a list of commits and a header (X-Github-Event) set to push. +If you add a dependency on the spring-cloud-config-monitor library and activate the Spring Cloud Bus in your Config Server, then a /monitor endpoint is enabled.

+
+
+

When the webhook is activated, the Config Server sends a RefreshRemoteApplicationEvent targeted at the applications it thinks might have changed. +The change detection can be strategized. +However, by default, it looks for changes in files that match the application name (for example, foo.properties is targeted at the foo application, while application.properties is targeted at all applications). +The strategy to use when you want to override the behavior is PropertyPathNotificationExtractor, which accepts the request headers and body as parameters and returns a list of file paths that changed.

+
+
+

The default configuration works out of the box with Github, Gitlab, Gitea, Gitee, Gogs or Bitbucket. +In addition to the JSON notifications from Github, Gitlab, Gitee, or Bitbucket, you can trigger a change notification by POSTing to /monitor with form-encoded body parameters in the pattern of path={application}. +Doing so broadcasts to applications matching the {application} pattern (which can contain wildcards).

+
+
+ + + + + +
+ + +The RefreshRemoteApplicationEvent is transmitted only if the spring-cloud-bus is activated in both the Config Server and in the client application. +
+
+
+ + + + + +
+ + +The default configuration also detects filesystem changes in local git repositories. In that case, the webhook is not used. However, as soon as you edit a config file, a refresh is broadcast. +
+
+
+
+
+

Spring Cloud Config Client

+
+
+

A Spring Boot application can take immediate advantage of the Spring Config Server (or other external property sources provided by the application developer). +It also picks up some additional useful features related to Environment change events.

+
+
+

Config First Bootstrap

+
+

The default behavior for any application that has the Spring Cloud Config Client on the classpath is as follows: +When a config client starts, it binds to the Config Server (through the spring.cloud.config.uri bootstrap configuration property) and initializes Spring Environment with remote property sources.

+
+
+

The net result of this behavior is that all client applications that want to consume the Config Server need a bootstrap.yml (or an environment variable) with the server address set in spring.cloud.config.uri (it defaults to "http://localhost:8888").

+
+
+
+

Discovery First Bootstrap

+
+

If you use a DiscoveryClient implementation, such as Spring Cloud Netflix and Eureka Service Discovery or Spring Cloud Consul, you can have the Config Server register with the Discovery Service. +However, in the default “Config First” mode, clients cannot take advantage of the registration.

+
+
+

If you prefer to use DiscoveryClient to locate the Config Server, you can do so by setting spring.cloud.config.discovery.enabled=true (the default is false). +The net result of doing so is that client applications all need a bootstrap.yml (or an environment variable) with the appropriate discovery configuration. +For example, with Spring Cloud Netflix, you need to define the Eureka server address (for example, in eureka.client.serviceUrl.defaultZone). +The price for using this option is an extra network round trip on startup, to locate the service registration. +The benefit is that, as long as the Discovery Service is a fixed point, the Config Server can change its coordinates. +The default service ID is configserver, but you can change that on the client by setting spring.cloud.config.discovery.serviceId (and on the server, in the usual way for a service, such as by setting spring.application.name).

+
+
+

The discovery client implementations all support some kind of metadata map (for example, we have eureka.instance.metadataMap for Eureka). +Some additional properties of the Config Server may need to be configured in its service registration metadata so that clients can connect correctly. +If the Config Server is secured with HTTP Basic, you can configure the credentials as user and password. +Also, if the Config Server has a context path, you can set configPath. +For example, the following YAML file is for a Config Server that is a Eureka client:

+
+
+
bootstrap.yml
+
+
eureka:
+  instance:
+    ...
+    metadataMap:
+      user: osufhalskjrtl
+      password: lviuhlszvaorhvlo5847
+      configPath: /config
+
+
+
+
+

Config Client Fail Fast

+
+

In some cases, you may want to fail startup of a service if it cannot connect to the Config Server. +If this is the desired behavior, set the bootstrap configuration property spring.cloud.config.fail-fast=true to make the client halt with an Exception.

+
+
+
+

Config Client Retry

+
+

If you expect that the config server may occasionally be unavailable when your application starts, you can make it keep trying after a failure. +First, you need to set spring.cloud.config.fail-fast=true. +Then you need to add spring-retry and spring-boot-starter-aop to your classpath. +The default behavior is to retry six times with an initial backoff interval of 1000ms and an exponential multiplier of 1.1 for subsequent backoffs. +You can configure these properties (and others) by setting the spring.cloud.config.retry.* configuration properties.

+
+
+ + + + + +
+ + +To take full control of the retry behavior, add a @Bean of type RetryOperationsInterceptor with an ID of configServerRetryInterceptor. +Spring Retry has a RetryInterceptorBuilder that supports creating one. +
+
+
+
+

Locating Remote Configuration Resources

+
+

The Config Service serves property sources from /{application}/{profile}/{label}, where the default bindings in the client app are as follows:

+
+
+
    +
  • +

    "name" = ${spring.application.name}

    +
  • +
  • +

    "profile" = ${spring.profiles.active} (actually Environment.getActiveProfiles())

    +
  • +
  • +

    "label" = "master"

    +
  • +
+
+
+ + + + + +
+ + +When setting the property ${spring.application.name} do not prefix your app name with the reserved word application- to prevent issues resolving the correct property source. +
+
+
+

You can override all of them by setting spring.cloud.config.* (where * is name, profile or label). +The label is useful for rolling back to previous versions of configuration. +With the default Config Server implementation, it can be a git label, branch name, or commit ID. +Label can also be provided as a comma-separated list. +In that case, the items in the list are tried one by one until one succeeds. +This behavior can be useful when working on a feature branch. +For instance, you might want to align the config label with your branch but make it optional (in that case, use spring.cloud.config.label=myfeature,develop).

+
+
+
+

Specifying Multiple Urls for the Config Server

+
+

To ensure high availability when you have multiple instances of Config Server deployed and expect one or more instances to be unavailable from time to time, you can either specify multiple URLs (as a comma-separated list under the spring.cloud.config.uri property) or have all your instances register in a Service Registry like Eureka ( if using Discovery-First Bootstrap mode ). Note that doing so ensures high availability only when the Config Server is not running (that is, when the application has exited) or when a connection timeout has occurred. For example, if the Config Server returns a 500 (Internal Server Error) response or the Config Client receives a 401 from the Config Server (due to bad credentials or other causes), the Config Client does not try to fetch properties from other URLs. An error of that kind indicates a user issue rather than an availability problem.

+
+
+

If you use HTTP basic security on your Config Server, it is currently possible to support per-Config Server auth credentials only if you embed the credentials in each URL you specify under the spring.cloud.config.uri property. If you use any other kind of security mechanism, you cannot (currently) support per-Config Server authentication and authorization.

+
+
+
+

Configuring Timeouts

+
+

If you want to configure timeout thresholds:

+
+
+
    +
  • +

    Read timeouts can be configured by using the property spring.cloud.config.request-read-timeout.

    +
  • +
  • +

    Connection timeouts can be configured by using the property spring.cloud.config.request-connect-timeout.

    +
  • +
+
+
+
+

Security

+
+

If you use HTTP Basic security on the server, clients need to know the password (and username if it is not the default). +You can specify the username and password through the config server URI or via separate username and password properties, as shown in the following example:

+
+
+
bootstrap.yml
+
+
spring:
+  cloud:
+    config:
+     uri: https://user:secret@myconfig.mycompany.com
+
+
+
+

The following example shows an alternate way to pass the same information:

+
+
+
bootstrap.yml
+
+
spring:
+  cloud:
+    config:
+     uri: https://myconfig.mycompany.com
+     username: user
+     password: secret
+
+
+
+

The spring.cloud.config.password and spring.cloud.config.username values override anything that is provided in the URI.

+
+
+

If you deploy your apps on Cloud Foundry, the best way to provide the password is through service credentials (such as in the URI, since it does not need to be in a config file). +The following example works locally and for a user-provided service on Cloud Foundry named configserver:

+
+
+
bootstrap.yml
+
+
spring:
+  cloud:
+    config:
+     uri: ${vcap.services.configserver.credentials.uri:http://user:password@localhost:8888}
+
+
+
+

If you use another form of security, you might need to provide a RestTemplate to the ConfigServicePropertySourceLocator (for example, by grabbing it in the bootstrap context and injecting it).

+
+
+

Health Indicator

+
+

The Config Client supplies a Spring Boot Health Indicator that attempts to load configuration from the Config Server. +The health indicator can be disabled by setting health.config.enabled=false. +The response is also cached for performance reasons. +The default cache time to live is 5 minutes. +To change that value, set the health.config.time-to-live property (in milliseconds).

+
+
+
+

Providing A Custom RestTemplate

+
+

In some cases, you might need to customize the requests made to the config server from the client. +Typically, doing so involves passing special Authorization headers to authenticate requests to the server. +To provide a custom RestTemplate:

+
+
+
    +
  1. +

    Create a new configuration bean with an implementation of PropertySourceLocator, as shown in the following example:

    +
  2. +
+
+
+
CustomConfigServiceBootstrapConfiguration.java
+
+
@Configuration
+public class CustomConfigServiceBootstrapConfiguration {
+    @Bean
+    public ConfigServicePropertySourceLocator configServicePropertySourceLocator() {
+        ConfigClientProperties clientProperties = configClientProperties();
+       ConfigServicePropertySourceLocator configServicePropertySourceLocator =  new ConfigServicePropertySourceLocator(clientProperties);
+        configServicePropertySourceLocator.setRestTemplate(customRestTemplate(clientProperties));
+        return configServicePropertySourceLocator;
+    }
+}
+
+
+
+ + + + + +
+ + +For a simplified approach to adding Authorization headers, the spring.cloud.config.headers.* property can be used instead. +
+
+
+
    +
  1. +

    In resources/META-INF, create a file called +spring.factories and specify your custom configuration, as shown in the following example:

    +
  2. +
+
+
+
spring.factories
+
+
org.springframework.cloud.bootstrap.BootstrapConfiguration = com.my.config.client.CustomConfigServiceBootstrapConfiguration
+
+
+
+
+

Vault

+
+

When using Vault as a backend to your config server, the client needs to supply a token for the server to retrieve values from Vault. +This token can be provided within the client by setting spring.cloud.config.token +in bootstrap.yml, as shown in the following example:

+
+
+
bootstrap.yml
+
+
spring:
+  cloud:
+    config:
+      token: YourVaultToken
+
+
+
+
+
+

Nested Keys In Vault

+
+

Vault supports the ability to nest keys in a value stored in Vault, as shown in the following example:

+
+
+

echo -n '{"appA": {"secret": "appAsecret"}, "bar": "baz"}' | vault write secret/myapp -

+
+
+

This command writes a JSON object to your Vault. +To access these values in Spring, you would use the traditional dot(.) annotation, as shown in the following example

+
+
+
+
@Value("${appA.secret}")
+String name = "World";
+
+
+
+

The preceding code would sets the value of the name variable to appAsecret.

+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/css/spring.css b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/css/spring.css new file mode 100644 index 00000000..40821db3 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/css/spring.css @@ -0,0 +1 @@ +@import url("https://fonts.googleapis.com/css?family=Karla:400,700|Montserrat:400,700");/*! normalize.css v2.1.2 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none !important}html,body{font-size:100%}html{font-family:Karla, sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}body{background:white;color:#000;padding:0;margin:0;font-size:16px;font-family:Karla, sans-serif;font-weight:normal;font-style:normal;line-height:1.6em;position:relative;cursor:auto}a:hover{cursor:pointer}img,object,embed{max-width:100%;height:auto}object,embed{height:100%}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none !important}.left{float:left !important}.right{float:right !important}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}.hide{display:none}.antialiased{-webkit-font-smoothing:antialiased}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}object,svg{display:inline-block;vertical-align:middle}.center{margin-left:auto;margin-right:auto}.spread{width:100%}p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{line-height:1.6}.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#0b0a0a;font-weight:bold;margin-top:0;margin-bottom:0.8em}div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}a{color:#097dff;line-height:inherit;text-decoration:none}a:hover,a:focus{color:#016be2;text-decoration:underline}a img{border:none}p{font-family:inherit;font-weight:normal;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}p aside{font-size:0.875em;line-height:1.35;font-style:italic}h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:Montserrat, sans-serif;font-weight:400;font-style:normal;color:#000;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:0.5em;line-height:1.0125em}h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#867c74;line-height:0}h1{font-size:2.125em}h2{font-size:1.6875em}h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}h4{font-size:1.125em}h5{font-size:1.125em}h6{font-size:1em}hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:bold;line-height:inherit}small{font-size:60%;line-height:inherit}code{font-family:Monaco, Menlo, Consolas, "Courier New", monospace;font-weight:normal;color:#3d3d3c;word-break:break-word}ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}ul,ol{margin-left:1.5em}ul.no-bullet,ol.no-bullet{margin-left:1.5em}ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square}ul.circle{list-style-type:circle}ul.disc{list-style-type:disc}ul.no-bullet{list-style:none}ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}dl dt{margin-bottom:0.3125em;font-weight:bold}dl dd{margin-bottom:1.25em}abbr,acronym{text-transform:uppercase;font-size:90%;color:#000;border-bottom:1px dotted #dddddd;cursor:help}abbr{text-transform:none}blockquote{margin:0 0 1.25em;padding:0.5625em 1.25em 0 1.1875em;border-left:1px solid #dddddd}blockquote cite{display:block;font-size:0.9375em;color:rgba(0,0,0,0.6)}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,0.6)}blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,0.85)}.vcard{display:inline-block;margin:0 0 1.25em 0;border:1px solid #dddddd;padding:0.625em 0.75em}.vcard li{margin:0;display:block}.vcard .fn{font-weight:bold;font-size:0.9375em}.vevent .summary{font-weight:bold}.vevent abbr{cursor:auto;text-decoration:none;font-weight:bold;border:none;padding:0 0.0625em}#tocbot{padding:0 0 1rem 0;line-height:1.5rem;padding-left:25px}.mobile-toc{padding:0 0 1rem 0;line-height:1.5rem}.mobile-toc li a{display:block;padding:.3rem 0}#tocbot ol li{list-style:none;padding:0;margin:0}#tocbot ol{margin:0;padding:0;padding-left:0.6rem}#tocbot .toc-link{display:block;padding-top:4px;padding-bottom:4px;outline:none}table{background:white;margin-bottom:1.25em;border:solid 1px #cacaca;border-spacing:0}table thead,table tfoot{background:#f7f8f7;font-weight:bold}table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:0.5em 0.625em 0.625em;font-size:inherit;color:#000;text-align:left}table tr th,table tr td{padding:0.5625em 0.625em;font-size:inherit;color:#000}table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;tab-size:4}h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-0.05em}.clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}.clearfix:after,.float-group:after{clear:both}*:not(pre)>code{font-size:0.8525em;font-style:normal !important;letter-spacing:0;padding:0.1em 0.3em 0.2em;background-color:rgba(0,0,0,0.05);border-radius:4px;text-rendering:optimizeSpeed}pre,pre>code{line-height:1.85;color:rgba(0,0,0,0.9);font-family:Monaco, Menlo, Consolas, "Courier New", monospace;font-weight:normal;text-rendering:optimizeSpeed;word-break:normal}pre{overflow:auto}em em{font-style:normal}strong strong{font-weight:normal}.keyseq{color:#6b625c}kbd{font-family:Monaco, Menlo, Consolas, "Courier New", monospace;display:inline-block;color:#000;font-size:0.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.2),0 0 0 0.1em white inset;box-shadow:0 1px 0 rgba(0,0,0,0.2),0 0 0 0.1em white inset;margin:0 0.15em;padding:0.2em 0.5em;vertical-align:middle;position:relative;top:-0.1em;white-space:nowrap}.keyseq kbd:first-child{margin-left:0}.keyseq kbd:last-child{margin-right:0}.menuseq,.menu{color:#191715}b.button:before,b.button:after{position:relative;top:-1px;font-weight:normal}b.button:before{content:"[";padding:0 3px 0 2px}b.button:after{content:"]";padding:0 2px 0 3px}p a>code:hover{color:rgba(0,0,0,0.9)}#toc{border-bottom:1px solid #ddddd8;padding-bottom:0.5em}#toc>ul{margin-left:0.125em}#toc ul.sectlevel0>li>a{font-style:italic}#toc ul.sectlevel0 ul.sectlevel1{margin:0.5em 0}#toc ul{list-style-type:none}#toc li{line-height:1.3334}#toc a{text-decoration:none}#toc a:active{text-decoration:underline}#toctitle{color:#0b0a0a;font-size:1.2em;display:none}body.toc2{padding-top:90px;text-rendering:optimizeLegibility}#content #toc{border-style:solid;border-width:1px;border-color:#d7d7d7;margin-bottom:1.25em;padding:1.25em;background:#f1f1f1;-webkit-border-radius:4px;border-radius:4px}#content #toc>:first-child{margin-top:0}#content #toc>:last-child{margin-bottom:0}#footer{padding-bottom:2rem}#footer #footer-text{padding:2rem 0;border-top:1px solid #efefed}#footer-text{color:rgba(0,0,0,0.6);line-height:1.44}.sect1{padding-bottom:0.625em}.sect1+.sect1{border-top:1px solid #efefed}#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;margin-top:0.1rem;display:block;visibility:hidden;text-align:center;font-weight:normal;color:rgba(0,0,0,0.2)}#content h1>a.anchor:hover,h2>a.anchor:hover,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4>a.anchor:hover,h5>a.anchor:hover,h6>a.anchor:hover{color:#097dff;text-decoration:none}#content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\0023";font-size:0.85em;display:block;padding-top:0.1em}#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#000;text-decoration:none}#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#262321}.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:Karla, sans-serif;font-size:1rem}table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0;padding:0.6rem 0}table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}.admonitionblock>table td.icon{text-align:center;vertical-align:top;padding-top:0.8em;width:80px}.admonitionblock>table td.icon img{max-width:initial}.admonitionblock>table td.icon .title{font-weight:bold;font-family:Montserrat, sans-serif;text-transform:uppercase}.admonitionblock>table td.content{padding-left:0em;padding-right:1.25em;border-left:1px solid #ddddd8}.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}.exampleblock>.content{border-style:solid;border-width:0;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#f1f1f1;border-radius:4px}.exampleblock>.content>:first-child{margin-top:0}.exampleblock>.content>:last-child{margin-bottom:0}.sidebarblock{border-style:solid;border-width:0;border-color:#d7d7d7;margin-bottom:1.25em;padding:1.25em;background:#f1f1f1;border-radius:4px;overflow:scroll}.sidebarblock>:first-child{margin-top:0}.sidebarblock>:last-child{margin-bottom:0}.sidebarblock>.content>.title{color:#0b0a0a;margin-top:0;text-align:center}.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#282c33;color:#e6e1dc;border-radius:4px}.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#282c33;color:#e6e1dc}.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class],.listingblock pre:not(.highlight){padding:1em 1.5rem;font-size:0.8125em}.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto}.literalblock.output pre{color:whitesmoke;background-color:rgba(0,0,0,0.9)}.listingblock{white-space:nowrap}.listingblock pre.highlightjs{padding:0.2rem 0}.listingblock pre.highlightjs>code{padding:1em 1.5rem;border-radius:4px}.listingblock>.content{position:relative}.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:0.8em;font-weight:bold;top:0.425rem;right:0.5rem;line-height:1;text-transform:uppercase;color:#999}.listingblock code[data-lang]:before{display:block}.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:0.5em;color:#999}.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}table.pyhltable td.code{padding-left:.75em;padding-right:0}pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}pre.pygments .lineno{display:block;margin-right:.25em}table.pyhltable .linenodiv{background:none !important;padding-right:0 !important}.quoteblock{margin:0 1em 1.25em 1.5em;display:block;text-align:left;padding-left:20px}.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,0.85);line-height:1.75;letter-spacing:0}.quoteblock blockquote{margin:0;padding:0;border:0;position:relative}.quoteblock blockquote:before{content:"\201c";font-size:2.75em;font-weight:bold;line-height:0.6em;margin-left:0em;margin-right:1rem;margin-top:0.8rem;color:rgba(0,0,0,0.1);position:absolute;top:0;left:-30px}.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}.quoteblock .attribution{margin-right:0.5ex}.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:0.5em 0;border-left:3px solid rgba(0,0,0,0.6)}.quoteblock .quoteblock blockquote{padding:0 0 0 0.75em}.quoteblock .quoteblock blockquote:before{display:none}.verseblock{margin:0 1em 1.25em 0;background-color:#f1f1f1;padding:1rem 1.4rem;border-radius:4px}.verseblock pre{font-family:Monaco, Menlo, Consolas, "Courier New", monospace;font-size:0.9rem;color:rgba(0,0,0,0.85);font-weight:300;text-rendering:optimizeLegibility}.verseblock pre strong{font-weight:400}.verseblock .attribution{margin-top:1.25rem;margin-left:0.5ex}.quoteblock .attribution,.verseblock .attribution{font-size:0.9375em;line-height:1.45;font-style:italic}.quoteblock .attribution br,.verseblock .attribution br{display:none}.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-0.025em;color:rgba(0,0,0,0.6)}.quoteblock.abstract{margin:0 0 1.25em 0;display:block}.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}.quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}table.tableblock{max-width:100%;border-collapse:separate;overflow-x:scroll}table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}table.tableblock,th.tableblock,td.tableblock{border:0 solid #cacaca;background:white}table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}table.frame-all{border-width:1px}table.frame-sides{border-width:0 1px}table.frame-topbot{border-width:1px 0}th.halign-left,td.halign-left{text-align:left}th.halign-right,td.halign-right{text-align:right}th.halign-center,td.halign-center{text-align:center}th.valign-top,td.valign-top{vertical-align:top}th.valign-bottom,td.valign-bottom{vertical-align:bottom}th.valign-middle,td.valign-middle{vertical-align:middle}table thead th,table tfoot th{font-weight:bold}tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:#34302d;font-weight:bold}p.tableblock>code:only-child{background:none;padding:0}p.tableblock{font-size:1em}td>div.verse{white-space:pre}ol{margin-left:1.75em}ul li ol{margin-left:1.5em}dl dd{margin-left:1.125em}dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:0.625em}ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}ul.unstyled,ol.unnumbered,ul.checklist{margin-left:0.625em}ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:0.85em}ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}ul.inline{margin:0 auto 0.625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}ul.inline>li>*{display:block}.unstyled dl dt{font-weight:normal;font-style:normal}ol.arabic{list-style-type:decimal}ol.decimal{list-style-type:decimal-leading-zero}ol.loweralpha{list-style-type:lower-alpha}ol.upperalpha{list-style-type:upper-alpha}ol.lowerroman{list-style-type:lower-roman}ol.upperroman{list-style-type:upper-roman}ol.lowergreek{list-style-type:lower-greek}.hdlist>table,.colist>table{border:0;background:none}.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}td.hdlist1,td.hdlist2{vertical-align:top;padding:0 0.625em}td.hdlist1{font-weight:bold;padding-bottom:1.25em}.literalblock+.colist,.listingblock+.colist{margin-top:-0.5em}.colist>table tr>td:first-of-type{padding:0 0.75em;line-height:1}.colist>table tr>td:first-of-type img{max-width:initial}.colist>table tr>td:last-of-type{padding:0.25em 0}.thumb,.th{line-height:0;display:inline-block;border:solid 4px white;-webkit-box-shadow:0 0 0 1px #dddddd;box-shadow:0 0 0 1px #dddddd}.imageblock.left,.imageblock[style*="float: left"]{margin:0.25em 0.625em 1.25em 0}.imageblock.right,.imageblock[style*="float: right"]{margin:0.25em 0 1.25em 0.625em}.imageblock>.title{margin-bottom:0}.imageblock.thumb,.imageblock.th{border-width:6px}.imageblock.thumb>.title,.imageblock.th>.title{padding:0 0.125em}.image.left,.image.right{margin-top:0.25em;margin-bottom:0.25em;display:inline-block;line-height:0}.image.left{margin-right:0.625em}.image.right{margin-left:0.625em}a.image{text-decoration:none;display:inline-block}a.image object{pointer-events:none}sup.footnote,sup.footnoteref{font-size:0.875em;position:static;vertical-align:super}sup.footnote a,sup.footnoteref a{text-decoration:none}sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}#footnotes{padding-top:0.75em;padding-bottom:0.75em;margin-bottom:0.625em}#footnotes hr{width:20%;min-width:6.25em;margin:-0.25em 0 0.75em 0;border-width:1px 0 0 0}#footnotes .footnote{padding:0 0.375em 0 0.225em;line-height:1.3334;font-size:0.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:0.2em}#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}#footnotes .footnote:last-of-type{margin-bottom:0}#content #footnotes{margin-top:-0.625em;margin-bottom:0;padding:0.75em 0}.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}.gist .file-data>table td.line-data{width:99%}div.unbreakable{page-break-inside:avoid}.big{font-size:larger}.small{font-size:smaller}.underline{text-decoration:underline}.overline{text-decoration:overline}.line-through{text-decoration:line-through}.aqua{color:#00bfbf}.aqua-background{background-color:#00fafa}.black{color:black}.black-background{background-color:black}.blue{color:#0000bf}.blue-background{background-color:#0000fa}.fuchsia{color:#bf00bf}.fuchsia-background{background-color:#fa00fa}.gray{color:#606060}.gray-background{background-color:#7d7d7d}.green{color:#006000}.green-background{background-color:#007d00}.lime{color:#00bf00}.lime-background{background-color:#00fa00}.maroon{color:#600000}.maroon-background{background-color:#7d0000}.navy{color:#000060}.navy-background{background-color:#00007d}.olive{color:#606000}.olive-background{background-color:#7d7d00}.purple{color:#600060}.purple-background{background-color:#7d007d}.red{color:#bf0000}.red-background{background-color:#fa0000}.silver{color:#909090}.silver-background{background-color:#bcbcbc}.teal{color:#006060}.teal-background{background-color:#007d7d}.white{color:#bfbfbf}.white-background{background-color:#fafafa}.yellow{color:#bfbf00}.yellow-background{background-color:#fafa00}span.icon>.fa{cursor:default}.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;cursor:default}.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#3f6a22}.admonitionblock td.icon .icon-tip:before{content:"\f0eb";color:#0077b9}.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#d88400}.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}.conum[data-value]{display:inline-block;color:#000 !important;background-color:#ffe157;-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:0.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans", "DejaVu Sans", sans-serif;font-style:normal;font-weight:bold}.conum[data-value] *{color:#fff !important}.conum[data-value]+b{display:none}.conum[data-value]:after{content:attr(data-value)}pre .conum[data-value]{position:relative;top:0;color:#000 !important;background-color:#ffe157;font-size:12px}b.conum *{color:inherit !important}.conum:not([data-value]):empty{display:none}.admonitionblock{background-color:#ecf1e8;padding:0.8em 0;margin:30px 0;width:auto;border-radius:4px;overflow-x:scroll}.admonitionblock.important{border-left:0px solid #e20000;background-color:#f9ebeb}.admonitionblock.warning{border-left:0px solid #d88400;background-color:#fff9e4}.admonitionblock.tip{border-left:0px solid #0077b9;background-color:#e9f1f6}.admonitionblock.caution{border-left:0px solid #e20000;background-color:#f9ebeb}.admonitionblock .exampleblock>.content{border:0 none;background-color:#fff}#toc a:hover{text-decoration:underline}.admonitionblock>table{margin-bottom:0}.admonitionblock>table td.content{border-left:none}@media print{#tocbot a.toc-link.node-name--H4{display:none}}.is-collapsible{max-height:1000px;overflow:hidden;transition:all 200ms ease-in-out}.is-collapsed{max-height:0}div.back-action,#toc.toc2 div.back-action{padding:0.8rem 0 0 0}div.back-action a,#toc.toc2 div.back-action a{position:relative;display:inline-block;padding:0.6rem 1.2rem;padding-left:35px}div.back-action a span,#toc.toc2 div.back-action a span{position:absolute;left:5px;top:5px;display:block;color:#333;height:26px;width:26px;border-radius:13px}div.back-action a i,#toc.toc2 div.back-action a i{position:absolute;top:5px;left:5px}div.back-action a:hover span,#toc.toc2 div.back-action a:hover span{color:#000}#tocbot.desktop-toc{padding-top:0.8rem}#header-spring{position:absolute;text-rendering:optimizeLegibility;top:0;left:0;right:0;height:90px;margin:0 1rem;padding:0 1rem;border-bottom:1px solid #ddddd8;border-top:3px solid #6BB344}#header-spring h1{margin:0;padding:0;font-size:22px;text-align:left;line-height:86px;padding-left:0.6rem}#header-spring h1 svg{width:200px}#header-spring h1 svg .st0{fill:#6BB344}#header-spring h1 svg .st2{fill:#444}body.book #header-spring{position:relative;top:auto;left:auto;right:auto;margin:0}body.book #header>h1:only-child{border:0 none;padding-bottom:1.2rem;font-size:1.8rem}body.book #header,body.book #content,body.book #footnotes,body.book #footer{margin:0 auto}body.toc2 #header-spring{position:absolute;left:0;right:0;top:0}body.toc2 #header>h1:only-child{font-size:2.2rem}body.toc2 #header,body.toc2 #content,body.toc2 #footnotes,body.toc2 #footer{margin:0 auto}body.toc2 #content{padding-top:2rem}#header,#content,#footnotes,#footer{width:100%;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:0.9375em;padding-right:0.9375em}#header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}#header:after,#content:after,#footnotes:after,#footer:after{clear:both}#content{margin-top:1.25em}#content:before{content:none}#header>h1:first-child{margin-top:2.55rem;margin-bottom:0.5em;margin-bottom:0.5em}#header>h1:first-child+#toc{margin-top:8px;border-top:0 none}#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}#header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:0;padding-bottom:2.25em;padding-left:0.25em;color:rgba(0,0,0,0.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}#header .details span:first-child{margin-left:-0.125em}#header .details span.email a{color:rgba(0,0,0,0.85)}#header .details br{display:none}#header .details br+span:before{content:"\00a0\2013\00a0"}#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,0.85)}#header .details br+span#revremark:before{content:"\00a0|\00a0"}#header #revnumber{text-transform:capitalize}#header #revnumber:after{content:"\00a0"}#content>h1:first-child:not([class]){color:rgba(0,0,0,0.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1.5rem;margin-bottom:1.25rem}h1{font-size:2.2rem;letter-spacing:-1px}h1,h2,h3,h4,h5,h6{font-weight:normal;font-family:Montserrat, Arial, Helvetica, sans-serif}h1:focus,h2:focus,h3:focus,h4:focus,h5:focus,h6:focus{box-shadow:none;outline:none}h2,h3,h4,h5,h6{padding:.8rem 0 .4rem}h1{font-size:1.75em}h2{font-size:1.6rem;letter-spacing:-1px}h3{font-size:1.5rem}h4{font-size:1.4rem}h5{font-size:1.3rem}h6{font-size:1.2rem}pre.highlight{background:#232323;color:#e6e1dc;border-radius:4px}pre.highlight code{color:#e6e1dc}pre.highlight a,#toc.toc2 a{color:#000;font-size:1rem}pre.highlight ul.sectlevel1,#toc.toc2 ul.sectlevel1{padding-left:0.2rem}pre.highlight ul.sectlevel1 li,#toc.toc2 ul.sectlevel1 li{line-height:1.4rem}::selection{background-color:#d1ff79}.literalblock pre::selection,.listingblock pre[class="highlight"]::selection,.highlight::selection,pre::selection,.highlight code::selection,.highlight code span::selection{background:rgba(255,255,255,0.2) !important}body.book #header{margin-bottom:2rem}body.toc2 #header{margin-bottom:0}.desktop-toc{display:none}.admonitionblock td.icon{display:none}.admonitionblock>table td.content{padding-left:1.25em}@media only screen and (min-width: 768px){#toctitle{font-size:1.375em}.sect1{padding-bottom:1.25em}.mobile-toc{display:none}.desktop-toc{display:block}.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:0.90625em}.admonitionblock td.icon{display:table-cell}.admonitionblock>table td.content{padding-left:0}body.toc2{padding-right:0}body.toc2 #toc.toc2{position:absolute;margin-top:0 !important;width:15em;top:0;border-top-width:0 !important;border-bottom-width:0 !important;margin-left:-15.9375em;z-index:1000;padding:0 1em 1.25em 0em;overflow:auto}body.toc2 #toc.toc2 #toctitle{margin-top:0;margin-bottom:0.8rem;font-size:1.2em}body.toc2 #toc.toc2>ul{font-size:0.9em;margin-bottom:0}body.toc2 #toc.toc2 ul ul{margin-left:0;padding-left:1em}body.toc2 #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:0.5em;margin-bottom:0.5em}body.toc2 #header,body.toc2 #content,body.toc2 #footnotes,body.toc2 #footer{padding-left:15.9375em;max-width:none}body.book #header-spring h1{max-width:1400px;margin:0 auto}body.book #header,body.book #content,body.book #footnotes,body.book #footer{max-width:1400px}body.is-position-fixed #toc.toc2{position:fixed;height:100%}h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}h1{font-size:1.75em}h2{font-size:1.6em}h3,#toctitle,.sidebarblock>.content>.title{font-size:1.5em}h4{font-size:1.4em}h5{font-size:1.2em}h6{font-size:1.2em}#tocbot a.toc-link.node-name--H1{font-style:italic}#tocbot ol{margin:0;padding:0;padding-left:0.6rem}#tocbot ol li{list-style:none;padding:0 0;margin:0;display:block}#tocbot{z-index:999}#tocbot .toc-link{position:relative;display:block;z-index:999;padding-right:5px;padding-top:4px;padding-bottom:4px}#tocbot .is-active-link{padding-right:3px;border-right:3px solid #6BB344}}@media only screen and (min-width: 768px){#tocbot>ul.toc-list{margin-bottom:0.5em;margin-left:0.125em}#tocbot ul.sectlevel0,#tocbot a.toc-link.node-name--H1+ul{padding-left:0}#tocbot a.toc-link{height:100%}.is-collapsible{max-height:3000px;overflow:hidden}.is-collapsed{max-height:0}.is-active-link{font-weight:700}}@media only screen and (min-width: 768px){body.toc2 #header,body.toc2 #content,body.toc2 #footer{background-repeat:repeat-y;background-position:14em 0;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDE0NUNENzNGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDE0NUNENzRGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMTQ1Q0Q3MUYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEMTQ1Q0Q3MkYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjmGxxYAAAAGUExURd3d2AAAAJlCnKAAAAAMSURBVHjaYmAACDAAAAIAAU9tWeEAAAAASUVORK5CYII=)}}@media only screen and (min-width: 1280px){body.toc2{padding-right:0}body.toc2 #toc.toc2{width:25em;left:auto;margin-left:-26.9375em}body.toc2 #toc.toc2 #toctitle{font-size:1.375em}body.toc2 #toc.toc2>ul{font-size:0.95em}body.toc2 #toc.toc2 ul ul{padding-left:1.25em}body.toc2 body.toc2.toc-right{padding-left:0;padding-right:20em}body.toc2 #header,body.toc2 #content,body.toc2 #footnotes,body.toc2 #footer{padding-left:26.9375em;max-width:1400px}body.toc2 #header-spring h1{margin:0 auto;max-width:1400px}.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:0.8125em}body.toc2 #header,body.toc2 #content,body.toc2 #footer{background-repeat:repeat-y;background-position:24em 0;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDE0NUNENzNGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDE0NUNENzRGMTVGMTFFODk5RjI5ODk3QURGRjcxMkEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMTQ1Q0Q3MUYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEMTQ1Q0Q3MkYxNUYxMUU4OTlGMjk4OTdBREZGNzEyQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjmGxxYAAAAGUExURd3d2AAAAJlCnKAAAAAMSURBVHjaYmAACDAAAAIAAU9tWeEAAAAASUVORK5CYII=)}} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/favicon.ico b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1a4956e64705230122da8c19d762a7f8e6971533 GIT binary patch literal 111804 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 Pn5$L/g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=M.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function c(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function c(e){l+=""}function u(e){("start"===e.event?o:c)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substring(s,g[0].offset)),s=g[0].offset,g===e){f.reverse().forEach(c);do u(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),u(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function l(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):B(a.k).forEach(function(e){c(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.endSameAsBegin&&(a.e=a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return s("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var u=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=u.length?t(u.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e){return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}function c(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t].endSameAsBegin&&(n.c[t].eR=o(n.c[t].bR.exec(e)[0])),n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function s(e,n){return!a&&r(n.iR,e)}function p(e,n){var t=R.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function d(e,n,t,r){var a=r?"":j.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=p(E,r),e?(M+=e[1],a+=d(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function b(){var e="string"==typeof E.sL;if(e&&!L[E.sL])return n(k);var t=e?f(E.sL,k,!0,B[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(B[E.sL]=t.top),d(t.language,t.value,!1,!0)}function v(){y+=null!=E.sL?b():h(),k=""}function m(e){y+=e.cN?d(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function N(e,n){if(k+=e,null==n)return v(),0;var t=c(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),v(),t.rB||t.eB||(k=n)),m(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),v(),a.eE&&(k=n));do E.cN&&(y+=I),E.skip||E.sL||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),m(r.starts,"")),a.rE?0:n.length}if(s(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var R=w(e);if(!R)throw new Error('Unknown language: "'+e+'"');l(R);var x,E=i||R,B={},y="";for(x=E;x!==R;x=x.parent)x.cN&&(y=d(x.cN,"",!0)+y);var k="",M=0;try{for(var C,A,S=0;;){if(E.t.lastIndex=S,C=E.t.exec(t),!C)break;A=N(t.substring(S,C.index),C[0]),S=C.index+A}for(N(t.substr(S)),x=E;x.parent;x=x.parent)x.cN&&(y+=I);return{r:M,value:y,language:e,top:E}}catch(O){if(O.message&&-1!==O.message.indexOf("Illegal"))return{r:0,value:n(t)};throw O}}function g(e,t){t=t||j.languages||B(L);var r={r:0,value:n(e)},a=r;return t.filter(w).filter(x).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return j.tabReplace||j.useBR?e.replace(C,function(e,n){return j.useBR&&"\n"===e?"
":j.tabReplace?n.replace(/\t/g,j.tabReplace):""}):e}function d(e,n,t){var r=n?y[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function h(e){var n,t,r,o,s,l=i(e);a(l)||(j.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,s=n.textContent,r=l?f(l,s,!0):g(s),t=c(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=u(t,c(o),s)),r.value=p(r.value),e.innerHTML=r.value,e.className=d(e.className,l,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){j=o(j,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,h)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=L[n]=t(e);r.aliases&&r.aliases.forEach(function(e){y[e]=n})}function R(){return B(L)}function w(e){return e=(e||"").toLowerCase(),L[e]||L[y[e]]}function x(e){var n=w(e);return n&&!n.disableAutodetect}var E=[],B=Object.keys,L={},y={},k=/^(no-?highlight|plain|text)$/i,M=/\blang(?:uage)?-([\w-]+)\b/i,C=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,I="
",j={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=h,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.autoDetection=x,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("dockerfile",function(e){return{aliases:["docker"],cI:!0,k:"from maintainer expose env arg user onbuild stopsignal",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:"run cmd entrypoint volume add copy workdir label healthcheck shell",starts:{e:/[^\\]\n/,sL:"bash"}}],i:")?[^\s\(]+(\s+[^\s\(]+)\s*=/,r:5,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"type",b://,k:"reified",r:0},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,r:0,c:[{b:/:/,e:/[=,\/]/,eW:!0,c:[{cN:"type",b:e.UIR},e.CLCM,e.CBCM],r:0},e.CLCM,e.CBCM,s,l,c,e.CNM]},e.CBCM]},{cN:"class",bK:"class interface trait",e:/[:\{(]|$/,eE:!0,i:"extends implements",c:[{bK:"public protected internal private constructor"},e.UTM,{cN:"type",b://,eB:!0,eE:!0,r:0},{cN:"type",b:/[,:]\s*/,e:/[<\(,]|$/,eB:!0,rE:!0},s,l]},c,{cN:"meta",b:"^#!/usr/bin/env",e:"$",i:"\n"},o]}});hljs.registerLanguage("java",function(e){var a="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",t=a+"(<"+a+"(\\s*,\\s*"+a+")*>)?",r="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",c={cN:"number",b:s,r:0};return{aliases:["jsp"],k:r,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+t+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:r,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:r,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},c,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"meta",b:/<\?xml/,e:/\?>/,r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0},{b:'b"',e:'"',skip:!0},{b:"b'",e:"'",skip:!0},s.inherit(s.ASM,{i:null,cN:null,c:null,skip:!0}),s.inherit(s.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("properties",function(r){var t="[ \\t\\f]*",e="[ \\t\\f]+",s="("+t+"[:=]"+t+"|"+e+")",n="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",c={e:s,r:0,starts:{cN:"string",e:/$/,r:0,c:[{b:"\\\\\\n"}]}};return{cI:!0,i:/\S/,c:[r.C("^\\s*[!#]","$"),{b:n+s,rB:!0,c:[{cN:"attr",b:n,endsParent:!0,r:0}],starts:c},{b:a+s,rB:!0,r:0,c:[{cN:"meta",b:a,endsParent:!0,r:0}],starts:c},{cN:"attr",r:0,b:a+t+"$"}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("asciidoc",function(e){return{aliases:["adoc"],c:[e.C("^/{4,}\\n","\\n/{4,}$",{r:10}),e.C("^//","$",{r:0}),{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"section",r:10,v:[{b:"^(={1,5}) .+?( \\1)?$"},{b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$"}]},{cN:"meta",b:"^:.+?:",e:"\\s",eE:!0,r:10},{cN:"meta",b:"^\\[.+?\\]$",r:0},{cN:"quote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"symbol",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"string",v:[{b:"``.+?''"},{b:"`.+?'"}]},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{b:"^'{3,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:!0,c:[{b:"(link|image:?):",r:0},{cN:"link",b:"\\w",e:"[^\\[]+",r:0},{cN:"string",b:"\\[",e:"\\]",eB:!0,eE:!0,r:0}],r:10}]}});hljs.registerLanguage("aspectj",function(e){var t="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else extends implements break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws privileged aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization staticinitialization withincode target within execution getWithinTypeName handler thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents warning error soft precedence thisAspectInstance",i="get set args call";return{k:t,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"aspect",e:/[{;=]/,eE:!0,i:/[:;"\[\]]/,c:[{bK:"extends implements pertypewithin perthis pertarget percflowbelow percflow issingleton"},e.UTM,{b:/\([^\)]*/,e:/[)]+/,k:t+" "+i,eE:!1}]},{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,r:0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"pointcut after before around throwing returning",e:/[)]/,eE:!1,i:/["\[\]]/,c:[{b:e.UIR+"\\s*\\(",rB:!0,c:[e.UTM]}]},{b:/[:]/,rB:!0,e:/[{;]/,r:0,eE:!1,k:t,i:/["\[\]]/,c:[{b:e.UIR+"\\s*\\(",k:t+" "+i,r:0},e.QSM]},{bK:"new throw",r:0},{cN:"function",b:/\w+ +\w+(\.)?\w+\s*\([^\)]*\)\s*((throws)[\w\s,]+)?[\{;]/,rB:!0,e:/[{;=]/,k:t,eE:!0,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,r:0,k:t,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},e.CNM,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("gradle",function(e){return{cI:!0,k:{keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment with",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage("go",function(e){var t={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:t,i:"",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}}); \ No newline at end of file diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/a11y-dark.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/a11y-dark.min.css new file mode 100644 index 00000000..b93b742a --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/a11y-dark.min.css @@ -0,0 +1,99 @@ +/* a11y-dark theme */ +/* Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css */ +/* @author: ericwbailey */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #d4d0ab; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #ffa07a; +} + +/* Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #f5ab35; +} + +/* Yellow */ +.hljs-attribute { + color: #ffd700; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #abe338; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #00e0e0; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #dcc6e0; +} + +.hljs { + display: block; + overflow-x: auto; + background: #2b2b2b; + color: #f8f8f2; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +@media screen and (-ms-high-contrast: active) { + .hljs-addition, + .hljs-attribute, + .hljs-built_in, + .hljs-builtin-name, + .hljs-bullet, + .hljs-comment, + .hljs-link, + .hljs-literal, + .hljs-meta, + .hljs-number, + .hljs-params, + .hljs-string, + .hljs-symbol, + .hljs-type, + .hljs-quote { + color: highlight; + } + + .hljs-keyword, + .hljs-selector-tag { + font-weight: bold; + } +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/an-old-hope.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/an-old-hope.min.css new file mode 100644 index 00000000..a6d56f4b --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/an-old-hope.min.css @@ -0,0 +1,89 @@ +/* + +An Old Hope – Star Wars Syntax (c) Gustavo Costa +Original theme - Ocean Dark Theme – by https://github.com/gavsiu +Based on Jesse Leite's Atom syntax theme 'An Old Hope' – https://github.com/JesseLeite/an-old-hope-syntax-atom + +*/ + +/* Death Star Comment */ +.hljs-comment, +.hljs-quote +{ + color: #B6B18B; +} + +/* Darth Vader */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion +{ + color: #EB3C54; +} + +/* Threepio */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link +{ + color: #E7CE56; +} + +/* Luke Skywalker */ +.hljs-attribute +{ + color: #EE7C2B; +} + +/* Obi Wan Kenobi */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition +{ + color: #4FB4D7; +} + +/* Yoda */ +.hljs-title, +.hljs-section +{ + color: #78BB65; +} + +/* Mace Windu */ +.hljs-keyword, +.hljs-selector-tag +{ + color: #B45EA4; +} + +/* Millenium Falcon */ +.hljs +{ + display: block; + overflow-x: auto; + background: #1C1D21; + color: #c0c5ce; + padding: 0.5em; +} + +.hljs-emphasis +{ + font-style: italic; +} + +.hljs-strong +{ + font-weight: bold; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-dark-reasonable.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-dark-reasonable.min.css new file mode 100644 index 00000000..fd41c996 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-dark-reasonable.min.css @@ -0,0 +1,77 @@ +/* + +Atom One Dark With support for ReasonML by Gidi Morris, based off work by Daniel Gamage + +Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax + +*/ +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + line-height: 1.3em; + color: #abb2bf; + background: #282c34; + border-radius: 5px; +} +.hljs-keyword, .hljs-operator { + color: #F92672; +} +.hljs-pattern-match { + color: #F92672; +} +.hljs-pattern-match .hljs-constructor { + color: #61aeee; +} +.hljs-function { + color: #61aeee; +} +.hljs-function .hljs-params { + color: #A6E22E; +} +.hljs-function .hljs-params .hljs-typing { + color: #FD971F; +} +.hljs-module-access .hljs-module { + color: #7e57c2; +} +.hljs-constructor { + color: #e2b93d; +} +.hljs-constructor .hljs-string { + color: #9CCC65; +} +.hljs-comment, .hljs-quote { + color: #b18eb1; + font-style: italic; +} +.hljs-doctag, .hljs-formula { + color: #c678dd; +} +.hljs-section, .hljs-name, .hljs-selector-tag, .hljs-deletion, .hljs-subst { + color: #e06c75; +} +.hljs-literal { + color: #56b6c2; +} +.hljs-string, .hljs-regexp, .hljs-addition, .hljs-attribute, .hljs-meta-string { + color: #98c379; +} +.hljs-built_in, .hljs-class .hljs-title { + color: #e6c07b; +} +.hljs-attr, .hljs-variable, .hljs-template-variable, .hljs-type, .hljs-selector-class, .hljs-selector-attr, .hljs-selector-pseudo, .hljs-number { + color: #d19a66; +} +.hljs-symbol, .hljs-bullet, .hljs-link, .hljs-meta, .hljs-selector-id, .hljs-title { + color: #61aeee; +} +.hljs-emphasis { + font-style: italic; +} +.hljs-strong { + font-weight: bold; +} +.hljs-link { + text-decoration: underline; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-dark.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-dark.min.css new file mode 100644 index 00000000..1616aafe --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-dark.min.css @@ -0,0 +1,96 @@ +/* + +Atom One Dark by Daniel Gamage +Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax + +base: #282c34 +mono-1: #abb2bf +mono-2: #818896 +mono-3: #5c6370 +hue-1: #56b6c2 +hue-2: #61aeee +hue-3: #c678dd +hue-4: #98c379 +hue-5: #e06c75 +hue-5-2: #be5046 +hue-6: #d19a66 +hue-6-2: #e6c07b + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #abb2bf; + background: #282c34; +} + +.hljs-comment, +.hljs-quote { + color: #5c6370; + font-style: italic; +} + +.hljs-doctag, +.hljs-keyword, +.hljs-formula { + color: #c678dd; +} + +.hljs-section, +.hljs-name, +.hljs-selector-tag, +.hljs-deletion, +.hljs-subst { + color: #e06c75; +} + +.hljs-literal { + color: #56b6c2; +} + +.hljs-string, +.hljs-regexp, +.hljs-addition, +.hljs-attribute, +.hljs-meta-string { + color: #98c379; +} + +.hljs-built_in, +.hljs-class .hljs-title { + color: #e6c07b; +} + +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-type, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-number { + color: #d19a66; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-meta, +.hljs-selector-id, +.hljs-title { + color: #61aeee; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-link { + text-decoration: underline; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-light.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-light.min.css new file mode 100644 index 00000000..d5bd1d2a --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/atom-one-light.min.css @@ -0,0 +1,96 @@ +/* + +Atom One Light by Daniel Gamage +Original One Light Syntax theme from https://github.com/atom/one-light-syntax + +base: #fafafa +mono-1: #383a42 +mono-2: #686b77 +mono-3: #a0a1a7 +hue-1: #0184bb +hue-2: #4078f2 +hue-3: #a626a4 +hue-4: #50a14f +hue-5: #e45649 +hue-5-2: #c91243 +hue-6: #986801 +hue-6-2: #c18401 + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #383a42; + background: #fafafa; +} + +.hljs-comment, +.hljs-quote { + color: #a0a1a7; + font-style: italic; +} + +.hljs-doctag, +.hljs-keyword, +.hljs-formula { + color: #a626a4; +} + +.hljs-section, +.hljs-name, +.hljs-selector-tag, +.hljs-deletion, +.hljs-subst { + color: #e45649; +} + +.hljs-literal { + color: #0184bb; +} + +.hljs-string, +.hljs-regexp, +.hljs-addition, +.hljs-attribute, +.hljs-meta-string { + color: #50a14f; +} + +.hljs-built_in, +.hljs-class .hljs-title { + color: #c18401; +} + +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-type, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-number { + color: #986801; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link, +.hljs-meta, +.hljs-selector-id, +.hljs-title { + color: #4078f2; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-link { + text-decoration: underline; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/dracula.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/dracula.min.css new file mode 100644 index 00000000..d591db68 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/dracula.min.css @@ -0,0 +1,76 @@ +/* + +Dracula Theme v1.2.0 + +https://github.com/zenorocha/dracula-theme + +Copyright 2015, All rights reserved + +Code licensed under the MIT license +http://zenorocha.mit-license.org + +@author Éverton Ribeiro +@author Zeno Rocha + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #282a36; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-section, +.hljs-link { + color: #8be9fd; +} + +.hljs-function .hljs-keyword { + color: #ff79c6; +} + +.hljs, +.hljs-subst { + color: #f8f8f2; +} + +.hljs-string, +.hljs-title, +.hljs-name, +.hljs-type, +.hljs-attribute, +.hljs-symbol, +.hljs-bullet, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #f1fa8c; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion, +.hljs-meta { + color: #6272a4; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-title, +.hljs-section, +.hljs-doctag, +.hljs-type, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/github.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/github.min.css new file mode 100644 index 00000000..791932b8 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/github.min.css @@ -0,0 +1,99 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #333; + background: #f8f8f8; +} + +.hljs-comment, +.hljs-quote { + color: #998; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #008080; +} + +.hljs-string, +.hljs-doctag { + color: #d14; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #900; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-regexp, +.hljs-link { + color: #009926; +} + +.hljs-symbol, +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/monokai-sublime.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/monokai-sublime.min.css new file mode 100644 index 00000000..2864170d --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/monokai-sublime.min.css @@ -0,0 +1,83 @@ +/* + +Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/ + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #23241f; +} + +.hljs, +.hljs-tag, +.hljs-subst { + color: #f8f8f2; +} + +.hljs-strong, +.hljs-emphasis { + color: #a8a8a2; +} + +.hljs-bullet, +.hljs-quote, +.hljs-number, +.hljs-regexp, +.hljs-literal, +.hljs-link { + color: #ae81ff; +} + +.hljs-code, +.hljs-title, +.hljs-section, +.hljs-selector-class { + color: #a6e22e; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-name, +.hljs-attr { + color: #f92672; +} + +.hljs-symbol, +.hljs-attribute { + color: #66d9ef; +} + +.hljs-params, +.hljs-class .hljs-title { + color: #f8f8f2; +} + +.hljs-string, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-selector-id, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-addition, +.hljs-variable, +.hljs-template-variable { + color: #e6db74; +} + +.hljs-comment, +.hljs-deletion, +.hljs-meta { + color: #75715e; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/monokai.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/monokai.min.css new file mode 100644 index 00000000..775d53f9 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/monokai.min.css @@ -0,0 +1,70 @@ +/* +Monokai style - ported by Luigi Maselli - http://grigio.org +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #272822; color: #ddd; +} + +.hljs-tag, +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-strong, +.hljs-name { + color: #f92672; +} + +.hljs-code { + color: #66d9ef; +} + +.hljs-class .hljs-title { + color: white; +} + +.hljs-attribute, +.hljs-symbol, +.hljs-regexp, +.hljs-link { + color: #bf79db; +} + +.hljs-string, +.hljs-bullet, +.hljs-subst, +.hljs-title, +.hljs-section, +.hljs-emphasis, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-addition, +.hljs-variable, +.hljs-template-tag, +.hljs-template-variable { + color: #a6e22e; +} + +.hljs-comment, +.hljs-quote, +.hljs-deletion, +.hljs-meta { + color: #75715e; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-doctag, +.hljs-title, +.hljs-section, +.hljs-type, +.hljs-selector-id { + font-weight: bold; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/solarized-light.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/solarized-light.min.css new file mode 100644 index 00000000..fdcfcc72 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/solarized-light.min.css @@ -0,0 +1,84 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #fdf6e3; + color: #657b83; +} + +.hljs-comment, +.hljs-quote { + color: #93a1a1; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-addition { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-string, +.hljs-meta .hljs-meta-string, +.hljs-literal, +.hljs-doctag, +.hljs-regexp { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-section, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-class .hljs-title, +.hljs-type { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-symbol, +.hljs-bullet, +.hljs-subst, +.hljs-meta, +.hljs-meta .hljs-keyword, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-link { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-built_in, +.hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #eee8d5; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/zenburn.min.css b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/zenburn.min.css new file mode 100644 index 00000000..07be5020 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/highlight/styles/zenburn.min.css @@ -0,0 +1,80 @@ +/* + +Zenburn style from voldmar.ru (c) Vladimir Epifanov +based on dark.css by Ivan Sagalaev + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #3f3f3f; + color: #dcdcdc; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-tag { + color: #e3ceab; +} + +.hljs-template-tag { + color: #dcdcdc; +} + +.hljs-number { + color: #8cd0d3; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-attribute { + color: #efdcbc; +} + +.hljs-literal { + color: #efefaf; +} + +.hljs-subst { + color: #8f8f8f; +} + +.hljs-title, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-section, +.hljs-type { + color: #efef8f; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-link { + color: #dca3a3; +} + +.hljs-deletion, +.hljs-string, +.hljs-built_in, +.hljs-builtin-name { + color: #cc9393; +} + +.hljs-addition, +.hljs-comment, +.hljs-quote, +.hljs-meta { + color: #7f9f7f; +} + + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/toc.js b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/toc.js new file mode 100644 index 00000000..a6e933bf --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/toc.js @@ -0,0 +1,107 @@ +var toctitle = document.getElementById('toctitle'); +var path = window.location.pathname; +if (toctitle != null) { + var oldtoc = toctitle.nextElementSibling; + var newtoc = document.createElement('div'); + newtoc.setAttribute('id', 'tocbot'); + newtoc.setAttribute('class', 'js-toc desktop-toc'); + oldtoc.setAttribute('class', 'mobile-toc'); + oldtoc.parentNode.appendChild(newtoc); + tocbot.init({ + contentSelector: '#content', + headingSelector: 'h1, h2, h3, h4, h5', + positionFixedSelector: 'body', + fixedSidebarOffset: 90, + smoothScroll: false + }); + if (!path.endsWith("index.html") && !path.endsWith("/")) { + var link = document.createElement("a"); + link.setAttribute("href", "index.html"); + link.innerHTML = " Back to index"; + var block = document.createElement("div"); + block.setAttribute('class', 'back-action'); + block.appendChild(link); + var toc = document.getElementById('toc'); + var next = document.getElementById('toctitle').nextElementSibling; + toc.insertBefore(block, next); + } +} + +var headerHtml = '
\n' + + '

\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '

\n' + + '
'; + +var header = document.createElement("div"); +header.innerHTML = headerHtml; +document.body.insertBefore(header, document.body.firstChild); \ No newline at end of file diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/tocbot/tocbot.css b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/tocbot/tocbot.css new file mode 100644 index 00000000..0632de23 --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/tocbot/tocbot.css @@ -0,0 +1 @@ +.toc{overflow-y:auto}.toc>.toc-list{overflow:hidden;position:relative}.toc>.toc-list li{list-style:none}.toc-list{margin:0;padding-left:10px}a.toc-link{color:currentColor;height:100%}.is-collapsible{max-height:1000px;overflow:hidden;transition:all 300ms ease-in-out}.is-collapsed{max-height:0}.is-position-fixed{position:fixed !important;top:0}.is-active-link{font-weight:700}.toc-link::before{background-color:#EEE;content:' ';display:inline-block;height:inherit;left:0;margin-top:-1px;position:absolute;width:2px}.is-active-link::before{background-color:#54BC4B} diff --git a/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/tocbot/tocbot.min.js b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/tocbot/tocbot.min.js new file mode 100644 index 00000000..943d8fdb --- /dev/null +++ b/spring-cloud-config/2.2.0.RELEASE/reference/htmlsingle/js/tocbot/tocbot.min.js @@ -0,0 +1 @@ +!function(e){function t(o){if(n[o])return n[o].exports;var l=n[o]={i:o,l:!1,exports:{}};return e[o].call(l.exports,l,l.exports,t),l.l=!0,l.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,n){(function(o){var l,i,s;!function(n,o){i=[],l=o(n),void 0!==(s="function"==typeof l?l.apply(t,i):l)&&(e.exports=s)}(void 0!==o?o:this.window||this.global,function(e){"use strict";function t(){for(var e={},t=0;te.fixedSidebarOffset?-1===n.className.indexOf(e.positionFixedClass)&&(n.className+=h+e.positionFixedClass):n.className=n.className.split(h+e.positionFixedClass).join("")}function s(t){var n=document.documentElement.scrollTop||f.scrollTop;e.positionFixedSelector&&i();var o,l=t;if(m&&null!==document.querySelector(e.tocSelector)&&l.length>0){d.call(l,function(t,i){if(t.offsetTop>n+e.headingsOffset+10){return o=l[0===i?i:i-1],!0}if(i===l.length-1)return o=l[l.length-1],!0});var s=document.querySelector(e.tocSelector).querySelectorAll("."+e.linkClass);u.call(s,function(t){t.className=t.className.split(h+e.activeLinkClass).join("")});var c=document.querySelector(e.tocSelector).querySelectorAll("."+e.listItemClass);u.call(c,function(t){t.className=t.className.split(h+e.activeListItemClass).join("")});var a=document.querySelector(e.tocSelector).querySelector("."+e.linkClass+".node-name--"+o.nodeName+'[href="#'+o.id+'"]');-1===a.className.indexOf(e.activeLinkClass)&&(a.className+=h+e.activeLinkClass);var p=a.parentNode;p&&-1===p.className.indexOf(e.activeListItemClass)&&(p.className+=h+e.activeListItemClass);var C=document.querySelector(e.tocSelector).querySelectorAll("."+e.listClass+"."+e.collapsibleClass);u.call(C,function(t){-1===t.className.indexOf(e.isCollapsedClass)&&(t.className+=h+e.isCollapsedClass)}),a.nextSibling&&-1!==a.nextSibling.className.indexOf(e.isCollapsedClass)&&(a.nextSibling.className=a.nextSibling.className.split(h+e.isCollapsedClass).join("")),r(a.parentNode.parentNode)}}function r(t){return-1!==t.className.indexOf(e.collapsibleClass)&&-1!==t.className.indexOf(e.isCollapsedClass)?(t.className=t.className.split(h+e.isCollapsedClass).join(""),r(t.parentNode.parentNode)):t}function c(t){var n=t.target||t.srcElement;"string"==typeof n.className&&-1!==n.className.indexOf(e.linkClass)&&(m=!1)}function a(){m=!0}var u=[].forEach,d=[].some,f=document.body,m=!0,h=" ";return{enableTocAnimation:a,disableTocAnimation:c,render:n,updateToc:s}}},function(e,t){e.exports=function(e){function t(e){return e[e.length-1]}function n(e){return+e.nodeName.split("H").join("")}function o(t){var o={id:t.id,children:[],nodeName:t.nodeName,headingLevel:n(t),textContent:t.textContent.trim()};return e.includeHtml&&(o.childNodes=t.childNodes),o}function l(l,i){for(var s=o(l),r=n(l),c=i,a=t(c),u=a?a.headingLevel:0,d=r-u;d>0;)a=t(c),a&&void 0!==a.children&&(c=a.children),d--;return r>=e.collapseDepth&&(s.isCollapsed=!0),c.push(s),c}function i(t,n){var o=n;e.ignoreSelector&&(o=n.split(",").map(function(t){return t.trim()+":not("+e.ignoreSelector+")"}));try{return document.querySelector(t).querySelectorAll(o)}catch(e){return console.warn("Element not found: "+t),null}}function s(e){return r.call(e,function(e,t){return l(o(t),e.nest),e},{nest:[]})}var r=[].reduce;return{nestHeadingsArray:s,selectHeadings:i}}},function(e,t){function n(e){function t(e){return"a"===e.tagName.toLowerCase()&&(e.hash.length>0||"#"===e.href.charAt(e.href.length-1))&&(n(e.href)===s||n(e.href)+"#"===s)}function n(e){return e.slice(0,e.lastIndexOf("#"))}function l(e){var t=document.getElementById(e.substring(1));t&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())}!function(){document.documentElement.style}();var i=e.duration,s=location.hash?n(location.href):location.href;!function(){function n(n){!t(n.target)||n.target.className.indexOf("no-smooth-scroll")>-1||"#"===n.target.href.charAt(n.target.href.length-2)&&"!"===n.target.href.charAt(n.target.href.length-1)||-1===n.target.className.indexOf(e.linkClass)||o(n.target.hash,{duration:i,callback:function(){l(n.target.hash)}})}document.body.addEventListener("click",n,!1)}()}function o(e,t){function n(e){s=e-i,window.scrollTo(0,c.easing(s,r,u,d)),s