Im Rahmen eines unserer neuesten Projekte mussten wir unter Verwendung einer Technologie unserer Wahl eine Reihe von REST-Services entwickeln. Wir entschieden uns für Spring Boot aufgrund seiner Einfachheit. Die Folge: Wir benötigten für unsere Kundenplattform ein einsatzfähiges Artefakt. In unserem Fall handelte es sich bei der Plattform um den Oracle Weblogic Server 12c, obwohl Spring Boot-Anwendungen meist als unabhängige JAR-Dateien oder sogar in Docker-Containern genutzt werden. Da diese Option für uns nicht in Frage kam, suchten wir nach einem Weg, die Spring-Boot-App auf WebLogic einzusetzen. Es stellte sich heraus, dass dies gar nicht schwer ist, sofern man sich einiger Einschränkungen bewusst ist.
- Gehe zuerst auf das Spring Boot initializr-Projekt (start.spring.io) und wähle zunächst die gewünschten Bibliotheken sowie Maven-Koordinaten aus.
- Die einzige Pflichtvoraussetzung für unser Projekt ist das Web, da wir eine Webanwendung erstellen
- Actuator (zur Überwachung, optional)
- Eventuell auch HATEOAS, wenn du solche Features benötigen
- Nachdem du das generierte Archiv heruntergeladen hast, importiere das generierte Projekt in eine IDE nach Ihrer Wahl. Bearbeite dann die bereits generierte Anwendungsklasse und stelle sicher, dass du SpringBootServletInitializer erweitern, um die WebApplicationInitializer-Schnittstelle zu implementieren und die Konfigurationsmethode wie folgt zu überschreiben:
Vorher:
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Nachher:
@ComponentScan @SpringBootApplication public class Application extends SpringBootServletInitializer implements WebApplicationInitializer { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); } }
- Da wir unsere Anwendung als Webapplikation auf dem Weblogic-Server einsetzen wollen, gehe zu deiner pom.xml-Datei und ändere die Standard-Paketierung von JAR zu WAR:
<groupId>de.virtual7</groupId> <artifactId>demo.wls</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>demo.wls</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-hateoas</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
- Bearbeite auch den Build-Bereich deiner pom.xml und überschreibe das Maven-WAR-Plug-in. Konfiguriere es so, dass es nicht ausfällt, wenn die web.xml fehlt:
<build> … <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> <archive> <manifest> <addDefaultImplementationEntries>false</addDefaultImplementationEntries> </manifest> </archive> </configuration> </plugin> </plugins> … </build>
- Füge eine weblogic.xml-Datei hinzu, die den Kontextstamm und die Pakete angibt, die Vorrang haben sollten: (stelle sicher, dass du diese im Ordner src/main/webapp/WEB-INF hinzufügst)
<?xml version="1.0" encoding="UTF-8"?> <wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd"> <wls:context-root>/v7</wls:context-root> <wls:container-descriptor> <wls:prefer-application-packages> <wls:package-name>org.slf4j.*</wls:package-name> <wls:package-name>org.springframework.*</wls:package-name> </wls:prefer-application-packages> </wls:container-descriptor> </wls:weblogic-web-app>
- Fügen eine weitere fast leere XML-Datei hinzu (in unserem Fall heißt sie DispatcherServlet-Servlet.xml):
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
- Implementiere einen grundlegenden Rest-Controller und vergiss nicht, die @ComponentScan-Annotation in der Anwendungsklasse hinzuzufügen, um sicherzustellen, dass die von dir erstellten REST-Ressourcen von Spring erfasst werden, z. B.:
@RestController @RequestMapping("/resource") public class ResourceController { @RequestMapping(method = RequestMethod.GET) String readResource() { return "hello!"; } }
- Verwende wahlweise das Maven-weblogic-Plug-in, um das generierte Artefakt auf einer Weblog-Instanz nach Wahl zu implementieren, wenn es lokal oder sogar über Jenkins aufgerufen wird:
- Öffne die Kommandozeile und gebe mvn clean install ein, um das Projekt und die implementierbare Datei zu erstellen (diese wird im Ordner {project_root}/Zielordner erstellt). Gehe dann zu Ihrer Weblogic-Administrationskonsole und wende das Artefakt an
- Gehe auf your_server_url:Port/v7/resource und du solltest es sehen
- Weil du die Actuator-Abhängigkeit aufgenommen hast, kannst du auch eine Anforderung an /v7/health ausstellen, um den Status deiner App zu sehen (du kannst alle verfügbaren Endpunkte des Actuators hier überprüfen: http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html)
- Und das war es auch schon. Herzlichen Glückwunsch, du hast deine erste Spring-Boot-Anwendung als WAR-Datei auf Weblogic implementiert!