Error while deploying and running spring app in RAD 8 when selecting Run server with resources within workspace

user2442578 picture user2442578 · Jun 1, 2013 · Viewed 13.8k times · Source

My application has four small projects:

  • build-project - Has only the root POM
  • ear-module - This is the application ear project which contains a web project
  • web-project - This is web app
  • utility-project - Web project uses this as dependency and this jar is included as jar No EJBs.

I am using RAD 8, Deployment works correctly when I select to run the application with the Publishing settings for Websphere "Run server with resources on Server" in RAD8.

However when I try do the same with "`Run server with resources within the workspace" and open the application in my Browser it fails with this error message:

[6/1/13 1:44:04:678 EDT] 0000001c annotations   W com.ibm.ws.amm.scan.context.ScannerContextImpl getInputDataForClass Failed to open resource [ org/springframework/web/context/ContextLoaderListener.class ] from module [ abc-web.war ]
[6/1/13 1:44:04:678 EDT] 0000001c annotations   W com.ibm.ws.amm.scan.context.ScannerContextImpl getInputDataForClass   Class loader [ org.eclipse.jst.j2ee.commonarchivecore.internal.util.WarFileDynamicClassLoader@64662b13 ]
[6/1/13 1:44:04:678 EDT] 0000001c annotations   W com.ibm.ws.amm.scan.context.ScannerContextImpl getInputDataForClass   Class loader [ com.ibm.ws.bootstrap.ExtClassLoader@d64e7229 ]
[6/1/13 1:44:04:678 EDT] 0000001c annotations   W com.ibm.ws.amm.scan.context.ScannerContextImpl getInputDataForClass   Class loader [ org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@e9f56141 ]
[6/1/13 1:44:04:678 EDT] 0000001c annotations   W com.ibm.ws.amm.scan.context.ScannerContextImpl getInputDataForClass   Class loader [ sun.misc.Launcher$AppClassLoader@964626a4 ]
[6/1/13 1:44:04:678 EDT] 0000001c annotations   W com.ibm.ws.amm.scan.context.ScannerContextImpl getInputDataForClass   Class loader [ sun.misc.Launcher$ExtClassLoader@ad8046ad ]


[6/1/13 1:44:14:724 EDT] 0000001f ApplicationMg A   WSVR0220I: Application stopped: myapp-ear
[6/1/13 1:44:14:896 EDT] 0000001f CompositionUn A   WSVR0193I: Composition unit WebSphere:cuname=myapp-ear in BLA WebSphere:blaname=myapp-ear stopped.

[6/1/13 1:44:36:470 EDT] 0000001f annotation    W com.ibm.ws.webcontainer.annotation.WASAnnotationHelper collectClasses SRVE8000W: Skipped class that failed to initialize for annotation scanning.
                                 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    at java.lang.Class.forNameImpl(Native Method)
    at java.lang.Class.forName(Class.java:213)
    at com.ibm.ws.webcontainer.annotation.WASAnnotationHelper.loadClass(WASAnnotationHelper.java:753)
    at com.ibm.ws.webcontainer.annotation.WASAnnotationHelper.collectClasses(WASAnnotationHelper.java:188)
    at com.ibm.ws.webcontainer.annotation.WASAnnotationHelper.<init>(WASAnnotationHelper.java:143)
    at com.ibm.ws.webcontainer.annotation.WASAnnotationHelperManager.getAnnotationHelper(WASAnnotationHelperManager.java:63)
    at com.ibm.ws.webcontainer.metadata.WebMetaDataFactory.handOffReferenceData(WebMetaDataFactory.java:450)
    at com.ibm.ws.webcontainer.metadata.WebMetaDataFactory.createMetaData(WebMetaDataFactory.java:423)
    at com.ibm.ws.runtime.component.MetaDataMgrImpl.createMetaDataFromFactories(MetaDataMgrImpl.java:228)
    at com.ibm.ws.runtime.component.MetaDataMgrImpl.createMetaData(MetaDataMgrImpl.java:411)
    at com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:630)
    at com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:967)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:766)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplicationDynamically(ApplicationMgrImpl.java:1354)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:2150)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:445)

Here is the maven pom for the build project( root project just to do build)

<groupId>com.mytest</groupId>
<artifactId>myapp</artifactId>
<version>2.0.0</version>
<packaging>pom</packaging>
<name>myapp</name>
<properties>
    <project.build.source>1.6</project.build.source>
    <project.build.target>1.6</project.build.target>
    <project.encoding>UTF-8</project.encoding>
    <springVersion>3.2.1.RELEASE</springVersion>
