bearbeitenKann in JBoss 6.4 EAP
Okay, so sieht es Bereitstellen Frühling Boot-EAR nicht wie die SpringBootServletInitializer
nicht erkannt wird, weil es in der EAR in einem JAR ist, nicht der Krieg. Was ich gemacht habe, war ein neues Modul zu bauen und es in meinen WAR aufzunehmen. Dieser enthielt ein META-INF-Verzeichnis mit einem Dienstordner. Dieser Dienstordner hat eine einzige Datei (javax.servlet.ServletContainerInitializer
) mit dem Inhalt org.springframework.web.SpringServletContainerInitializer
. Dieser versucht dann, den Krieg zu implementieren, aber nicht mit dem folgenden:
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS018104: Deployment error processing SCI for jar: test-1.0.0-SNAPSHOT.jar
at org.jboss.as.web.deployment.ServletContainerInitializerDeploymentProcessor.loadSci(ServletContainerInitializerDeploymentProcessor.java:202)
... 7 more
Caused by: java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer
at org.jboss.as.web.deployment.ServletContainerInitializerDeploymentProcessor.loadSci(ServletContainerInitializerDeploymentProcessor.java:194)
... 7 more
Auch hier sieht es aus wie die Servlet API ist mit einem anderen in Konflikt - aber es gibt nur die eine auf dem Classpath von dem, was ich sagen kann (und ich (wie es für diesen Test vorgesehen ist).
Original-
Zeit ein paar Probleme Ich habe ein Frühling-Boot (1.3.2.RELEASE) EAR in JBoss 6.4 EAP bereitstellen. Die EAR-Datei umschließt einfach einen mageren WAR und alle JARs in einem/lib-Ordner.
Ich hatte zuvor die erforderlichen Änderungen vorgenommen, um die WAR-Datei bereitzustellen, aber wir sind leider auf die Anforderung gestoßen, dass die Bereitstellung eine EAR sein muss.
als WAR Bereitstellen
die Anwendung als Krieg zu implementieren, änderte ich die folgende:
pom.xml
<!-- JavaEE 7 for JPA 2.1 -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<!-- Exclude Tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Include Servlet 3 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
jboss-Deployment-Struktur. xml
<?xml version="1.0"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>
<exclude-subsystems>
<subsystem name="jpa"/>
</exclude-subsystems>
<exclusions>
<module name="javaee.api"/>
</exclusions>
</deployment>
</jboss-deployment-structure>
Application.java
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
private static final Class<Application> APPLICATION_CLASS = Application.class;
public static void main(String[] args) {
SpringApplication.run(APPLICATION_CLASS, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(APPLICATION_CLASS);
}
}
Diese Änderungen funktionierten gut, und ich kann jetzt den Krieg zu JBoss 6.4 bereitstellen.
Bereitstellen als EAR
Dies ist, wo das Problem beginnt. Ich habe ein neues Modul die EAR-Datei mit der Maven-Ohr-Plugin zu bauen:
<build>
<finalName>my-application</finalName>
<plugins>
<plugin>
<artifactId>maven-ear-plugin</artifactId>
<version>2.10.1</version>
<configuration>
<version>6</version>
<skinnyWars>true</skinnyWars>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<fileNameMapping>no-version</fileNameMapping>
<modules>
<webModule>
<groupId>com.test.app</groupId>
<artifactId>my-application</artifactId>
<bundleFileName>my-application.war</bundleFileName>
<context-root>/my-app</context-root>
</webModule>
</modules>
</configuration>
</plugin>
</plugins>
</build>
Ich habe auch die jboss-deployment-structure.xml
unter/src/main/application/META-INF, so dass es in den mitgelieferten würde EAR (es muss auf der höchsten Ebene sein). Der Versuch, dies zu implementieren, führt zu "Erfolg", aber JBoss versucht nie, den WAR innerhalb des EAR zu implementieren. Es scheint, dass eine web.xml benötigt wird.
So bei der Dokumentation suchen, scheint es, dass ich eine web.xml definieren müssen wie folgt:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.test.app.Application</param-value>
</context-param>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextAttribute</param-name>
<param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Jetzt gibt einige zusätzliche Konfiguration ist, wenn ich 2,5 fallen wollen Servlet - aber ich ziehe‘ Ich will das machen.
diese Ergebnisse in der folgenden Ausnahme bereitstellen Versuch:
10:29:40,586 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/company-api-entity]] (ServerService Thread Pool -- 56) JBWEB000289: Servlet appServlet threw load() exception: java.lang.ClassCastException: org.springframework.web.servlet.DispatcherServlet cannot be cast to javax.servlet.Servlet
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1154) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1100) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3593) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.apache.catalina.core.StandardContext.start(StandardContext.java:3802) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.jboss.as.web.deployment.WebDeploymentService.doStart(WebDeploymentService.java:163) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
at org.jboss.as.web.deployment.WebDeploymentService.access$000(WebDeploymentService.java:61) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
at org.jboss.as.web.deployment.WebDeploymentService$1.run(WebDeploymentService.java:96) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [rt.jar:1.8.0_45]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [rt.jar:1.8.0_45]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_45]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_45]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_45]
at org.jboss.threads.JBossThread.run(JBossThread.java:122)
Dies scheint, dass es eine Diskrepanz in den Servlet-Versionen geladen werden, aber ich kann nicht, um zu überprüfen scheint, dass es (oder sie ausschließen). Ich habe versucht, den Umfang zu versehene Einstellung (so die JBoss-Version übernimmt), aber dies führt zu dem folgenden Fehler:
11:18:47,141 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/company-api-entity]] (ServerService Thread Pool -- 52) JBWEB000289: Servlet appServlet threw load() exception: java.util.MissingResourceException: Can't find bundle for base name javax.servlet.LocalStrings, locale en_IE
at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1564) [rt.jar:1.8.0_45]
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1387) [rt.jar:1.8.0_45]
at java.util.ResourceBundle.getBundle(ResourceBundle.java:773) [rt.jar:1.8.0_45]
at javax.servlet.GenericServlet.<clinit>(GenericServlet.java:95) [jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-2.jar:1.0.2.Final-redhat-2]
Offensichtlich ist es mit der JBoss 3.0 Servlet-Spezifikation, aber es würde die tatsächliche Servlet scheint 3.0 JAR fehlt.
Gibt es etwas, das ich vermisse? Benötigt der WAR tatsächlich eine web.xml, oder gibt es eine andere Möglichkeit? Ist das, was ich versuche, sogar möglich?
Jede Hilfe würde sehr geschätzt werden.