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.

  • Gehen Sie zuerst auf das Spring Boot initializr-Projekt (start.spring.io) und wählen Sie 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 Sie solche Features benötigen
  • 1
  • Nachdem Sie das generierte Archiv heruntergeladen haben, importieren Sie das generierte Projekt in eine IDE nach Ihrer Wahl. Bearbeiten Sie dann die bereits generierte Anwendungsklasse und stellen Sie sicher, dass Sie 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, gehen Sie zu Ihrer pom.xml-Datei und ändern Sie 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>
  • Bearbeiten Sie auch den Build-Bereich Ihrer pom.xml und überschreiben Sie das Maven-WAR-Plug-in. Konfigurieren Sie 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ügen Sie eine weblogic.xml-Datei hinzu, die den Kontextstamm und die Pakete angibt, die Vorrang haben sollten: (stellen Sie sicher, dass Sie diese im Ordner src/main/webapp/WEB-INF hinzufügen)
<?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 Sie 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>
  • Implementieren Sie einen grundlegenden Rest-Controller und vergessen Sie nicht, die @ComponentScan-Annotation in der Anwendungsklasse hinzuzufügen, um sicherzustellen, dass die von Ihnen erstellten REST-Ressourcen von Spring erfasst werden, z. B.:
@RestController
@RequestMapping("/resource")
public class ResourceController {

    @RequestMapping(method = RequestMethod.GET)
    String readResource() {
        return "hello!";
    }
}
  • Verwenden Sie 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:
  • Öffnen Sie die Kommandozeile und geben Sie mvn clean install ein, um das Projekt und die implementierbare Datei zu erstellen (diese wird im Ordner {project_root}/Zielordner erstellt). Gehen Sie dann zu Ihrer Weblogic-Administrationskonsole und wenden Sie das Artefakt an
  • Gehen Sie auf your_server_url:Port/v7/resource und Sie sollten es sehen

2

3

  • Und das war es auch schon. Herzlichen Glückwunsch, Sie haben Ihre erste Spring-Boot-Anwendung als WAR-Datei auf Weblogic implementiert!