</properties>
<modules>
    <module>../myapp-domain</module>
    <module>../myapp-web</module>
    <module>../myapp-ear</module>
</modules>
<dependencyManagement>
    <dependencies>
        <!-- external dependencies -->

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springVersion}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springVersion}</version>
            <scope>compile</scope>
        </dependency>           
        <dependency>
            <groupId>opensymphony</groupId>
            <artifactId>oscache</artifactId>
            <version>2.4</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        .......   other dependencies  .......
        <!-- test dependencies -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
</dependencyManagement>
<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>${project.build.source}</source>
                    <target>${project.build.target}</target>
                    <encoding>${project.encoding}</encoding>
                    <showDeprecation>true</showDeprecation>
                    <showWarnings>true</showWarnings>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <encoding>${project.encoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.10</version>
                <configuration>
                    <disableXmlReport>true</disableXmlReport>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-site-plugin</artifactId>
                <version>2.0-beta-6</version>
            </plugin>

Here is the maven pom for the ear project

<parent>
    <groupId>com.mytest</groupId>
    <artifactId>myapp</artifactId>
    <version>2.0.0</version>
</parent>
<artifactId>myapp-ear</artifactId>
<packaging>ear</packaging>
<name>MyappEAR</name>

  <dependencies>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>myapp-web</artifactId>
        <type>war</type>
        <version>2.0.0</version>
    </dependency>
</dependencies>    

<build>
    <finalName>myapp</finalName>
    <resources>
        <resource>
            <directory>META-INF</directory>
            <targetPath>../myapp/META-INF</targetPath>
            <includes>
                <include>**/*.*</include>
            </includes>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <artifactId>maven-ear-plugin</artifactId>
            <version>2.7</version>
            <configuration>
            <applicationXml>${basedir}/META-INF/application.xml</applicationXml> 
               <generateApplicationXml>false</generateApplicationXml>
                <modules>
                    <webModule>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>myapp-web</artifactId>
                        <bundleFileName>myapp-web.war</bundleFileName>
                    </webModule>
                </modules>
                <encoding>${project.encoding}</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>
   <properties>
<maven.ear.final.name>myapp.ear</maven.ear.final.name>
</properties>

================================================================================================== Here is the Web project POM

<artifactId>myapp-web</artifactId>
<packaging>war</packaging>
<name>myappWeb</name>
<dependencies>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${springVersion}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${springVersion}</version>
    </dependency>


<build>
    <finalName>myapp-web</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.0.2</version>
            <configuration>
                <warSourceDirectory>src/main/webapp</warSourceDirectory>
                <webXml>src/main/webapp/WEB-INF/web.xml</webXml>

                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

Strange thing is that when I try to Add the ear in Add and remove option of the Websphere 8 by rightclicking onthe server I see that the ear generated has structure like this. So it has two wars in the same war. But I looked at the myapp.ear file built and it has only one war in it.

myapp-ear

|-myapp-web

|   |-Spring-web-3.2.1RELEASE.jar

|   |-myapp-domain jar

|-myapp-web.war

Answer

Tobi Nonymous picture Tobi Nonymous · Aug 28, 2013

This is a bug in the deployment mechanism of the RAD with maven projects using Spring in versions >= 3.2.0 and is documented in this bugreport: https://jira.springsource.org/browse/SPR-10494

There are two possible ways of resolving your issue:

  1. Use a Spring version < 3.2, e.g. 3.1.4
  2. If you depend on Spring 3.2, you can simply copy the spring-web dependency into the temp folder whre your workspace copies your project before actually deploying it to websphere. It can be found under "YOURWORKSPACE.metadata.plugins\org.eclipse.wst.server.core\tmpX*\lib" (each server in your servers view gets its own temp folder, so if you just have one server, the folder will be tmp0

The second option is more of a workaround, which is only required for deployments directly from within the IDE. If you export your web project as a .war file and deploy it manually to Websphere it will just work.

There exists another workaround, that I only read when investigating the problem myself, but didn't try out myself and can't find the link either, so handle with care. According to that you can package your actual source into a new project and including that jar in your web project with the required dependencies

edit: We tried out Spring 4.0.0 and the bug was gone, so this might be the best solution if you are not stuck with a lower Spring version.