2016-04-20 10 views
4

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.

Antwort

1

Das Problem wurde behoben. Ausgehend von der WAR-Bereitstellung habe ich ein zusätzliches EAR-Modul erstellt. Ich hätte keinen SkinnyWar verwenden sollen und stattdessen alle JARs im WAR lassen sollen. Dadurch kann Spring das Spring Boot-Servlet ordnungsgemäß starten.

Dies hat die folgende Konfiguration:

<build> 
    <finalName>my-application</finalName> 
    <plugins> 
     <plugin> 
      <artifactId>maven-ear-plugin</artifactId> 
      <version>2.10.1</version> 
      <configuration> 
       <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 auch dafür gesorgt, dass es in meinem Elternmodul (der Root-pom) keine Kompilierung scoped Abhängigkeiten waren.

ich dann dafür gesorgt, die folgende Datei in meinem Ohr haben:

src/main/application/META-INF/jboss-deployment-structure.xml

Während dies in meinem Krieg war, das Hauptproblem war ich hatte, dass ich noch <deployment> statt <sub-deployment>

wurde mit
<?xml version="1.0"?> 
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> 
    <sub-deployment name="my-application.war"> 
     <exclude-subsystems> 
      <subsystem name="jpa"/> 
     </exclude-subsystems> 
     <exclusions> 
      <module name="javaee.api"/> 
     </exclusions> 
    </sub-deployment> 
</jboss-deployment-structure> 

Dies schließt ordnungsgemäß das javaee.api-Modul und das jpa-Subsystem aus.

Danach wurde die EAR ordnungsgemäß auf JBoss bereitgestellt.

Verwandte Themen