3

我的应用程序有四个小项目:

  • build-project - 只有根 POM
  • ear-module - 这是包含 Web 项目的应用程序 ear 项目
  • web-project - 这是网络应用程序
  • 实用程序项目 - Web 项目将此作为依赖项,并且此 jar 包含为 jar 无 EJB。

我正在使用 RAD 8,当我选择使用Run server with resources on ServerRAD8 中的 Websphere“发布设置”运行应用程序时,部署工作正常。

但是,当我尝试对“使用工作区中的资源运行服务器”执行相同操作并在我的浏览器中打开应用程序时,它会失败并显示以下错误消息:

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

这是构建项目的maven pom(根项目只是为了构建)

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

这是耳朵项目的maven pom

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

==================================================== ==================================================这里是Web 项目 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>

奇怪的是,当我尝试通过右键单击服务器在 Websphere 8 的添加和删除选项中添加耳朵时,我看到生成的耳朵具有这样的结构。所以它在同一场战争中有两场战争。但我查看了构建的 myapp.ear 文件,其中只有一场战争。

myappear

|-myapp-web

| |-Spring-web-3.2.1RELEASE.jar

| |-myapp-domain jar

|-myapp-web.war

4

2 回答 2

6

这是 RAD 部署机制中的一个错误,其中 maven 项目在版本 >= 3.2.0 中使用 Spring,并记录在此错误报告中: https ://jira.springsource.org/browse/SPR-10494

有两种可能的方法可以解决您的问题:

  1. 使用 Spring 版本 < 3.2,例如 3.1.4
  2. 如果您依赖 Spring 3.2,您可以简单地将 spring-web 依赖项复制到 temp 文件夹中,您的工作区会在实际将项目部署到 websphere 之前复制您的项目。它可以在“ YOURWORKSPACE.metadata.plugins\org.eclipse.wst.server.core\tmpX*\lib ”下找到(服务器视图中的每个服务器都有自己的临时文件夹,因此如果您只有一台服务器,则该文件夹将是 tmp0

第二个选项更多的是一种解决方法,仅在直接从 IDE 中进行部署时才需要。如果您将 Web 项目导出为 .war 文件并手动将其部署到 Websphere,它就可以正常工作。

还有另一种解决方法,我只是在自己调查问题时阅读,但自己没有尝试,也找不到链接,所以请小心处理。据此,您可以将您的实际源代码打包到一个新项目中,并将该 jar 包含在您的 Web 项目中以及所需的依赖项中

编辑: 我们试用了 Spring 4.0.0 并且 bug 消失了,所以如果你没有被较低的 Spring 版本卡住,这可能是最好的解决方案。

于 2013-08-28T13:27:26.993 回答
0

正如例外所说,它是ClassNotFoundException. 这意味着在provided范围内定义了必要的 spring jar,并且您的部署无法在运行时解决它。

另外:我没有看到您正确定义了多模块依赖项。如果build-project(war 类型)将utilityjar 定义为provided范围内的依赖项,则需要将其与 ear 捆绑。

如果您的utilityjar 没有在多个 war 文件之间正确共享,您可以通过将范围添加utilitycompilebuild-project

希望这可以帮助

于 2013-06-01T14:58:34.683 回答