java.lang.ClassCastException 在 Wildfly 10 上部署 CAS 5.3.3 Maven Overlay WAR

Posted

技术标签:

【中文标题】java.lang.ClassCastException 在 Wildfly 10 上部署 CAS 5.3.3 Maven Overlay WAR【英文标题】:java.lang.ClassCastException deploying CAS 5.3.3 Maven Overlay WAR on Wildfly 10 【发布时间】:2019-02-23 07:23:41 【问题描述】:

我正在 Wildfly 10 上部署 CAS 5.3.3,使用 https://apereo.github.io/cas/5.3.x/installation/Maven-Overlay-Installation.html 中指定的 Maven Overlay 并使用位于 https://github.com/apereo/cas-overlay-template/tree/5.3 的项目模板

部署到 Wildfly 10 后,部署失败并出现以下异常:

09:02:06,982 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 70) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./cas: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./cas: java.lang.RuntimeException: java.lang.ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to io.undertow.websockets.jsr.ServerWebSocketContainer
     at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:85)

问题可能与 Spring Boot Maven 配置有关。但是,我尝试了这些解决方案,但它们不起作用:

Spring Boot Websockets in Wildfly WildFly 10 Spring Boot war Deployment Error org.apache.tomcat.websocket.WsWebSocketContainer cannot be cast to io.undertow.websockets.jsr.ServerWebSocketContainer

也可能与:

https://groups.google.com/a/apereo.org/forum/#!topic/cas-user/Buzbh5XpnlI https://docs.spring.io/spring-boot/docs/1.5.14.RELEASE/reference/htmlsingle/#howto-create-a-deployable-war-file

编辑:这是我的 POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd ">    
<modelVersion>4.0.0</modelVersion>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-overlay</artifactId>
<packaging>war</packaging>
<version>1.0</version>

<build>
    <plugins>
        <plugin>
            <groupId>com.rimerosolutions.maven.plugins</groupId>
            <artifactId>wrapper-maven-plugin</artifactId>
            <version>0.0.5</version>
            <configuration>
                <verifyDownload>true</verifyDownload>
                <checksumAlgorithm>MD5</checksumAlgorithm>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>$springboot.version</version>
            <configuration>
                <mainClass>$mainClassName</mainClass>
                <addResources>true</addResources>
                <executable>$isExecutable</executable>
                <layout>WAR</layout>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>



        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <warName>cas</warName>
                <failOnMissingWebXml>false</failOnMissingWebXml>
                <recompressZippedFiles>false</recompressZippedFiles>
                <archive>
                    <compress>false</compress>
                    <manifestFile>$manifestFileToUse</manifestFile>
                </archive>
                <overlays>
                    <overlay>
                        <groupId>org.apereo.cas</groupId>
                        <artifactId>cas-server-webapp$app.server</artifactId>
                    </overlay>
                </overlays>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
        </plugin>
    </plugins>
    <finalName>cas</finalName>
</build>

<properties>
    <cas.version>5.3.3</cas.version>
    <springboot.version>1.5.14.RELEASE</springboot.version>
    <!-- app.server could be -jetty, -undertow, -tomcat, or blank if you plan to provide appserver -->
    <!-- No ponemos ninguno, para desplegar en WildFly 10 -->
    <app.server></app.server>

    <mainClassName>org.springframework.boot.loader.WarLauncher</mainClassName>
    <isExecutable>false</isExecutable>
    <manifestFileToUse>$project.build.directory/war/work/org.apereo.cas/cas-server-webapp$app.server/META-INF/MANIFEST.MF</manifestFileToUse>

    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>


<profiles>
    <profile>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <id>default</id>
        <dependencies>
            <dependency>
                <groupId>org.apereo.cas</groupId>
                <artifactId>cas-server-webapp$app.server</artifactId>
                <version>$cas.version</version>
                <type>war</type>
                <scope>runtime</scope>
            </dependency>
             <!--
            ...Additional dependencies may be placed here...
            -->
            <!--
            For Wildfly deployment
             -->        

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>$springboot.version</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.apache.tomcat.embed</groupId>
                        <artifactId>tomcat-embed-websocket</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                    </exclusion>
                </exclusions>
             </dependency>               



        </dependencies>
    </profile>

    <profile>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <id>exec</id>
        <properties>
            <mainClassName>org.apereo.cas.web.CasWebApplication</mainClassName>
            <isExecutable>true</isExecutable>
            <manifestFileToUse></manifestFileToUse>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>com.soebes.maven.plugins</groupId>
                    <artifactId>echo-maven-plugin</artifactId>
                    <version>0.3.0</version>
                    <executions>
                        <execution>
                            <phase>prepare-package</phase>
                            <goals>
                                <goal>echo</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <echos>
                            <echo>Executable profile to make the generated CAS web application executable.</echo>
                        </echos>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

    <profile>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <id>bootiful</id>
        <properties>
            <app.server></app.server>
            <isExecutable>false</isExecutable>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.apereo.cas</groupId>
                <artifactId>cas-server-webapp$app.server</artifactId>
                <version>$cas.version</version>
                <type>war</type>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    </profile>

    <profile>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <id>pgp</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>com.github.s4u.plugins</groupId>
                    <artifactId>pgpverify-maven-plugin</artifactId>
                    <version>1.1.0</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>check</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <pgpKeyServer>hkp://pool.sks-keyservers.net</pgpKeyServer>
                        <pgpKeysCachePath>$settings.localRepository/pgpkeys-cache</pgpKeysCachePath>
                        <scope>test</scope>
                        <verifyPomFiles>true</verifyPomFiles>
                        <failNoSignature>false</failNoSignature>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

