Chapter 6. Developing an application for the Spring Boot image
Chapter 6. Developing an application for the Spring Boot image This chapter explains how to develop applications for the Spring Boot image. 6.1. Creating a Spring Boot 2 project using Maven archetype This quickstart demonstrates how to create a Spring Boot 2 project using Maven archetypes. Procedure Go to the appropriate directory on your system. In a shell prompt, enter the following the mvn command to create a Spring Boot 2 project. The archetype plug-in switches to interactive mode to prompt you for the remaining fields. When prompted, enter org.example.fis for the groupId value and fuse713-spring-boot for the artifactId value. Accept the defaults for the remaining fields. If the above command exited with the BUILD SUCCESS status, you should now have a new Fuse on OpenShift project under the fuse713-spring-boot subdirectory. You are now ready to build and deploy the fuse713-spring-boot project. Assuming you are still logged into OpenShift, change to the directory of the fuse713-spring-boot project, and then build and deploy the project, as follows. Note For the full list of available Spring Boot 2 archetypes, see Spring Boot 2 Archetype Catalog . 6.2. Structure of the Camel Spring Boot application The directory structure of a Camel Spring Boot application is as follows: Where the following files are important for developing an application: pom.xml Includes additional dependencies. Camel components that are compatible with Spring Boot are available in the starter version, for example camel-jdbc-starter or camel-infinispan-starter . Once the starters are included in the pom.xml they are automatically configured and registered with the Camel content at boot time. Users can configure the properties of the components using the application.properties file. application.properties Allows you to externalize your configuration and work with the same application code in different environments. For details, see Externalized Configuration For example, in this Camel application you can configure certain properties such as name of the application or the IP addresses, and so on. application.properties Application.java It is an important file to run your application. As a user you will import here a file camel-context.xml to configure routes using the Spring DSL. The Application.java file specifies the @SpringBootApplication annotation, which is equivalent to @Configuration , @EnableAutoConfiguration and @ComponentScan with their default attributes. Application.java @SpringBootApplication // load regular Spring XML file from the classpath that contains the Camel XML DSL @ImportResource({"classpath:spring/camel-context.xml"}) It must have a main method to run the Spring Boot application. Application.java public class Application { /** * A main method to start this application. */ public static void main(String[] args) { SpringApplication.run(Application.class, args); } } camel-context.xml The src/main/resources/spring/camel-context.xml is an important file for developing application as it contains the Camel routes. Note You can find more information on developing Spring-Boot applications at Developing your first Spring Boot Application src/main/jkube/deployment.yml Provides additional configuration that is merged with the default OpenShift configuration file generated by the openshift-maven-plugin. Note This file is not used part of Spring Boot application but it is used in all quickstarts to limit the resources such as CPU and memory usage. 6.3. Spring Boot 2 archetype catalog The Spring Boot 2 Archetype catalog includes the following examples. Table 6.1. Spring Boot 2 Maven Archetypes Name Description spring-boot-camel-archetype Demonstrates how to use Apache Camel with Spring Boot based on a fabric8 Java base image. spring-boot-camel-amq-archetype Demonstrates how to connect a Spring Boot application to an ActiveMQ broker and use JMS messaging between two Camel routes using Kubernetes or OpenShift. spring-boot-camel-drools-archetype Demonstrates how to use Apache Camel to integrate a Spring Boot application running on Kubernetes or OpenShift with a remote Kie Server. spring-boot-camel-infinispan-archetype Demonstrates how to connect a Spring Boot application to a JBoss Data Grid or Infinispan server using the Hot Rod protocol. spring-boot-camel-rest-3scale-archetype Demonstrates how to use Camel's REST DSL to expose a RESTful API and expose it to 3scale. spring-boot-camel-rest-sql-archetype Demonstrates how to use SQL via JDBC along with Camel's REST DSL to expose a RESTful API. spring-boot-camel-xml-archetype Demonstrates how to configure Camel routes in Spring Boot via a Spring XML configuration file. spring-boot-cxf-jaxrs-archetype Demonstrates how to use Apache CXF with Spring Boot based on a fabric8 Java base image. The quickstart uses Spring Boot to configure an application that includes a CXF JAXRS endpoint with Swagger enabled. spring-boot-cxf-jaxws-archetype Demonstrates how to use Apache CXF with Spring Boot based on a fabric8 Java base image. The quickstart uses Spring Boot to configure an application that includes a CXF JAXWS endpoint. spring-boot-cxf-jaxrs-xml-archetype Demonstrates how to use Apache CXF JAX-RS with Spring Boot 2 on OpenShift. This quickstart uses Spring Boot2 to launch a Spring configuration file based CXF application that includes a CXF JAXRS endpoint with Swagger enabled. spring-boot-cxf-jaxws-xml-archetype Demonstrates how to use Apache CXF JAX-WS with Spring Boot 2 on OpenShift. The quickstart uses Spring Boot2 to launch a Spring configuration file based CXF application that includes a CXF JAXWS endpoint. Note The following Spring Boot 2 Maven archetypes fail to build and deploy on to the OpenShift. See the Release Notes for more information. spring-boot-camel-archetype spring-boot-camel-infinspan-archetype spring-boot-cxf-jaxrs-archetype spring-boot-cxf-jaxws-archetype To work around this issue, after generating a Maven project for one of these quickstarts, edit the project's Maven pom.xml file to add the following dependency: 6.4. BOM file for Spring Boot The purpose of a Maven Bill of Materials (BOM) file is to provide a curated set of Maven dependency versions that work well together, preventing you from having to define versions individually for every Maven artifact. Important Ensure you are using the correct Fuse BOM based on the version of Spring Boot you are using. The Fuse BOM for Spring Boot offers the following advantages: Defines versions for Maven dependencies, so that you do not need to specify the version when you add a dependency to your POM. Defines a set of curated dependencies that are fully tested and supported for a specific version of Fuse. Simplifies upgrades of Fuse. Important Only the set of dependencies defined by a Fuse BOM are supported by Red Hat. 6.5. Incorporate the BOM file To incorporate a BOM file into your Maven project, specify a dependencyManagement element in your project's pom.xml file (or, possibly, in a parent POM file), as shown in the examples for both Spring Boot 2: Spring Boot 2 BOM Spring Boot 2 BOM <?xml version="1.0" encoding="UTF-8" standalone="no"?> <project ...> ... <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- configure the versions you want to use here --> <fuse.version>7.13.0.fuse-7_13_0-00012-redhat-00001</fuse.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.redhat-fuse</groupId> <artifactId>fuse-springboot-bom</artifactId> <version>USD{fuse.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ... </project> After specifying the BOM using the dependency management mechanism, it is possible to add Maven dependencies to your POM without specifying the version of the artifact. For example, to add a dependency for the camel-hystrix component, you would add the following XML fragment to the dependencies element in your POM: <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-hystrix-starter</artifactId> </dependency> Note how the Camel artifact ID is specified with the -starter suffix - that is, you specify the Camel Hystrix component as camel-hystrix-starter , not as camel-hystrix . The Camel starter components are packaged in a way that is optimized for the Spring Boot environment. 6.6. Spring Boot Maven plugin The Spring Boot Maven plugin is provided by Spring Boot and it is a developer utility for building and running a Spring Boot project: Building - create an executable Jar package for your Spring Boot application by entering the command mvn package in the project directory. The output of the build is placed in the target/ subdirectory of your Maven project. Running - for convenience, you can run the newly-built application with the command, mvn spring-boot:start . To incorporate the Spring Boot Maven plugin into your project POM file, add the plugin configuration to the project/build/plugins section of your pom.xml file, as shown in the following example. Example <?xml version="1.0" encoding="UTF-8" standalone="no"?> <project ...> ... <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- configure the versions you want to use here --> <fuse.version>7.13.0.fuse-7_13_0-00012-redhat-00001</fuse.version> </properties> ... <build> <plugins> <plugin> <groupId>org.jboss.redhat-fuse</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>USD{fuse.version}</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ... </project>
mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate -DarchetypeCatalog=https://maven.repository.redhat.com/ga/io/fabric8/archetypes/archetypes-catalog/2.2.0.fuse-7_13_0-00014-redhat-00001/archetypes-catalog-2.2.0.fuse-7_13_0-00014-redhat-00001-archetype-catalog.xml -DarchetypeGroupId=org.jboss.fuse.fis.archetypes -DarchetypeArtifactId=spring-boot-camel-xml-archetype -DarchetypeVersion=2.2.0.fuse-7_13_0-00014-redhat-00001 Define value for property 'groupId': : org.example.fis Define value for property 'artifactId': : fuse713-spring-boot Define value for property 'version': 1.0-SNAPSHOT: : Define value for property 'package': org.example.fis: : Confirm properties configuration: groupId: org.example.fis artifactId: fuse713-spring-boot version: 1.0-SNAPSHOT package: org.example.fis Y: : Y cd fuse713-spring-boot mvn oc:deploy -Popenshift ├── LICENSE.md ├── pom.xml ├── README.md ├── configuration │ └── settings.xml └── src ├── main │ ├── jkube │ │ └── deployment.yml │ ├── java │ │ └── org │ │ └── example │ │ └── fis │ │ ├── Application.java │ │ └── MyTransformer.java │ └── resources │ ├── application.properties │ ├── logback.xml │ └── spring │ └── camel-context.xml └── test └── java └── org └── example └── fis #spring.main.sources=org.example.fos logging.config=classpath:logback.xml the options from org.apache.camel.spring.boot.CamelConfigurationProperties can be configured here camel.springboot.name=MyCamel lets listen on all ports to ensure we can be invoked from the pod IP server.address=0.0.0.0 management.address=0.0.0.0 lets use a different management port in case you need to listen to HTTP requests on 8080 management.server.port=8081 disable all management endpoints except health endpoints.enabled = false endpoints.health.enabled = true @SpringBootApplication // load regular Spring XML file from the classpath that contains the Camel XML DSL @ImportResource({"classpath:spring/camel-context.xml"}) public class Application { /** * A main method to start this application. */ public static void main(String[] args) { SpringApplication.run(Application.class, args); } } <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>2.4.1</version> <scope>test</scope> </dependency> <?xml version="1.0" encoding="UTF-8" standalone="no"?> <project ...> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- configure the versions you want to use here --> <fuse.version>7.13.0.fuse-7_13_0-00012-redhat-00001</fuse.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.redhat-fuse</groupId> <artifactId>fuse-springboot-bom</artifactId> <version>USD{fuse.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-hystrix-starter</artifactId> </dependency> <?xml version="1.0" encoding="UTF-8" standalone="no"?> <project ...> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- configure the versions you want to use here --> <fuse.version>7.13.0.fuse-7_13_0-00012-redhat-00001</fuse.version> </properties> <build> <plugins> <plugin> <groupId>org.jboss.redhat-fuse</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>USD{fuse.version}</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>