├── docker-spring-boot-codefresh.jpg ├── src ├── test │ ├── resources │ │ └── application-endpoints.properties │ └── java │ │ └── sample │ │ └── actuator │ │ ├── HelloWorldServiceTest.java │ │ ├── ExampleInfoContributorTest.java │ │ └── HealthIT.java └── main │ ├── resources │ ├── logback.xml │ └── application.properties │ └── java │ └── sample │ └── actuator │ ├── HelloWorldService.java │ ├── ExampleHealthIndicator.java │ ├── ServiceProperties.java │ ├── ExampleInfoContributor.java │ ├── SampleActuatorApplication.java │ └── SampleController.java ├── Dockerfile.only-package ├── .gitignore ├── Dockerfile ├── codefresh.yml ├── codefresh-package-only.yml ├── README.md └── pom.xml /docker-spring-boot-codefresh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codefresh-contrib/spring-boot-2-sample-app/HEAD/docker-spring-boot-codefresh.jpg -------------------------------------------------------------------------------- /src/test/resources/application-endpoints.properties: -------------------------------------------------------------------------------- 1 | server.error.path: /oops 2 | management.endpoint.health.show-details: always 3 | management.endpoints.web.base-path: /admin 4 | -------------------------------------------------------------------------------- /src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Dockerfile.only-package: -------------------------------------------------------------------------------- 1 | FROM java:8-jre-alpine 2 | 3 | EXPOSE 8080 4 | 5 | RUN mkdir /app 6 | COPY target/*.jar /app/spring-boot-application.jar 7 | 8 | ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/spring-boot-application.jar"] 9 | 10 | HEALTHCHECK --interval=1m --timeout=3s CMD wget -q -T 3 -s http://localhost:8080/actuator/health/ || exit 1 11 | -------------------------------------------------------------------------------- /src/test/java/sample/actuator/HelloWorldServiceTest.java: -------------------------------------------------------------------------------- 1 | package sample.actuator; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import org.junit.Test; 6 | 7 | public class HelloWorldServiceTest { 8 | 9 | @Test 10 | public void expectedMessage() { 11 | HelloWorldService helloWorldService = new HelloWorldService(); 12 | assertEquals("Expected correct message","Spring boot says hello from a Docker container",helloWorldService.getHelloMessage()); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *# 2 | *.iml 3 | *.ipr 4 | *.iws 5 | *.jar 6 | *.sw? 7 | *~ 8 | .#* 9 | .*.md.html 10 | .DS_Store 11 | .classpath 12 | .factorypath 13 | .gradle 14 | .idea 15 | .metadata 16 | .project 17 | .recommenders 18 | .settings 19 | .springBeans 20 | /build 21 | /code 22 | MANIFEST.MF 23 | _site/ 24 | activemq-data 25 | bin 26 | build 27 | build.log 28 | dependency-reduced-pom.xml 29 | dump.rdb 30 | interpolated*.xml 31 | lib/ 32 | manifest.yml 33 | overridedb.* 34 | settings.xml 35 | target 36 | transaction-logs 37 | .flattened-pom.xml 38 | secrets.yml 39 | .gradletasknamecache 40 | .sts4-cache 41 | 42 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | # logging.file=/tmp/logs/app.log 3 | # logging.level.org.springframework.security=DEBUG 4 | management.server.address=127.0.0.1 5 | 6 | management.endpoints.web.exposure.include=* 7 | management.endpoint.shutdown.enabled=true 8 | 9 | server.tomcat.accesslog.enabled=true 10 | server.tomcat.accesslog.pattern=%h %t "%r" %s %b 11 | #spring.jackson.serialization.INDENT_OUTPUT=true 12 | spring.jmx.enabled=true 13 | 14 | spring.jackson.serialization.write_dates_as_timestamps=false 15 | 16 | management.httptrace.include=REQUEST_HEADERS,RESPONSE_HEADERS,PRINCIPAL,REMOTE_ADDRESS,SESSION_ID 17 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM maven:3.5.2-jdk-8-alpine AS MAVEN_TOOL_CHAIN 2 | COPY pom.xml /tmp/ 3 | RUN mvn -B dependency:go-offline -f /tmp/pom.xml -s /usr/share/maven/ref/settings-docker.xml 4 | COPY src /tmp/src/ 5 | WORKDIR /tmp/ 6 | RUN mvn -B -s /usr/share/maven/ref/settings-docker.xml package 7 | 8 | FROM java:8-jre-alpine 9 | 10 | EXPOSE 8080 11 | 12 | RUN mkdir /app 13 | COPY --from=MAVEN_TOOL_CHAIN /tmp/target/*.jar /app/spring-boot-application.jar 14 | 15 | ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/spring-boot-application.jar"] 16 | 17 | HEALTHCHECK --interval=1m --timeout=3s CMD wget -q -T 3 -s http://localhost:8080/actuator/health/ || exit 1 18 | -------------------------------------------------------------------------------- /src/test/java/sample/actuator/ExampleInfoContributorTest.java: -------------------------------------------------------------------------------- 1 | package sample.actuator; 2 | 3 | import static org.mockito.ArgumentMatchers.any; 4 | import static org.mockito.Mockito.mock; 5 | import static org.mockito.Mockito.verify; 6 | 7 | import org.junit.Test; 8 | import org.springframework.boot.actuate.info.Info; 9 | 10 | public class ExampleInfoContributorTest { 11 | 12 | @Test 13 | public void infoMap() { 14 | Info.Builder builder = mock(Info.Builder.class); 15 | 16 | ExampleInfoContributor exampleInfoContributor = new ExampleInfoContributor(); 17 | exampleInfoContributor.contribute(builder); 18 | 19 | verify(builder).withDetail(any(),any()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/sample/actuator/HelloWorldService.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2016 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package sample.actuator; 18 | 19 | import org.springframework.stereotype.Service; 20 | 21 | @Service 22 | public class HelloWorldService { 23 | 24 | 25 | 26 | public String getHelloMessage() { 27 | return "Spring boot says hello from a Docker container"; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/sample/actuator/ExampleHealthIndicator.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2017 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package sample.actuator; 18 | 19 | import org.springframework.boot.actuate.health.Health; 20 | import org.springframework.boot.actuate.health.HealthIndicator; 21 | import org.springframework.stereotype.Component; 22 | 23 | @Component 24 | public class ExampleHealthIndicator implements HealthIndicator { 25 | 26 | @Override 27 | public Health health() { 28 | return Health.up().withDetail("counter", 42).build(); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/sample/actuator/ServiceProperties.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2016 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package sample.actuator; 18 | 19 | import org.springframework.boot.context.properties.ConfigurationProperties; 20 | 21 | @ConfigurationProperties(prefix = "service", ignoreUnknownFields = false) 22 | public class ServiceProperties { 23 | 24 | /** 25 | * Name of the service. 26 | */ 27 | private String name = "World"; 28 | 29 | public String getName() { 30 | return this.name; 31 | } 32 | 33 | public void setName(String name) { 34 | this.name = name; 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/sample/actuator/ExampleInfoContributor.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2016 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package sample.actuator; 18 | 19 | import java.util.Collections; 20 | 21 | import org.springframework.boot.actuate.info.Info; 22 | import org.springframework.boot.actuate.info.InfoContributor; 23 | import org.springframework.stereotype.Component; 24 | 25 | @Component 26 | public class ExampleInfoContributor implements InfoContributor { 27 | 28 | @Override 29 | public void contribute(Info.Builder builder) { 30 | builder.withDetail("example", Collections.singletonMap("someKey", "someValue")); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /codefresh.yml: -------------------------------------------------------------------------------- 1 | version: '1.0' 2 | stages: 3 | - prepare 4 | - test 5 | - build 6 | - 'integration test' 7 | steps: 8 | main_clone: 9 | title: Cloning main repository... 10 | stage: prepare 11 | type: git-clone 12 | repo: 'codefresh-contrib/spring-boot-2-sample-app' 13 | revision: master 14 | git: github 15 | run_unit_tests: 16 | title: Compile/Unit test 17 | stage: test 18 | image: 'maven:3.5.2-jdk-8-alpine' 19 | commands: 20 | - mvn -Dmaven.repo.local=/codefresh/volume/m2_repository test 21 | build_app_image: 22 | title: Building Docker Image 23 | type: build 24 | stage: build 25 | image_name: spring-boot-2-sample-app 26 | working_directory: ./ 27 | tag: 'multi-stage' 28 | dockerfile: Dockerfile 29 | run_integration_tests: 30 | title: Integration test 31 | stage: 'integration test' 32 | image: maven:3.5.2-jdk-8-alpine 33 | commands: 34 | - mvn -Dmaven.repo.local=/codefresh/volume/m2_repository verify -Dserver.host=http://my-spring-app 35 | services: 36 | composition: 37 | my-spring-app: 38 | image: '${{build_app_image}}' 39 | ports: 40 | - 8080 41 | readiness: 42 | timeoutSeconds: 30 43 | periodSeconds: 15 44 | image: byrnedo/alpine-curl 45 | commands: 46 | - "curl http://my-spring-app:8080/" -------------------------------------------------------------------------------- /codefresh-package-only.yml: -------------------------------------------------------------------------------- 1 | version: '1.0' 2 | stages: 3 | - prepare 4 | - test 5 | - build 6 | - 'integration test' 7 | steps: 8 | main_clone: 9 | title: Cloning main repository... 10 | stage: prepare 11 | type: git-clone 12 | repo: 'codefresh-contrib/spring-boot-2-sample-app' 13 | revision: master 14 | git: github 15 | run_unit_tests: 16 | title: Compile/Unit test 17 | stage: test 18 | image: 'maven:3.5.2-jdk-8-alpine' 19 | commands: 20 | - mvn -Dmaven.repo.local=/codefresh/volume/m2_repository package 21 | build_app_image: 22 | title: Building Docker Image 23 | type: build 24 | stage: build 25 | image_name: spring-boot-2-sample-app 26 | working_directory: ./ 27 | tag: 'non-multi-stage' 28 | dockerfile: Dockerfile.only-package 29 | run_integration_tests: 30 | title: Integration test 31 | stage: 'integration test' 32 | image: maven:3.5.2-jdk-8-alpine 33 | commands: 34 | - mvn -Dmaven.repo.local=/codefresh/volume/m2_repository verify -Dserver.host=http://my-spring-app 35 | services: 36 | composition: 37 | my-spring-app: 38 | image: '${{build_app_image}}' 39 | ports: 40 | - 8080 41 | readiness: 42 | timeoutSeconds: 30 43 | periodSeconds: 15 44 | image: byrnedo/alpine-curl 45 | commands: 46 | - "curl http://my-spring-app:8080/" -------------------------------------------------------------------------------- /src/test/java/sample/actuator/HealthIT.java: -------------------------------------------------------------------------------- 1 | package sample.actuator; 2 | 3 | import org.junit.Test; 4 | import org.junit.BeforeClass; 5 | 6 | import static io.restassured.RestAssured.given; 7 | import io.restassured.RestAssured; 8 | 9 | import static org.hamcrest.Matchers.containsString; 10 | import static org.hamcrest.Matchers.equalTo; 11 | 12 | public class HealthIT { 13 | 14 | @BeforeClass 15 | public static void setup() { 16 | String port = System.getProperty("server.port"); 17 | if (port == null) { 18 | RestAssured.port = Integer.valueOf(8080); 19 | } 20 | else{ 21 | RestAssured.port = Integer.valueOf(port); 22 | } 23 | 24 | String baseHost = System.getProperty("server.host"); 25 | if(baseHost==null){ 26 | baseHost = "http://localhost"; 27 | } 28 | RestAssured.baseURI = baseHost; 29 | 30 | } 31 | 32 | @Test 33 | public void running() { 34 | given().when().get("/") 35 | .then().statusCode(200); 36 | } 37 | 38 | @Test 39 | public void message() { 40 | given().when().get("/") 41 | .then().body(containsString("Spring boot")); 42 | } 43 | 44 | @Test 45 | public void fullMessage() { 46 | given().when().get("/") 47 | .then().body("message",equalTo("Spring boot says hello from a Docker container")); 48 | } 49 | 50 | @Test 51 | public void health() { 52 | given().when().get("/actuator/health") 53 | .then().body("status",equalTo("UP")); 54 | } 55 | 56 | 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/sample/actuator/SampleActuatorApplication.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2018 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package sample.actuator; 18 | 19 | import org.springframework.boot.SpringApplication; 20 | import org.springframework.boot.actuate.health.Health; 21 | import org.springframework.boot.actuate.health.HealthIndicator; 22 | import org.springframework.boot.autoconfigure.SpringBootApplication; 23 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 24 | import org.springframework.context.annotation.Bean; 25 | 26 | @SpringBootApplication 27 | @EnableConfigurationProperties(ServiceProperties.class) 28 | public class SampleActuatorApplication { 29 | 30 | public static void main(String[] args) { 31 | SpringApplication.run(SampleActuatorApplication.class, args); 32 | } 33 | 34 | @Bean 35 | public HealthIndicator helloHealthIndicator() { 36 | return new HealthIndicator() { 37 | 38 | @Override 39 | public Health health() { 40 | return Health.up().withDetail("hello", "world").build(); 41 | } 42 | 43 | }; 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dockerized Spring boot 2 application 2 | 3 | ![Docker plus Spring Boot plus Codefresh](docker-spring-boot-codefresh.jpg) 4 | 5 | This is an example Java application that uses Spring Boot 2, Maven and Docker. 6 | It is compiled using Codefresh. 7 | 8 | If you are looking for Gradle, then see this [example](https://github.com/codefresh-contrib/gradle-sample-app) 9 | 10 | 11 | ## Instructions 12 | 13 | To compile (also runs unit tests) 14 | 15 | ``` 16 | mvn package 17 | ``` 18 | 19 | ## To run the webapp manually 20 | 21 | ``` 22 | mvn spring-boot:run 23 | ``` 24 | 25 | ....and navigate your browser to http://localhost:8080/ 26 | 27 | ## To run integration tests 28 | 29 | ``` 30 | mvn spring-boot:run 31 | mvn verify 32 | ``` 33 | 34 | ## To create a docker image packaging an existing jar 35 | 36 | ``` 37 | mvn package 38 | docker build -t my-spring-boot-sample . -f Dockerfile.only-package 39 | ``` 40 | 41 | ## Create a multi-stage docker image 42 | 43 | To compile and package using Docker multi-stage builds 44 | 45 | ```bash 46 | docker build . -t my-spring-boot-sample 47 | ``` 48 | 49 | 50 | ## To run the docker image 51 | 52 | ``` 53 | docker run -p 8080:8080 my-spring-boot-sample 54 | ``` 55 | 56 | The Dockerfile also has a healthcheck 57 | 58 | ## To use this project in Codefresh 59 | 60 | 61 | There is also a [codefresh.yml](codefresh.yml) for easy usage with the [Codefresh](codefresh.io) CI/CD platform. 62 | 63 | For the simple packaging pipeline see [codefresh-package-only.yml](codefresh-package-only.yml) 64 | 65 | 66 | More details can be found in [Codefresh documentation](https://codefresh.io/docs/docs/learn-by-example/java/spring-boot-2/) 67 | 68 | 69 | Enjoy! 70 | 71 | -------------------------------------------------------------------------------- /src/main/java/sample/actuator/SampleController.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2017 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package sample.actuator; 18 | 19 | import java.util.Collections; 20 | import java.util.Date; 21 | import java.util.LinkedHashMap; 22 | import java.util.Map; 23 | 24 | import javax.validation.constraints.NotBlank; 25 | 26 | import org.springframework.context.annotation.Description; 27 | import org.springframework.http.MediaType; 28 | import org.springframework.stereotype.Controller; 29 | import org.springframework.validation.annotation.Validated; 30 | import org.springframework.web.bind.annotation.GetMapping; 31 | import org.springframework.web.bind.annotation.PostMapping; 32 | import org.springframework.web.bind.annotation.RequestMapping; 33 | import org.springframework.web.bind.annotation.ResponseBody; 34 | 35 | @Controller 36 | @Description("A controller for handling requests for hello messages") 37 | public class SampleController { 38 | 39 | private final HelloWorldService helloWorldService; 40 | 41 | public SampleController(HelloWorldService helloWorldService) { 42 | this.helloWorldService = helloWorldService; 43 | } 44 | 45 | @GetMapping(value = "/", produces = MediaType.APPLICATION_JSON_VALUE) 46 | @ResponseBody 47 | public Map hello() { 48 | return Collections.singletonMap("message", 49 | this.helloWorldService.getHelloMessage()); 50 | } 51 | 52 | @PostMapping(value = "/", produces = MediaType.APPLICATION_JSON_VALUE) 53 | @ResponseBody 54 | public Map olleh(@Validated Message message) { 55 | Map model = new LinkedHashMap<>(); 56 | model.put("message", message.getValue()); 57 | model.put("title", "Hello Home"); 58 | model.put("date", new Date()); 59 | return model; 60 | } 61 | 62 | @RequestMapping("/foo") 63 | @ResponseBody 64 | public String foo() { 65 | throw new IllegalArgumentException("Server error"); 66 | } 67 | 68 | protected static class Message { 69 | 70 | @NotBlank(message = "Message value cannot be empty") 71 | private String value; 72 | 73 | public String getValue() { 74 | return this.value; 75 | } 76 | 77 | public void setValue(String value) { 78 | this.value = value; 79 | } 80 | 81 | } 82 | 83 | } 84 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | spring-boot-sample-actuator 7 | Spring Boot Actuator Sample 8 | 2.0.2 9 | Spring Boot Actuator Sample 10 | 11 | jar 12 | 13 | org.springframework.boot 14 | spring-boot-starter-parent 15 | 2.0.2.RELEASE 16 | 17 | 18 | 19 | 20 | 21 | 22 | 1.8 23 | 24 | 25 | 26 | 27 | 28 | 29 | org.springframework.boot 30 | spring-boot-starter-actuator 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-web 35 | 36 | 37 | 38 | org.springframework.boot 39 | spring-boot-starter-jdbc 40 | 41 | 42 | 43 | 44 | org.apache.httpcomponents 45 | httpclient 46 | runtime 47 | 48 | 49 | com.h2database 50 | h2 51 | runtime 52 | 53 | 54 | 55 | 56 | org.springframework.boot 57 | spring-boot-configuration-processor 58 | true 59 | 60 | 61 | 62 | 63 | org.springframework.boot 64 | spring-boot-starter-test 65 | test 66 | 67 | 68 | io.rest-assured 69 | rest-assured 70 | test 71 | 72 | 73 | org.codehaus.groovy 74 | groovy-all 75 | test 76 | 77 | 78 | 79 | 80 | 81 | org.springframework.boot 82 | spring-boot-maven-plugin 83 | 84 | 85 | org.apache.maven.plugins 86 | maven-surefire-plugin 87 | 2.9 88 | 89 | false 90 | 91 | **/*Test.java 92 | 93 | 94 | 95 | 96 | 97 | org.apache.maven.plugins 98 | maven-failsafe-plugin 99 | 2.18 100 | 101 | 102 | 103 | integration-test 104 | verify 105 | 106 | 107 | 108 | 109 | false 110 | 111 | **/*IT.java 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | --------------------------------------------------------------------------------