├── .travis.yml ├── backend ├── src │ ├── main │ │ ├── resources │ │ │ ├── bootstrap.yml │ │ │ └── application.yml │ │ └── java │ │ │ └── de │ │ │ └── codecentric │ │ │ └── cloud │ │ │ └── backend │ │ │ ├── BackendApplication.java │ │ │ └── CalculationRestController.java │ └── test │ │ └── java │ │ └── de │ │ └── codecentric │ │ └── cloud │ │ └── backend │ │ └── BackendApplicationTests.java ├── .mvn │ └── wrapper │ │ ├── maven-wrapper.jar │ │ └── maven-wrapper.properties ├── .gitignore ├── README.md ├── Dockerfile ├── pom.xml ├── mvnw.cmd └── mvnw ├── frontend ├── src │ ├── main │ │ ├── resources │ │ │ ├── bootstrap.yml │ │ │ └── application.yml │ │ └── java │ │ │ └── de │ │ │ └── codecentric │ │ │ └── cloud │ │ │ └── frontend │ │ │ ├── FrontendApplication.java │ │ │ ├── FrontendRestController.java │ │ │ └── Calculation.java │ └── test │ │ └── java │ │ └── de │ │ └── codecentric │ │ └── cloud │ │ └── frontend │ │ └── FrontendApplicationTests.java ├── .mvn │ └── wrapper │ │ ├── maven-wrapper.jar │ │ └── maven-wrapper.properties ├── .gitignore ├── README.md ├── Dockerfile ├── pom.xml ├── mvnw.cmd └── mvnw ├── provision └── helm │ ├── Chart.yaml │ ├── tiller-clusterrolebinding.yaml │ ├── .helmignore │ ├── templates │ ├── NOTES.txt │ ├── zipkin-service.yaml │ ├── app-service.yaml │ ├── virtual-service.yaml │ ├── ingress.yaml │ ├── _helpers.tpl │ ├── zipkin-deployment.yaml │ ├── network-policy.yaml │ └── app-deployment.yaml │ └── values.yaml ├── renovate.json ├── README.md ├── docker-compose.yml ├── pom.xml ├── .github └── workflows │ └── build.yml └── .gitignore /.travis.yml: -------------------------------------------------------------------------------- 1 | language: java 2 | sudo: false 3 | script: mvn clean package 4 | -------------------------------------------------------------------------------- /backend/src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | application: 3 | name: backend 4 | -------------------------------------------------------------------------------- /frontend/src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | application: 3 | name: frontend -------------------------------------------------------------------------------- /backend/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcopaga/plain-spring-on-kubernetes/HEAD/backend/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /provision/helm/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | appVersion: "1.0" 3 | description: A Helm chart for Kubernetes 4 | name: plain 5 | version: 0.1.0 6 | -------------------------------------------------------------------------------- /frontend/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcopaga/plain-spring-on-kubernetes/HEAD/frontend/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /backend/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip 2 | -------------------------------------------------------------------------------- /frontend/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip 2 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "extends": [ 4 | "config:base" 5 | ], 6 | "automerge": true, 7 | "automergeType": "branch", 8 | "major": { 9 | "automerge": false 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8091 3 | 4 | management: 5 | security: 6 | enabled: false 7 | 8 | spring: 9 | zipkin: 10 | base-url: http://${zipkin.host:localhost}:${zipkin.port:9411}/ 11 | 12 | backend: 13 | url: http://backend:8090 -------------------------------------------------------------------------------- /backend/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8090 3 | 4 | management: 5 | security: 6 | enabled: false 7 | 8 | backend: 9 | processing: 10 | time: 11 | max: 1100 12 | 13 | spring: 14 | zipkin: 15 | base-url: http://${zipkin.host:localhost}:${zipkin.port:9411}/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Plain Spring Boot App on Kubernetes 2 | 3 | This projects deploys two microservices in kubernetes 4 | 5 | 6 | # Deploy the app 7 | 8 | ``` 9 | helm upgrade test . -i -w 10 | ``` 11 | 12 | Follow along the logs to see istio in action. You can use a tool like [kail](https://github.com/boz/kail) to see all log messages in one place. 13 | -------------------------------------------------------------------------------- /provision/helm/tiller-clusterrolebinding.yaml: -------------------------------------------------------------------------------- 1 | kind: ClusterRoleBinding 2 | apiVersion: rbac.authorization.k8s.io/v1beta1 3 | metadata: 4 | name: tiller-clusterrolebinding 5 | subjects: 6 | - kind: ServiceAccount 7 | name: tiller 8 | namespace: kube-system 9 | roleRef: 10 | kind: ClusterRole 11 | name: cluster-admin 12 | apiGroup: "" 13 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | ### NetBeans ### 19 | nbproject/private/ 20 | build/ 21 | nbbuild/ 22 | dist/ 23 | nbdist/ 24 | .nb-gradle/ -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | ### NetBeans ### 19 | nbproject/private/ 20 | build/ 21 | nbbuild/ 22 | dist/ 23 | nbdist/ 24 | .nb-gradle/ -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # Frontend REST Service 2 | 3 | # API 4 | 5 | The following addresses are available: 6 | - http://localhost:8091/calculate/{first}/{second}/ 7 | - http://localhost:8091/ 8 | 9 | Both will return ta string containing both numbers and the sum.With the first path you can explicitly define the numbers. 10 | The root URL will create two random numbers and sum these up using the backend service. -------------------------------------------------------------------------------- /backend/src/main/java/de/codecentric/cloud/backend/BackendApplication.java: -------------------------------------------------------------------------------- 1 | package de.codecentric.cloud.backend; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class BackendApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(BackendApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /provision/helm/.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *~ 18 | # Various IDEs 19 | .project 20 | .idea/ 21 | *.tmproj 22 | -------------------------------------------------------------------------------- /provision/helm/templates/NOTES.txt: -------------------------------------------------------------------------------- 1 | 1. Get the application URL by running these commands: 2 | 3 | {{- if .Values.ingress.enabled }} 4 | Find the frontend over here: 5 | 6 | http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $.Values.ingress.hosts.frontend.host }} 7 | 8 | {{- if .Values.zipkin.enabled }} 9 | 10 | Find Zipkin over here: 11 | 12 | http{{ if $.Values.ingress.tls }}s{{ end }}://{{ . }}{{ $.Values.ingress.hosts.zipkin.host }}/ 13 | {{- end }} 14 | {{- end }} -------------------------------------------------------------------------------- /backend/src/test/java/de/codecentric/cloud/backend/BackendApplicationTests.java: -------------------------------------------------------------------------------- 1 | package de.codecentric.cloud.backend; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit4.SpringRunner; 7 | 8 | @RunWith(SpringRunner.class) 9 | @SpringBootTest 10 | public class BackendApplicationTests { 11 | 12 | @Test 13 | public void contextLoads() { 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /frontend/src/test/java/de/codecentric/cloud/frontend/FrontendApplicationTests.java: -------------------------------------------------------------------------------- 1 | package de.codecentric.cloud.frontend; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit4.SpringRunner; 7 | 8 | @RunWith(SpringRunner.class) 9 | @SpringBootTest 10 | public class FrontendApplicationTests { 11 | 12 | @Test 13 | public void contextLoads() { 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | zipkin: 5 | image: openzipkin/zipkin 6 | ports: 7 | - "9411:9411" 8 | frontend: 9 | build: frontend/. 10 | image: marcopaga/plain-frontend:1 11 | ports: 12 | - "8091:8091" 13 | environment: 14 | - ZIPKIN_HOST=zipkin 15 | depends_on: 16 | - zipkin 17 | backend: 18 | build: backend/. 19 | image: marcopaga/plain-backend:1 20 | ports: 21 | - "8090:8090" 22 | environment: 23 | - ZIPKIN_HOST=zipkin 24 | depends_on: 25 | - zipkin 26 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | de.codecentric 7 | multi 8 | 0.0.1-SNAPSHOT 9 | pom 10 | 11 | 12 | backend 13 | frontend 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /provision/helm/templates/zipkin-service.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.zipkin.enabled -}} 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: {{ template "app.fullname" $ }}-zipkin 6 | labels: 7 | component: zipkin 8 | app: {{ template "app.name" . }} 9 | chart: {{ template "app.chart" . }} 10 | release: {{ .Release.Name }} 11 | heritage: {{ .Release.Service }} 12 | spec: 13 | type: LoadBalancer 14 | selector: 15 | component: zipkin 16 | app: {{ template "app.name" . }} 17 | release: {{ .Release.Name }} 18 | ports: 19 | - port: 9411 20 | targetPort: 9411 21 | {{- end }} -------------------------------------------------------------------------------- /provision/helm/templates/app-service.yaml: -------------------------------------------------------------------------------- 1 | {{- range .Values.applications }} 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: "{{ template "app.fullname" $ }}-{{ .name }}" 6 | labels: 7 | component: {{ .name }} 8 | app: {{ template "app.name" $ }} 9 | chart: {{ template "app.chart" $ }} 10 | release: {{ $.Release.Name }} 11 | heritage: {{ $.Release.Service }} 12 | spec: 13 | type: NodePort 14 | ports: 15 | - port: {{ .port }} 16 | targetPort: {{ .port }} 17 | protocol: TCP 18 | selector: 19 | component: {{ .name }} 20 | app: {{ template "app.name" $ }} 21 | release: {{ $.Release.Name }} 22 | --- 23 | {{- end }} -------------------------------------------------------------------------------- /backend/README.md: -------------------------------------------------------------------------------- 1 | # Backend REST Service 2 | 3 | # API 4 | 5 | The following addresses are available: 6 | - http://localhost:8090/add/{first}/{second}/ 7 | 8 | It will return the sum of two numbers. You can explicitly define the numbers. 9 | 10 | 11 | # Processing 12 | 13 | The process simulates a processing time. The maximum number of millis can be configured with the spring property `backend.processing.time.max`. This property is currently propagated by the Spring cloud config server. 14 | 15 | # Failures 16 | 17 | The service will return an exception randomly from time to time. You will find a `IllegalStateException` in the logs that clearly states it's purpose in the logs. These exceptions are needed to test the resiliency features. -------------------------------------------------------------------------------- /frontend/src/main/java/de/codecentric/cloud/frontend/FrontendApplication.java: -------------------------------------------------------------------------------- 1 | package de.codecentric.cloud.frontend; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.client.loadbalancer.LoadBalanced; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.web.client.RestTemplate; 8 | 9 | @SpringBootApplication 10 | public class FrontendApplication { 11 | 12 | @Bean 13 | @LoadBalanced 14 | public RestTemplate RestTemplate(){ 15 | return new RestTemplate(); 16 | } 17 | 18 | public static void main(String[] args) { 19 | SpringApplication.run(FrontendApplication.class, args); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /provision/helm/templates/virtual-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: networking.istio.io/v1alpha3 2 | kind: VirtualService 3 | metadata: 4 | name: "{{ template "app.fullname" $ }}-virtual-service" 5 | labels: 6 | app: {{ template "app.name" . }} 7 | chart: {{ template "app.chart" . }} 8 | release: {{ .Release.Name }} 9 | heritage: {{ .Release.Service }} 10 | spec: 11 | hosts: 12 | - "*" 13 | gateways: 14 | - {{ template "app.fullname" $ }}-ingress-gateway 15 | http: 16 | - match: 17 | - uri: 18 | prefix: / 19 | route: 20 | - destination: 21 | port: 22 | number: 8091 23 | host: {{ template "app.fullname" $ }}-frontend 24 | retries: 25 | attempts: 3 26 | perTryTimeout: 1s -------------------------------------------------------------------------------- /backend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM maven:3.8-jdk-11 as build 2 | 3 | COPY pom.xml /usr/src/app/pom.xml 4 | RUN mvn -B -f /usr/src/app/pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:resolve-plugins dependency:resolve 5 | COPY src /usr/src/app/src 6 | RUN mvn -f /usr/src/app/pom.xml -B -s /usr/share/maven/ref/settings-docker.xml clean package 7 | 8 | FROM openjdk:11.0.3-jre-slim-stretch 9 | ENV APP_USER app 10 | ENV APP_GROUP app 11 | 12 | COPY --from=build /usr/src/app/target/backend.jar app.jar 13 | 14 | RUN addgroup ${APP_GROUP} && adduser --system --disabled-login -ingroup ${APP_GROUP} -uid 1000 ${APP_USER} 15 | VOLUME /tmp 16 | 17 | ONBUILD RUN chmod 755 /app.jar 18 | 19 | USER ${APP_USER} 20 | 21 | ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ] -------------------------------------------------------------------------------- /frontend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM maven:3.8-jdk-11 as build 2 | 3 | COPY pom.xml /usr/src/app/pom.xml 4 | RUN mvn -B -f /usr/src/app/pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:resolve-plugins dependency:resolve 5 | COPY src /usr/src/app/src 6 | RUN mvn -f /usr/src/app/pom.xml -B -s /usr/share/maven/ref/settings-docker.xml clean package 7 | 8 | FROM openjdk:11.0.3-jre-slim-stretch 9 | ENV APP_USER app 10 | ENV APP_GROUP app 11 | 12 | COPY --from=build /usr/src/app/target/frontend.jar app.jar 13 | 14 | RUN addgroup ${APP_GROUP} && adduser --system --disabled-login -ingroup ${APP_GROUP} -uid 1000 ${APP_USER} 15 | VOLUME /tmp 16 | 17 | ONBUILD RUN chmod 755 /app.jar 18 | 19 | USER ${APP_USER} 20 | 21 | ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ] -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | strategy: 10 | matrix: 11 | java-version: [ 8, 11, 15 ] 12 | 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: actions/setup-java@v1 16 | with: 17 | java-version: ${{ matrix.java-version }} 18 | - run: mvn -B install --no-transfer-progress 19 | 20 | coverage: 21 | needs: build 22 | runs-on: ubuntu-latest 23 | 24 | steps: 25 | - uses: actions/checkout@v3 26 | - uses: actions/setup-java@v1 27 | with: 28 | java-version: 15 29 | - run: mvn -B verify -P coverage --no-transfer-progress 30 | 31 | - uses: codecov/codecov-action@v3 32 | with: 33 | file: ./**/target/site/jacoco/jacoco.xml 34 | name: codecov -------------------------------------------------------------------------------- /provision/helm/templates/ingress.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.ingress.enabled -}} 2 | apiVersion: extensions/v1beta1 3 | kind: Ingress 4 | metadata: 5 | name: "{{ template "app.fullname" $ }}-ingress" 6 | labels: 7 | app: {{ template "app.name" . }} 8 | chart: {{ template "app.chart" . }} 9 | release: {{ .Release.Name }} 10 | heritage: {{ .Release.Service }} 11 | {{- with .Values.ingress.annotations }} 12 | annotations: 13 | {{ toYaml . | indent 4 }} 14 | {{- end }} 15 | spec: 16 | rules: 17 | - host: {{ .Values.ingress.hosts.frontend.host }} 18 | http: 19 | paths: 20 | - path: / 21 | backend: 22 | serviceName: {{ template "app.fullname" $ }}-frontend 23 | servicePort: 8091 24 | {{ if .Values.zipkin.enabled }} 25 | - host: {{ .Values.ingress.hosts.zipkin.host }} 26 | - path: / 27 | backend: 28 | serviceName: {{ template "app.fullname" $ }}-zipkin 29 | servicePort: 9411 30 | {{ end }} 31 | {{- end }} 32 | -------------------------------------------------------------------------------- /frontend/src/main/java/de/codecentric/cloud/frontend/FrontendRestController.java: -------------------------------------------------------------------------------- 1 | package de.codecentric.cloud.frontend; 2 | 3 | import java.util.Random; 4 | 5 | import javax.annotation.Resource; 6 | 7 | import org.springframework.web.bind.annotation.GetMapping; 8 | import org.springframework.web.bind.annotation.PathVariable; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | @RestController 12 | public class FrontendRestController { 13 | 14 | @Resource 15 | private Calculation calculation; 16 | 17 | @GetMapping("/") 18 | public String calculate(){ 19 | final Random random = new Random(); 20 | int first = random.nextInt(); 21 | int second = random.nextInt(); 22 | 23 | return calculation.performAddition(first, second); 24 | } 25 | 26 | @GetMapping("/calculate/{first}/{second}") 27 | public String calculate(@PathVariable("first") int first, @PathVariable("second") int second){ 28 | return calculation.performAddition(first, second); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /provision/helm/templates/_helpers.tpl: -------------------------------------------------------------------------------- 1 | {{/* vim: set filetype=mustache: */}} 2 | {{/* 3 | Expand the name of the chart. 4 | */}} 5 | {{- define "app.name" -}} 6 | {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} 7 | {{- end -}} 8 | 9 | {{/* 10 | Create a default fully qualified app name. 11 | We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). 12 | If release name contains chart name it will be used as a full name. 13 | */}} 14 | {{- define "app.fullname" -}} 15 | {{- if .Values.fullnameOverride -}} 16 | {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} 17 | {{- else -}} 18 | {{- $name := default .Chart.Name .Values.nameOverride -}} 19 | {{- if contains $name .Release.Name -}} 20 | {{- .Release.Name | trunc 63 | trimSuffix "-" -}} 21 | {{- else -}} 22 | {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} 23 | {{- end -}} 24 | {{- end -}} 25 | {{- end -}} 26 | 27 | {{/* 28 | Create chart name and version as used by the chart label. 29 | */}} 30 | {{- define "app.chart" -}} 31 | {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} 32 | {{- end -}} 33 | -------------------------------------------------------------------------------- /frontend/src/main/java/de/codecentric/cloud/frontend/Calculation.java: -------------------------------------------------------------------------------- 1 | package de.codecentric.cloud.frontend; 2 | 3 | import javax.annotation.Resource; 4 | 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | import org.springframework.beans.factory.annotation.Value; 8 | import org.springframework.http.ResponseEntity; 9 | import org.springframework.stereotype.Component; 10 | import org.springframework.web.client.RestTemplate; 11 | 12 | import static java.lang.String.format; 13 | 14 | @Component 15 | public class Calculation { 16 | 17 | private static final Logger LOGGER = LoggerFactory.getLogger(Calculation.class); 18 | 19 | @Value("${backend.url}") 20 | private String backendUrl; 21 | 22 | @Resource 23 | public RestTemplate restTemplate; 24 | 25 | String performAddition(int first, int second) { 26 | LOGGER.info("Calculation of {} + {} requested.", first, second); 27 | final ResponseEntity result = restTemplate.getForEntity(backendUrl + "/add/{first}/{second}/", Integer.class, first, second); 28 | LOGGER.info("Result is: {}", result.getBody()); 29 | return format("%d + %d = %d", first, second, result.getBody()); 30 | } 31 | 32 | private String performAdditionFallback(int first, int second){ 33 | if(first > 0 && second > 0){ 34 | return "The result will be positive."; 35 | } else { 36 | return "The result will be a number."; 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /provision/helm/templates/zipkin-deployment.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.zipkin.enabled -}} 2 | apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1 3 | kind: Deployment 4 | metadata: 5 | name: {{ template "app.fullname" $ }}-zipkin-deployment 6 | labels: 7 | component: zipkin 8 | app: {{ template "app.name" . }} 9 | chart: {{ template "app.chart" . }} 10 | release: {{ .Release.Name }} 11 | heritage: {{ .Release.Service }} 12 | spec: 13 | selector: 14 | matchLabels: 15 | component: zipkin 16 | app: {{ template "app.name" . }} 17 | release: {{ .Release.Name }} 18 | replicas: 1 19 | template: 20 | metadata: 21 | labels: 22 | component: zipkin 23 | app: {{ template "app.name" . }} 24 | release: {{ .Release.Name }} 25 | spec: 26 | automountServiceAccountToken: false 27 | containers: 28 | - env: 29 | - name: JAVA_OPTS 30 | value: "-Xms256m -Xmx768m" 31 | name: zipkin 32 | image: "{{ .Values.zipkin.image.repository }}:{{ .Values.zipkin.image.tag }}" 33 | imagePullPolicy: {{ $.Values.zipkin.image.pullPolicy }} 34 | ports: 35 | - containerPort: 9411 36 | resources: 37 | limits: 38 | memory: "1G" 39 | cpu: "0.5" 40 | livenessProbe: 41 | tcpSocket: 42 | port: 9411 43 | periodSeconds: 60 44 | timeoutSeconds: 3 45 | readinessProbe: 46 | tcpSocket: 47 | port: 9411 48 | failureThreshold: 24 49 | securityContext: 50 | readOnlyRootFilesystem: true 51 | runAsNonRoot: false 52 | {{- end }} -------------------------------------------------------------------------------- /provision/helm/values.yaml: -------------------------------------------------------------------------------- 1 | # Default values for app. 2 | # This is a YAML-formatted file. 3 | # Declare variables to be passed into your templates. 4 | 5 | applications: 6 | backend: 7 | name: backend 8 | replicas: 2 9 | port: 8090 10 | image: 11 | repository: marcopaga/plain-backend 12 | tag: 1 13 | imagePullPolicy: Always 14 | frontend: 15 | name: frontend 16 | replicas: 2 17 | port: 8091 18 | image: 19 | repository: marcopaga/plain-frontend 20 | tag: 1 21 | imagePullPolicy: Always 22 | 23 | ingress: 24 | enabled: true 25 | hosts: 26 | frontend: 27 | host: frontend.minikube.local 28 | zipkin: 29 | host: zipkin.minikube.local 30 | annotations: 31 | nginx.ingress.kubernetes.io/rewrite-target: / 32 | tls: [] 33 | # - secretName: chart-example-tls 34 | # hosts: 35 | # - chart-example.local 36 | 37 | zipkin: 38 | enabled: false 39 | image: 40 | repository: openzipkin/zipkin 41 | tag: 2.27.1 42 | imagePullPolicy: IfNotPresent 43 | 44 | security: 45 | networkpolicy: 46 | enabled: false 47 | 48 | resources: {} 49 | # We usually recommend not to specify default resources and to leave this as a conscious 50 | # choice for the user. This also increases chances charts run on environments with little 51 | # resources, such as Minikube. If you do want to specify resources, uncomment the following 52 | # lines, adjust them as necessary, and remove the curly braces after 'resources:'. 53 | # limits: 54 | # cpu: 100m 55 | # memory: 128Mi 56 | # requests: 57 | # cpu: 100m 58 | # memory: 128Mi 59 | 60 | nodeSelector: {} 61 | 62 | tolerations: [] 63 | 64 | affinity: {} 65 | -------------------------------------------------------------------------------- /provision/helm/templates/network-policy.yaml: -------------------------------------------------------------------------------- 1 | {{ if .Values.security.networkpolicy.enabled }} 2 | kind: NetworkPolicy 3 | apiVersion: networking.k8s.io/v1 4 | metadata: 5 | name: {{ template "app.fullname" $ }}-deny-from-other-namespaces 6 | namespace: {{ .Release.Namespace }} 7 | labels: 8 | app: {{ template "app.name" $ }} 9 | release: {{ $.Release.Name }} 10 | chart: {{ template "app.chart" $ }} 11 | heritage: {{ $.Release.Service }} 12 | spec: 13 | podSelector: 14 | matchLabels: 15 | ingress: 16 | - from: 17 | - podSelector: {} 18 | --- 19 | kind: NetworkPolicy 20 | apiVersion: networking.k8s.io/v1 21 | metadata: 22 | name: {{ template "app.fullname" $ }}-allow-external-to-frontend 23 | namespace: {{ .Release.Namespace }} 24 | labels: 25 | app: {{ template "app.name" $ }} 26 | release: {{ $.Release.Name }} 27 | chart: {{ template "app.chart" $ }} 28 | heritage: {{ $.Release.Service }} 29 | spec: 30 | podSelector: 31 | matchLabels: 32 | component: frontend 33 | app: {{ template "app.name" $ }} 34 | release: {{ $.Release.Name }} 35 | ingress: 36 | - from: [] 37 | {{- if .Values.zipkin.enabled -}} 38 | --- 39 | kind: NetworkPolicy 40 | apiVersion: networking.k8s.io/v1 41 | metadata: 42 | name: {{ template "app.fullname" $ }}-allow-external-to-zipkin 43 | namespace: {{ .Release.Namespace }} 44 | labels: 45 | app: {{ template "app.name" $ }} 46 | release: {{ $.Release.Name }} 47 | chart: {{ template "app.chart" $ }} 48 | heritage: {{ $.Release.Service }} 49 | spec: 50 | podSelector: 51 | matchLabels: 52 | component: zipkin 53 | app: {{ template "app.name" $ }} 54 | ingress: 55 | - from: [] 56 | --- 57 | {{ end }} 58 | {{ end }} -------------------------------------------------------------------------------- /backend/src/main/java/de/codecentric/cloud/backend/CalculationRestController.java: -------------------------------------------------------------------------------- 1 | package de.codecentric.cloud.backend; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.beans.factory.annotation.Value; 6 | import org.springframework.web.bind.annotation.GetMapping; 7 | import org.springframework.web.bind.annotation.PathVariable; 8 | import org.springframework.web.bind.annotation.RestController; 9 | 10 | import java.util.Random; 11 | 12 | @RestController 13 | public class CalculationRestController { 14 | 15 | @Value("${backend.processing.time.max}") 16 | private int maximumProcessingTime; 17 | 18 | private static final Logger LOGGER = LoggerFactory.getLogger(CalculationRestController.class); 19 | 20 | @GetMapping("/") 21 | public String index(){ 22 | final String hostname = System.getenv("HOSTNAME"); 23 | return "Backend Application on "+hostname; 24 | } 25 | 26 | @GetMapping("/add/{first}/{second}/") 27 | public int add(@PathVariable("first") int first, @PathVariable("second") int second){ 28 | injectFailure(); 29 | simulateLongProcessing(); 30 | final int result = first + second; 31 | LOGGER.info("Calculation of {} + {} = {}.", first, second, result); 32 | return result; 33 | } 34 | 35 | private void simulateLongProcessing() { 36 | final int processingTime = new Random().nextInt(maximumProcessingTime); 37 | LOGGER.info("Processing will be delayed by {} ms.", processingTime); 38 | try { 39 | Thread.sleep(processingTime); 40 | } catch (InterruptedException ignored) { 41 | } 42 | } 43 | 44 | private void injectFailure() { 45 | if(new Random().nextInt(100) > 80){ 46 | LOGGER.info("Creating some random exception in the backend processing."); 47 | throw new IllegalStateException("This error was automatically created for you to test this stack."); 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /provision/helm/templates/app-deployment.yaml: -------------------------------------------------------------------------------- 1 | {{- range .Values.applications }} 2 | apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1 3 | kind: Deployment 4 | metadata: 5 | name: "{{ template "app.fullname" $ }}-{{ .name }}" 6 | labels: 7 | component: {{ .name }} 8 | app: {{ template "app.name" $ }} 9 | release: {{ $.Release.Name }} 10 | chart: {{ template "app.chart" $ }} 11 | heritage: {{ $.Release.Service }} 12 | spec: 13 | selector: 14 | matchLabels: 15 | component: {{ .name }} 16 | app: {{ template "app.name" $ }} 17 | release: {{ $.Release.Name }} 18 | replicas: {{ .replicas | default "1" }} 19 | template: 20 | metadata: 21 | labels: 22 | component: {{ .name }} 23 | app: {{ template "app.name" $ }} 24 | release: {{ $.Release.Name }} 25 | chart: {{ template "app.chart" $ }} 26 | heritage: {{ $.Release.Service }} 27 | spec: 28 | automountServiceAccountToken: false 29 | containers: 30 | - env: 31 | - name: BACKEND_URL 32 | value: http://{{ template "app.fullname" $ }}-backend:8090 33 | {{- if $.Values.zipkin.enabled -}} 34 | - name: ZIPKIN_HOST 35 | value: {{ template "app.fullname" $ }}-zipkin 36 | {{- end }} 37 | name: "{{ template "app.fullname" $ }}-{{ .name }}" 38 | image: "{{ .image.repository }}:{{ .image.tag | default "LATEST" }}" 39 | imagePullPolicy: {{ .image.pullPolicy | default "Always" }} 40 | ports: 41 | - containerPort: {{ .port | default "8080"}} 42 | livenessProbe: 43 | httpGet: 44 | path: /health 45 | port: {{ .port | default "8080"}} 46 | periodSeconds: 60 47 | timeoutSeconds: 2 48 | readinessProbe: 49 | httpGet: 50 | path: /health 51 | port: {{ .port | default "8080"}} 52 | failureThreshold: 12 53 | securityContext: 54 | readOnlyRootFilesystem: true 55 | runAsNonRoot: true 56 | runAsUser: 1000 57 | resources: 58 | {{ toYaml $.Values.resources | indent 10 }} 59 | --- 60 | {{- end }} -------------------------------------------------------------------------------- /backend/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | de.codecentric.cloud 7 | backend 8 | 0.0.1-SNAPSHOT 9 | jar 10 | 11 | backend 12 | Demo project for Spring Boot 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.5.22.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | UTF-8 24 | 1.8 25 | Dalston.SR2 26 | 27 | 28 | 29 | 30 | 31 | org.springframework.boot 32 | spring-boot-starter-actuator 33 | 34 | 35 | 36 | org.springframework.cloud 37 | spring-cloud-starter-sleuth 38 | 1.1.3.RELEASE 39 | 40 | 41 | 42 | org.springframework.cloud 43 | spring-cloud-starter-zipkin 44 | 1.1.0.RELEASE 45 | 46 | 47 | 48 | org.springframework.boot 49 | spring-boot-starter-test 50 | test 51 | 52 | 53 | 54 | 55 | 56 | 57 | org.springframework.cloud 58 | spring-cloud-dependencies 59 | ${spring-cloud.version} 60 | pom 61 | import 62 | 63 | 64 | 65 | 66 | 67 | backend 68 | 69 | 70 | org.springframework.boot 71 | spring-boot-maven-plugin 72 | 73 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /frontend/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | de.codecentric.cloud 7 | frontend 8 | 0.0.1-SNAPSHOT 9 | jar 10 | 11 | frontend 12 | Demo project for Spring Boot 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.5.22.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | UTF-8 24 | 1.8 25 | Dalston.SR2 26 | 27 | 28 | 29 | 30 | 31 | org.springframework.boot 32 | spring-boot-starter-actuator 33 | 34 | 35 | 36 | org.springframework.cloud 37 | spring-cloud-starter-sleuth 38 | 1.1.3.RELEASE 39 | 40 | 41 | 42 | org.springframework.cloud 43 | spring-cloud-starter-zipkin 44 | 1.1.0.RELEASE 45 | 46 | 47 | 48 | org.springframework.boot 49 | spring-boot-starter-test 50 | test 51 | 52 | 53 | 54 | 55 | 56 | 57 | org.springframework.cloud 58 | spring-cloud-dependencies 59 | ${spring-cloud.version} 60 | pom 61 | import 62 | 63 | 64 | 65 | 66 | 67 | frontend 68 | 69 | 70 | org.springframework.boot 71 | spring-boot-maven-plugin 72 | 73 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.iml 3 | 4 | ### https://raw.github.com/github/gitignore/8edb8a95c4c4b3dce71a378aaaf89275510b9cef/Global/JetBrains.gitignore 5 | 6 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm 7 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 8 | 9 | # User-specific stuff: 10 | .idea/**/workspace.xml 11 | .idea/**/tasks.xml 12 | .idea/dictionaries 13 | 14 | # Sensitive or high-churn files: 15 | .idea/**/dataSources/ 16 | .idea/**/dataSources.ids 17 | .idea/**/dataSources.xml 18 | .idea/**/dataSources.local.xml 19 | .idea/**/sqlDataSources.xml 20 | .idea/**/dynamic.xml 21 | .idea/**/uiDesigner.xml 22 | 23 | # Gradle: 24 | .idea/**/gradle.xml 25 | .idea/**/libraries 26 | 27 | # CMake 28 | cmake-build-debug/ 29 | 30 | # Mongo Explorer plugin: 31 | .idea/**/mongoSettings.xml 32 | 33 | ## File-based project format: 34 | *.iws 35 | 36 | ## Plugin-specific files: 37 | 38 | # IntelliJ 39 | /out/ 40 | 41 | # mpeltonen/sbt-idea plugin 42 | .idea_modules/ 43 | 44 | # JIRA plugin 45 | atlassian-ide-plugin.xml 46 | 47 | # Cursive Clojure plugin 48 | .idea/replstate.xml 49 | 50 | # Crashlytics plugin (for Android Studio and IntelliJ) 51 | com_crashlytics_export_strings.xml 52 | crashlytics.properties 53 | crashlytics-build.properties 54 | fabric.properties 55 | 56 | 57 | ### https://raw.github.com/github/gitignore/8edb8a95c4c4b3dce71a378aaaf89275510b9cef/Maven.gitignore 58 | 59 | target/ 60 | pom.xml.tag 61 | pom.xml.releaseBackup 62 | pom.xml.versionsBackup 63 | pom.xml.next 64 | release.properties 65 | dependency-reduced-pom.xml 66 | buildNumber.properties 67 | .mvn/timing.properties 68 | 69 | # Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) 70 | !/.mvn/wrapper/maven-wrapper.jar 71 | 72 | 73 | ### https://raw.github.com/github/gitignore/8edb8a95c4c4b3dce71a378aaaf89275510b9cef/Global/macOS.gitignore 74 | 75 | # General 76 | *.DS_Store 77 | .AppleDouble 78 | .LSOverride 79 | 80 | # Icon must end with two \r 81 | Icon 82 | 83 | 84 | # Thumbnails 85 | ._* 86 | 87 | # Files that might appear in the root of a volume 88 | .DocumentRevisions-V100 89 | .fseventsd 90 | .Spotlight-V100 91 | .TemporaryItems 92 | .Trashes 93 | .VolumeIcon.icns 94 | .com.apple.timemachine.donotpresent 95 | 96 | # Directories potentially created on remote AFP share 97 | .AppleDB 98 | .AppleDesktop 99 | Network Trash Folder 100 | Temporary Items 101 | .apdisk 102 | 103 | 104 | ### https://raw.github.com/github/gitignore/8edb8a95c4c4b3dce71a378aaaf89275510b9cef/Global/Vim.gitignore 105 | 106 | # Swap 107 | [._]*.s[a-v][a-z] 108 | [._]*.sw[a-p] 109 | [._]s[a-v][a-z] 110 | [._]sw[a-p] 111 | 112 | # Session 113 | Session.vim 114 | 115 | # Temporary 116 | .netrwhist 117 | *~ 118 | # Auto-generated tag files 119 | tags 120 | 121 | 122 | ### https://raw.github.com/github/gitignore/8edb8a95c4c4b3dce71a378aaaf89275510b9cef/Java.gitignore 123 | 124 | # Compiled class file 125 | *.class 126 | 127 | # Log file 128 | *.log 129 | 130 | # BlueJ files 131 | *.ctxt 132 | 133 | # Mobile Tools for Java (J2ME) 134 | .mtj.tmp/ 135 | 136 | # Package Files # 137 | *.jar 138 | *.war 139 | *.ear 140 | *.zip 141 | *.tar.gz 142 | *.rar 143 | 144 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 145 | hs_err_pid* 146 | 147 | /bin/ 148 | /node_modules/ 149 | /provision/pulumi/state 150 | -------------------------------------------------------------------------------- /backend/mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM http://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven2 Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' 39 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 40 | 41 | @REM set %HOME% to equivalent of $HOME 42 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 43 | 44 | @REM Execute a user defined script before this one 45 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 46 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 47 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 48 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" 49 | :skipRcPre 50 | 51 | @setlocal 52 | 53 | set ERROR_CODE=0 54 | 55 | @REM To isolate internal variables from possible post scripts, we use another setlocal 56 | @setlocal 57 | 58 | @REM ==== START VALIDATION ==== 59 | if not "%JAVA_HOME%" == "" goto OkJHome 60 | 61 | echo. 62 | echo Error: JAVA_HOME not found in your environment. >&2 63 | echo Please set the JAVA_HOME variable in your environment to match the >&2 64 | echo location of your Java installation. >&2 65 | echo. 66 | goto error 67 | 68 | :OkJHome 69 | if exist "%JAVA_HOME%\bin\java.exe" goto init 70 | 71 | echo. 72 | echo Error: JAVA_HOME is set to an invalid directory. >&2 73 | echo JAVA_HOME = "%JAVA_HOME%" >&2 74 | echo Please set the JAVA_HOME variable in your environment to match the >&2 75 | echo location of your Java installation. >&2 76 | echo. 77 | goto error 78 | 79 | @REM ==== END VALIDATION ==== 80 | 81 | :init 82 | 83 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 84 | @REM Fallback to current working directory if not found. 85 | 86 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 87 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 88 | 89 | set EXEC_DIR=%CD% 90 | set WDIR=%EXEC_DIR% 91 | :findBaseDir 92 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 93 | cd .. 94 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 95 | set WDIR=%CD% 96 | goto findBaseDir 97 | 98 | :baseDirFound 99 | set MAVEN_PROJECTBASEDIR=%WDIR% 100 | cd "%EXEC_DIR%" 101 | goto endDetectBaseDir 102 | 103 | :baseDirNotFound 104 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 105 | cd "%EXEC_DIR%" 106 | 107 | :endDetectBaseDir 108 | 109 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 110 | 111 | @setlocal EnableExtensions EnableDelayedExpansion 112 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 113 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 114 | 115 | :endReadAdditionalConfig 116 | 117 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 118 | 119 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 120 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 121 | 122 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 123 | if ERRORLEVEL 1 goto error 124 | goto end 125 | 126 | :error 127 | set ERROR_CODE=1 128 | 129 | :end 130 | @endlocal & set ERROR_CODE=%ERROR_CODE% 131 | 132 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 133 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 134 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 135 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 136 | :skipRcPost 137 | 138 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 139 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 140 | 141 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 142 | 143 | exit /B %ERROR_CODE% 144 | -------------------------------------------------------------------------------- /frontend/mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM http://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven2 Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' 39 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 40 | 41 | @REM set %HOME% to equivalent of $HOME 42 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 43 | 44 | @REM Execute a user defined script before this one 45 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 46 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 47 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 48 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" 49 | :skipRcPre 50 | 51 | @setlocal 52 | 53 | set ERROR_CODE=0 54 | 55 | @REM To isolate internal variables from possible post scripts, we use another setlocal 56 | @setlocal 57 | 58 | @REM ==== START VALIDATION ==== 59 | if not "%JAVA_HOME%" == "" goto OkJHome 60 | 61 | echo. 62 | echo Error: JAVA_HOME not found in your environment. >&2 63 | echo Please set the JAVA_HOME variable in your environment to match the >&2 64 | echo location of your Java installation. >&2 65 | echo. 66 | goto error 67 | 68 | :OkJHome 69 | if exist "%JAVA_HOME%\bin\java.exe" goto init 70 | 71 | echo. 72 | echo Error: JAVA_HOME is set to an invalid directory. >&2 73 | echo JAVA_HOME = "%JAVA_HOME%" >&2 74 | echo Please set the JAVA_HOME variable in your environment to match the >&2 75 | echo location of your Java installation. >&2 76 | echo. 77 | goto error 78 | 79 | @REM ==== END VALIDATION ==== 80 | 81 | :init 82 | 83 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 84 | @REM Fallback to current working directory if not found. 85 | 86 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 87 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 88 | 89 | set EXEC_DIR=%CD% 90 | set WDIR=%EXEC_DIR% 91 | :findBaseDir 92 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 93 | cd .. 94 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 95 | set WDIR=%CD% 96 | goto findBaseDir 97 | 98 | :baseDirFound 99 | set MAVEN_PROJECTBASEDIR=%WDIR% 100 | cd "%EXEC_DIR%" 101 | goto endDetectBaseDir 102 | 103 | :baseDirNotFound 104 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 105 | cd "%EXEC_DIR%" 106 | 107 | :endDetectBaseDir 108 | 109 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 110 | 111 | @setlocal EnableExtensions EnableDelayedExpansion 112 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 113 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 114 | 115 | :endReadAdditionalConfig 116 | 117 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 118 | 119 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 120 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 121 | 122 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 123 | if ERRORLEVEL 1 goto error 124 | goto end 125 | 126 | :error 127 | set ERROR_CODE=1 128 | 129 | :end 130 | @endlocal & set ERROR_CODE=%ERROR_CODE% 131 | 132 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 133 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 134 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 135 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 136 | :skipRcPost 137 | 138 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 139 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 140 | 141 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 142 | 143 | exit /B %ERROR_CODE% 144 | -------------------------------------------------------------------------------- /backend/mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven2 Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /etc/mavenrc ] ; then 40 | . /etc/mavenrc 41 | fi 42 | 43 | if [ -f "$HOME/.mavenrc" ] ; then 44 | . "$HOME/.mavenrc" 45 | fi 46 | 47 | fi 48 | 49 | # OS specific support. $var _must_ be set to either true or false. 50 | cygwin=false; 51 | darwin=false; 52 | mingw=false 53 | case "`uname`" in 54 | CYGWIN*) cygwin=true ;; 55 | MINGW*) mingw=true;; 56 | Darwin*) darwin=true 57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 59 | if [ -z "$JAVA_HOME" ]; then 60 | if [ -x "/usr/libexec/java_home" ]; then 61 | export JAVA_HOME="`/usr/libexec/java_home`" 62 | else 63 | export JAVA_HOME="/Library/Java/Home" 64 | fi 65 | fi 66 | ;; 67 | esac 68 | 69 | if [ -z "$JAVA_HOME" ] ; then 70 | if [ -r /etc/gentoo-release ] ; then 71 | JAVA_HOME=`java-config --jre-home` 72 | fi 73 | fi 74 | 75 | if [ -z "$M2_HOME" ] ; then 76 | ## resolve links - $0 may be a link to maven's home 77 | PRG="$0" 78 | 79 | # need this for relative symlinks 80 | while [ -h "$PRG" ] ; do 81 | ls=`ls -ld "$PRG"` 82 | link=`expr "$ls" : '.*-> \(.*\)$'` 83 | if expr "$link" : '/.*' > /dev/null; then 84 | PRG="$link" 85 | else 86 | PRG="`dirname "$PRG"`/$link" 87 | fi 88 | done 89 | 90 | saveddir=`pwd` 91 | 92 | M2_HOME=`dirname "$PRG"`/.. 93 | 94 | # make it fully qualified 95 | M2_HOME=`cd "$M2_HOME" && pwd` 96 | 97 | cd "$saveddir" 98 | # echo Using m2 at $M2_HOME 99 | fi 100 | 101 | # For Cygwin, ensure paths are in UNIX format before anything is touched 102 | if $cygwin ; then 103 | [ -n "$M2_HOME" ] && 104 | M2_HOME=`cygpath --unix "$M2_HOME"` 105 | [ -n "$JAVA_HOME" ] && 106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 107 | [ -n "$CLASSPATH" ] && 108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 109 | fi 110 | 111 | # For Migwn, ensure paths are in UNIX format before anything is touched 112 | if $mingw ; then 113 | [ -n "$M2_HOME" ] && 114 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 115 | [ -n "$JAVA_HOME" ] && 116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 117 | # TODO classpath? 118 | fi 119 | 120 | if [ -z "$JAVA_HOME" ]; then 121 | javaExecutable="`which javac`" 122 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 123 | # readlink(1) is not available as standard on Solaris 10. 124 | readLink=`which readlink` 125 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 126 | if $darwin ; then 127 | javaHome="`dirname \"$javaExecutable\"`" 128 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 129 | else 130 | javaExecutable="`readlink -f \"$javaExecutable\"`" 131 | fi 132 | javaHome="`dirname \"$javaExecutable\"`" 133 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 134 | JAVA_HOME="$javaHome" 135 | export JAVA_HOME 136 | fi 137 | fi 138 | fi 139 | 140 | if [ -z "$JAVACMD" ] ; then 141 | if [ -n "$JAVA_HOME" ] ; then 142 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 143 | # IBM's JDK on AIX uses strange locations for the executables 144 | JAVACMD="$JAVA_HOME/jre/sh/java" 145 | else 146 | JAVACMD="$JAVA_HOME/bin/java" 147 | fi 148 | else 149 | JAVACMD="`which java`" 150 | fi 151 | fi 152 | 153 | if [ ! -x "$JAVACMD" ] ; then 154 | echo "Error: JAVA_HOME is not defined correctly." >&2 155 | echo " We cannot execute $JAVACMD" >&2 156 | exit 1 157 | fi 158 | 159 | if [ -z "$JAVA_HOME" ] ; then 160 | echo "Warning: JAVA_HOME environment variable is not set." 161 | fi 162 | 163 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 164 | 165 | # traverses directory structure from process work directory to filesystem root 166 | # first directory with .mvn subdirectory is considered project base directory 167 | find_maven_basedir() { 168 | 169 | if [ -z "$1" ] 170 | then 171 | echo "Path not specified to find_maven_basedir" 172 | return 1 173 | fi 174 | 175 | basedir="$1" 176 | wdir="$1" 177 | while [ "$wdir" != '/' ] ; do 178 | if [ -d "$wdir"/.mvn ] ; then 179 | basedir=$wdir 180 | break 181 | fi 182 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 183 | if [ -d "${wdir}" ]; then 184 | wdir=`cd "$wdir/.."; pwd` 185 | fi 186 | # end of workaround 187 | done 188 | echo "${basedir}" 189 | } 190 | 191 | # concatenates all lines of a file 192 | concat_lines() { 193 | if [ -f "$1" ]; then 194 | echo "$(tr -s '\n' ' ' < "$1")" 195 | fi 196 | } 197 | 198 | BASE_DIR=`find_maven_basedir "$(pwd)"` 199 | if [ -z "$BASE_DIR" ]; then 200 | exit 1; 201 | fi 202 | 203 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 204 | echo $MAVEN_PROJECTBASEDIR 205 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 206 | 207 | # For Cygwin, switch paths to Windows format before running java 208 | if $cygwin; then 209 | [ -n "$M2_HOME" ] && 210 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 211 | [ -n "$JAVA_HOME" ] && 212 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 213 | [ -n "$CLASSPATH" ] && 214 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 215 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 216 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 217 | fi 218 | 219 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 220 | 221 | exec "$JAVACMD" \ 222 | $MAVEN_OPTS \ 223 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 224 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 225 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 226 | -------------------------------------------------------------------------------- /frontend/mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven2 Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /etc/mavenrc ] ; then 40 | . /etc/mavenrc 41 | fi 42 | 43 | if [ -f "$HOME/.mavenrc" ] ; then 44 | . "$HOME/.mavenrc" 45 | fi 46 | 47 | fi 48 | 49 | # OS specific support. $var _must_ be set to either true or false. 50 | cygwin=false; 51 | darwin=false; 52 | mingw=false 53 | case "`uname`" in 54 | CYGWIN*) cygwin=true ;; 55 | MINGW*) mingw=true;; 56 | Darwin*) darwin=true 57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 59 | if [ -z "$JAVA_HOME" ]; then 60 | if [ -x "/usr/libexec/java_home" ]; then 61 | export JAVA_HOME="`/usr/libexec/java_home`" 62 | else 63 | export JAVA_HOME="/Library/Java/Home" 64 | fi 65 | fi 66 | ;; 67 | esac 68 | 69 | if [ -z "$JAVA_HOME" ] ; then 70 | if [ -r /etc/gentoo-release ] ; then 71 | JAVA_HOME=`java-config --jre-home` 72 | fi 73 | fi 74 | 75 | if [ -z "$M2_HOME" ] ; then 76 | ## resolve links - $0 may be a link to maven's home 77 | PRG="$0" 78 | 79 | # need this for relative symlinks 80 | while [ -h "$PRG" ] ; do 81 | ls=`ls -ld "$PRG"` 82 | link=`expr "$ls" : '.*-> \(.*\)$'` 83 | if expr "$link" : '/.*' > /dev/null; then 84 | PRG="$link" 85 | else 86 | PRG="`dirname "$PRG"`/$link" 87 | fi 88 | done 89 | 90 | saveddir=`pwd` 91 | 92 | M2_HOME=`dirname "$PRG"`/.. 93 | 94 | # make it fully qualified 95 | M2_HOME=`cd "$M2_HOME" && pwd` 96 | 97 | cd "$saveddir" 98 | # echo Using m2 at $M2_HOME 99 | fi 100 | 101 | # For Cygwin, ensure paths are in UNIX format before anything is touched 102 | if $cygwin ; then 103 | [ -n "$M2_HOME" ] && 104 | M2_HOME=`cygpath --unix "$M2_HOME"` 105 | [ -n "$JAVA_HOME" ] && 106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 107 | [ -n "$CLASSPATH" ] && 108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 109 | fi 110 | 111 | # For Migwn, ensure paths are in UNIX format before anything is touched 112 | if $mingw ; then 113 | [ -n "$M2_HOME" ] && 114 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 115 | [ -n "$JAVA_HOME" ] && 116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 117 | # TODO classpath? 118 | fi 119 | 120 | if [ -z "$JAVA_HOME" ]; then 121 | javaExecutable="`which javac`" 122 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 123 | # readlink(1) is not available as standard on Solaris 10. 124 | readLink=`which readlink` 125 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 126 | if $darwin ; then 127 | javaHome="`dirname \"$javaExecutable\"`" 128 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 129 | else 130 | javaExecutable="`readlink -f \"$javaExecutable\"`" 131 | fi 132 | javaHome="`dirname \"$javaExecutable\"`" 133 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 134 | JAVA_HOME="$javaHome" 135 | export JAVA_HOME 136 | fi 137 | fi 138 | fi 139 | 140 | if [ -z "$JAVACMD" ] ; then 141 | if [ -n "$JAVA_HOME" ] ; then 142 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 143 | # IBM's JDK on AIX uses strange locations for the executables 144 | JAVACMD="$JAVA_HOME/jre/sh/java" 145 | else 146 | JAVACMD="$JAVA_HOME/bin/java" 147 | fi 148 | else 149 | JAVACMD="`which java`" 150 | fi 151 | fi 152 | 153 | if [ ! -x "$JAVACMD" ] ; then 154 | echo "Error: JAVA_HOME is not defined correctly." >&2 155 | echo " We cannot execute $JAVACMD" >&2 156 | exit 1 157 | fi 158 | 159 | if [ -z "$JAVA_HOME" ] ; then 160 | echo "Warning: JAVA_HOME environment variable is not set." 161 | fi 162 | 163 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 164 | 165 | # traverses directory structure from process work directory to filesystem root 166 | # first directory with .mvn subdirectory is considered project base directory 167 | find_maven_basedir() { 168 | 169 | if [ -z "$1" ] 170 | then 171 | echo "Path not specified to find_maven_basedir" 172 | return 1 173 | fi 174 | 175 | basedir="$1" 176 | wdir="$1" 177 | while [ "$wdir" != '/' ] ; do 178 | if [ -d "$wdir"/.mvn ] ; then 179 | basedir=$wdir 180 | break 181 | fi 182 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 183 | if [ -d "${wdir}" ]; then 184 | wdir=`cd "$wdir/.."; pwd` 185 | fi 186 | # end of workaround 187 | done 188 | echo "${basedir}" 189 | } 190 | 191 | # concatenates all lines of a file 192 | concat_lines() { 193 | if [ -f "$1" ]; then 194 | echo "$(tr -s '\n' ' ' < "$1")" 195 | fi 196 | } 197 | 198 | BASE_DIR=`find_maven_basedir "$(pwd)"` 199 | if [ -z "$BASE_DIR" ]; then 200 | exit 1; 201 | fi 202 | 203 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 204 | echo $MAVEN_PROJECTBASEDIR 205 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 206 | 207 | # For Cygwin, switch paths to Windows format before running java 208 | if $cygwin; then 209 | [ -n "$M2_HOME" ] && 210 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 211 | [ -n "$JAVA_HOME" ] && 212 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 213 | [ -n "$CLASSPATH" ] && 214 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 215 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 216 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 217 | fi 218 | 219 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 220 | 221 | exec "$JAVACMD" \ 222 | $MAVEN_OPTS \ 223 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 224 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 225 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 226 | --------------------------------------------------------------------------------