简体   繁体   English

选择使用工作区内的资源运行服务器时,在RAD 8中部署和运行spring app时出错

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

My application has four small projects: 我的申请有四个小项目:

  • build-project - Has only the root POM build-project - 只有根POM
  • ear-module - This is the application ear project which contains a web project ear-module - 这是包含web项目的应用程序ear项目
  • web-project - This is web app web-project - 这是一个网络应用程序
  • utility-project - Web project uses this as dependency and this jar is included as jar No EJBs. utility-project - Web项目使用它作为依赖项,这个jar包含在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. 我正在使用RAD 8,当我选择使用RAD8中的Websphere“ Run server with resources on Server ”的发布设置运行应用程序时,部署正常工作。

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) 这是构建项目的maven pom(root项目只是为了构建)

<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 这是耳朵项目的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>

================================================================================================== Here is the Web project POM ================================================== ================================================这是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>

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. 奇怪的是,当我尝试通过右键单击服务器在Websphere 8的添加和删除选项中添加耳朵时,我看到生成的耳朵具有这样的结构。 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-ear MYAPP耳

|-myapp-web | -myapp的Web

| | |-Spring-web-3.2.1RELEASE.jar | -Spring-网络3.2.1RELEASE.jar

| | |-myapp-domain jar | -myapp-domain jar

| |

|-myapp-web.war | -myapp-的web.war

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

There are two possible ways of resolving your issue: 有两种方法可以解决您的问题:

  1. Use a Spring version < 3.2, eg 3.1.4 使用Spring版本<3.2,例如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. 如果你依赖于Spring 3.2,你可以简单地将spring-web依赖项复制到临时文件夹中,只要你的工作区复制项目,然后再将其部署到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 它可以在“ YOURWORKSPACE.metadata.plugins \\ org.eclipse.wst.server.core \\ tmpX * \\ lib ”下找到(服务器视图中的每个服务器都有自己的临时文件夹,所以如果你只有一个服务器,那么该文件夹将是tmp0

The second option is more of a workaround, which is only required for deployments directly from within the IDE. 第二种选择更多的是一种解决方法,只有直接从IDE中进行部署才需要这种方法。 If you export your web project as a .war file and deploy it manually to Websphere it will just work. 如果将Web项目导出为.war文件并将其手动部署到Websphere,它将起作用。

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 根据这一点,您可以将实际源包装到一个新项目中,并在您的Web项目中包含具有所需依赖项的jar

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. 编辑:我们试用了Spring 4.0.0并且错误消失了,所以如果你没有坚持使用较低的Spring版本,这可能是最好的解决方案。

As the exception says, it is ClassNotFoundException . 正如异常所说,它是ClassNotFoundException This means that necessary spring jars are defined at provided scope and your deployment is failing to resolve it at runtime. 这意味着必需的弹簧罐在provided范围内定义,并且您的部署无法在运行时解析它。

Also: I don't see that you have defined your multi-module dependencies correctly. 另外:我没有看到您正确定义了多模块依赖项。 If build-project (which is of type war) defines utility jar as a dependency at provided scope, it needs to be bundled with ear. 如果build-project (类型为war)将utility jar定义为provided范围的依赖项,则需要将其与ear捆绑在一起。

If your utility jar is not correctly being shared across multiple war files, you could troubleshoot it by adding utility at compile scope to build-project 如果您的utility jar未在多个war文件中正确共享,则可以通过在compile范围添加utilitybuild-project来对其进行故障排除

Hope this helps 希望这可以帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM