2016-04-20 3 views
4

Editне может развернуть Spring загрузки EAR в JBoss 6.4 EAP

Alright, так это выглядит, как SpringBootServletInitializer не обнаруживается, потому что это внутри JAR в EAR, не WAR. Я сделал новый модуль и включил его в свою WAR. Это содержало каталог META-INF с папкой служб. Эта папка служб имеет один файл (javax.servlet.ServletContainerInitializer) с содержимым org.springframework.web.SpringServletContainerInitializer. Это затем пытается развернуть WAR, но терпит неудачу со следующим:

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 

Опять же, это выглядит как Servlet API конфликтует с другой - но есть только один на пути к классам от того, что я могу сказать (и я даже в том же объеме, что и для этого теста).

Оригинал

В настоящее время у меня несколько вопросов развертывания Весна-загрузки (1.3.2.RELEASE) EAR в JBoss 6.4 EAP. EAR-файл просто обматывает тощую WAR и все JAR-файлы в папке/lib.

Я ранее вносил изменения, необходимые для развертывания WAR-файла, но мы, к сожалению, сталкиваемся с тем, что развертывание должно быть EAR.

Развертывание как WAR

для развертывания приложения в качестве WAR, я изменил следующее:

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-развертывания-структуру. 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); 
    } 

} 

Эти изменения работали хорошо, и теперь я мог развернуть WAR на JBoss 6.4.

Развертывание как EAR

Это где начинается проблема. Я создал новый модуль для создания файла EAR с помощью Maven-уха-плагин:

<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> 

Я также добавил jboss-deployment-structure.xml в/SRC/главная/приложение/META-INF, так что он будет включен в EAR (он должен быть на самом высоком уровне). Попытка развернуть это приводит к «успеху», но JBoss никогда не пытается развернуть WAR внутри EAR. Кажется, что требуется web.xml.

Так, глядя на документы, мне кажется, что мне нужно, чтобы определить, как web.xml следующим образом:

<?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> 

Теперь есть некоторые дополнительные настройки, если я хочу упасть до Servlet 2.5 - но я не» я хочу это сделать.

Попытка развернуть эти результаты, за исключением следующего:

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) 

Это, казалось бы, что есть несоответствие в версиях сервлет загружается, но я не могу показаться, чтобы убедиться, что он (или исключить его). Я попытался установить простор при условии (поэтому версия JBoss берет на себя), но это приводит к следующей ошибке:

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] 

Очевидно, что он использует в JBoss 3.0 сервлета спецификации, но это, казалось бы, фактический сервлет 3,0 JAR отсутствует.

Есть ли что-то, что мне не хватает? Действительно ли WAR действительно нужен web.xml, или есть какой-то другой способ? Является ли то, что я пытаюсь даже сделать возможным?

Любая помощь была бы принята с благодарностью.

ответ

1

Исправлена ​​ошибка. Начиная с развертывания WAR, я сделал дополнительный модуль EAR. Я не должен был использовать skinnyWar, а вместо этого оставил все JAR внутри WAR. Это позволяет Spring правильно загружать сервлет Spring Boot.

Это имеет следующую конфигурацию:

<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> 

Я также уверен, что не было компиляции зависимостей в области видимости моего родительского модуля (корень POM).

Я тогда сделал обязательно иметь следующий файл в моем EAR:

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

В то время как это было в моей WAR, главная проблема у меня было то, что я до сих пор используют <deployment> вместо <sub-deployment>

<?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> 

Это правильно исключает модуль javaee.api и подсистему jpa.

После этого EAR правильно развернулся к JBoss.

Смежные вопросы