【问题讨论】:

你能提供你的pom.xml吗?您是否已将元素 &lt;app.server&gt;-tomcat&lt;/app.server&gt; 替换为 &lt;app.server&gt;&lt;/app.server&gt;?您没有在 tomcat 上部署 cas,因此这些元素不应存在。 谢谢,这是我尝试的第一件事,我取消了 app.server。我已经编辑了添加 pom.xml 的问题 我仍然可以在您的 pom &lt;app.server&gt;-tomcat&lt;/app.server&gt; properties 条目下看到。请问也可以去掉吗?如果你已经完成了,请忽略我的评论。 最后一件事。如果您还没有尝试过this thread 中提出的解决方法。 再次感谢,我尝试了这种解决方法,结果相同,异常相同。 【参考方案1】:

终于解决了。

CAS War 覆盖正在加载两个 jar,我无法排除将它们的依赖项标记为已提供。问题是这些 jars 来自 CAS 覆盖,它被复制到生成的战争的 WEB-INF/lib 中。

tomcat-embed-websocket-*.jar -> java.lang.ClassCastException WEB-INF/lib/log4j-slf4j-*.jar -> 记录相关异常

所以我使用排除将它们从生成的 jar 中排除。

https://maven.apache.org/plugins/maven-war-plugin/overlays.html

这是最终的 POM,可以在 Wildfly 上正确部署:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd ">    
<modelVersion>4.0.0</modelVersion>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-overlay</artifactId>
<packaging>war</packaging>
<version>1.0</version>    
<build>
    <plugins>           
        <!-- 
        <plugin>
            <groupId>com.rimerosolutions.maven.plugins</groupId>
            <artifactId>wrapper-maven-plugin</artifactId>
            <version>0.0.5</version>
            <configuration>
                <verifyDownload>true</verifyDownload>
                <checksumAlgorithm>MD5</checksumAlgorithm>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>$springboot.version</version>
            <configuration>
                <mainClass>$mainClassName</mainClass>
                <addResources>true</addResources>
                <executable>$isExecutable</executable>
                <layout>WAR</layout>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
         -->             

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <warName>cas</warName>
                <failOnMissingWebXml>false</failOnMissingWebXml>
                <recompressZippedFiles>false</recompressZippedFiles>
                <archive>
                    <compress>false</compress>
                    <manifestFile>$manifestFileToUse</manifestFile>
                </archive>
                <overlays>
                    <overlay>
                        <groupId>org.apereo.cas</groupId>
                        <artifactId>cas-server-webapp$app.server</artifactId>
                        <excludes>
                            <!-- Exclude these jars from the generated WAR:                                 
                             -->
                            <exclude>WEB-INF/lib/log4j-slf4j-*.jar</exclude>
                            <exclude>WEB-INF/lib/tomcat-embed-websocket-*.jar</exclude>
                        </excludes>
                    </overlay>
                </overlays>                    
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>                
        </plugin>
    </plugins>
    <finalName>cas</finalName>
</build>

<properties>
    <cas.version>5.3.3</cas.version>
    <springboot.version>1.5.14.RELEASE</springboot.version>
    <!-- app.server could be -jetty, -undertow, -tomcat, or blank if you plan to provide appserver -->        
    <app.server></app.server>

    <mainClassName>org.springframework.boot.loader.WarLauncher</mainClassName>       
    <isExecutable>false</isExecutable>
    <manifestFileToUse>$project.build.directory/war/work/org.apereo.cas/cas-server-webapp$app.server/META-INF/MANIFEST.MF</manifestFileToUse>

    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<!-- Corporate repositories -->

<dependencies>
    <dependency>
        <groupId>org.apereo.cas</groupId>
        <artifactId>cas-server-webapp$app.server</artifactId>
        <version>$cas.version</version>
        <type>war</type>
        <scope>runtime</scope>
    </dependency>

    <!--
      ...Additional dependencies may be placed here...
      -->                
 </dependencies>    
 </project>

【讨论】:

以上是关于java.lang.ClassCastException 在 Wildfly 10 上部署 CAS 5.3.3 Maven Overlay WAR的主要内容,如果未能解决你的问题,请参考以下文章