├── 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 | 
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 |
--------------------------------------------------------------------------------