如何解决Tomcat 9出现java.lang.ClassNotFoundException: waffle.apache.MixedAuthenticator问题
问题描述
使用Apache Tomcat 9运行Java项目,引入对应pom依赖后启动Tomcat服务器时出现报错,Apache Tomcat 7下未遇到该问题,切换到Tomcat 9后触发问题,报错指向lib文件夹下的apache tomcat util jar包。
使用的Pom文件如下
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>AMS</groupId> <artifactId>AMS</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>webservice_app</name> <url>Welcome to Apache Maven</url> <dependencies> <!-- https://mvnrepository.com/artifact/org.json/json --> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20140107</version> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/jcl-over-slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>2.0.0-alpha1</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.mail/mail --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc --> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>9.4.0.jre16</version> </dependency> <!-- https://mvnrepository.com/artifact/com.github.waffle/waffle-jetty --> <dependency> <groupId>com.github.waffle</groupId> <artifactId>waffle-jetty</artifactId> <version>1.9.1</version> <scope>runtime</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.github.waffle/waffle-shiro --> <dependency> <groupId>com.github.waffle</groupId> <artifactId>waffle-shiro</artifactId> <version>3.0.0</version> <scope>runtime</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.github.waffle/waffle-spring-security4 --> <dependency> <groupId>com.github.waffle</groupId> <artifactId>waffle-spring-security4</artifactId> <version>1.8.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.webjars/jquery --> <dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>3.6.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.webjars/datatables --> <dependency> <groupId>org.webjars</groupId> <artifactId>datatables</artifactId> <version>1.11.3</version> </dependency> <!-- https://mvnrepository.com/artifact/com.google.guava/guava --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.0.1-jre</version> </dependency> <!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna --> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.10.0</version> </dependency> <!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform --> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>5.10.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>2.0.0-alpha1</version> </dependency> <!-- https://mvnrepository.com/artifact/com.github.waffle/waffle-jna --> <dependency> <groupId>com.github.waffle</groupId> <artifactId>waffle-jna</artifactId> <version>3.0.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.github.waffle/waffle-tomcat9 --> <dependency> <groupId>com.github.waffle</groupId> <artifactId>waffle-tomcat9</artifactId> <version>3.0.0</version> <scope>runtime</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> </plugin> </plugins> <finalName>${project.artifactId}</finalName> </build> </project>
错误堆栈信息如下
Nov 23, 2021 1:29:09 PM org.apache.tomcat.util.digester.Digester startElement SEVERE: Begin event threw exception java.lang.ClassNotFoundException: waffle.apache.MixedAuthenticator at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:433) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:586) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519) at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:104) at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1293) at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:518) at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1386) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2725) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:541) at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888) at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824) at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1224) at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:635) at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1551) at org.apache.catalina.startup.Catalina.parseServerXml(Catalina.java:617) at org.apache.catalina.startup.Catalina.load(Catalina.java:709) at org.apache.catalina.startup.Catalina.load(Catalina.java:746) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:302) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:472) Nov 23, 2021 1:29:09 PM org.apache.catalina.startup.Catalina parseServerXml WARNING: Unable to load server configuration from [C:\Users\tangudan\OtherProjects\AMS\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf\server.xml] org.xml.sax.SAXParseException; systemId: file:/C:/Users/tangudan/OtherProjects/AMS/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/conf/server.xml; lineNumber: 157; columnNumber: 149; Error at line [157] column [149]: [waffle.apache.MixedAuthenticator] at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:1982) at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2014) at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1296) at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:518) at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1386) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2725) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:541) at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888) at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824) at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1224) at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:635) at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1551) at org.apache.catalina.startup.Catalina.parseServerXml(Catalina.java:617) at org.apache.catalina.startup.Catalina.load(Catalina.java:709) at org.apache.catalina.startup.Catalina.load(Catalina.java:746) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:302) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:472) Caused by: java.lang.ClassNotFoundException: waffle.apache.MixedAuthenticator at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:433) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:586) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519) at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:104) at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1293) ... 21 more Nov 23, 2021 1:29:09 PM org.apache.catalina.startup.Catalina start SEVERE: Cannot start server, server instance is not configure
解决建议
- 统一所有waffle相关依赖的版本:当前pom中waffle各组件版本混乱(waffle-jetty为1.9.1、waffle-shiro为3.0.0、waffle-spring-security4为1.8.2),版本不一致会导致类缺失、逻辑冲突,将所有waffle相关依赖统一为3.0.0版本即可。
- 调整waffle依赖的加载方式:Tomcat加载server.xml配置时使用自身的类加载器,不会读取项目WAR包内WEB-INF/lib下的依赖,因此需要将waffle-tomcat9、waffle-jna、jna、jna-platform这几个包放到Tomcat安装目录的lib文件夹下,同时在pom中将这几个依赖的scope改为
provided,避免打包到WAR包内引发重复加载冲突。 - 修正server.xml中的类全限定名:waffle 3.x版本适配Tomcat9的MixedAuthenticator类路径已调整为
waffle.apache.tomcat9.MixedAuthenticator,旧版本的waffle.apache.MixedAuthenticator在3.x版本中已不存在,将server.xml中对应配置的类路径修改为正确路径即可。 - 修正JDBC驱动版本匹配问题:当前项目编译运行的JDK版本为1.8,但依赖的mssql-jdbc为适配JRE16的9.4.0.jre16版本,建议替换为适配JRE8的9.4.0.jre8版本,避免JDBC相关兼容性问题。
内容的提问来源于stack exchange,提问作者Anudeep Tangudu
相关产品推荐
相关产品推荐

