简体   繁体   English

自定义Tomcat领域:ClassNotFoundException

[英]Custom Tomcat Realm : ClassNotFoundException

I am using the Eclipse Virgo (3.6.1) OSGi container, which runs on Tomcat 7.0.31. 我正在使用在Tomcat 7.0.31上运行的Eclipse Virgo(3.6.1)OSGi容器。 I am attempting to implement a custom authentication realm according to the Tomcat documentation , but I am running into a ClassNotFoundException when attempting to start up the server. 我正在尝试根据Tomcat文档实现自定义身份验证领域,但是在尝试启动服务器时遇到了ClassNotFoundException

My realm implementation is very simple; 我的领域实现非常简单; it simply extends JDBCRealm and overrides the authenticate method. 它只是扩展了JDBCRealm并覆盖了authenticate方法。 As per the documentation, I compiled this class into a jar, titled com.authentication.MyCustomRealm.jar , and placed it in $SERVER_HOME/lib. 根据文档,我将该类编译到一个名为com.authentication.MyCustomRealm.jar的jar中,并将其放置在$ SERVER_HOME / lib中。

The configuration I added to tomcat-server.xml is as follows: 我添加到tomcat-server.xml的配置如下:

<Realm className="com.authentication.MyCustomRealm"
  resourceName="Custom Realm"
  driverName="{jdbc.driverClassName}"
  dbConnectionName="{jdbc.username}"
  dbConnectionPassword="{jdbc.password}"
  dbConnectionURL="{jdbc.url}"
  userTable="USER_DATA"
  userNameCol="ID" />
</Realm>

Here is a partial stack trace: 这是部分堆栈跟踪:

org.xml.sax.SAXParseException: Error at (103, 40) : com.authentication.MyCustomRealm
    at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2687)
    at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2719)
    at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1279)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:506)
    at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:182)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1303)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2717)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
    at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1556)
    at org.eclipse.gemini.web.tomcat.internal.OsgiAwareEmbeddedTomcat.configure(OsgiAwareEmbeddedTomcat.java:309)
    ... 42 common frames omitted com.authentication.MyCustomRealm 
    at org.eclipse.gemini.web.tomcat.internal.loading.ChainedClassLoader.doLoadClass(ChainedClassLoader.java:181)
    at org.eclipse.gemini.web.tomcat.internal.loading.ChainedClassLoader.loadClass(ChainedClassLoader.java:164)
    at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:144)
    at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1276)

Caused by: java.lang.ClassNotFoundException: com.authentication.MyCustomRealm
    at org.eclipse.gemini.web.tomcat.internal.loading.ChainedClassLoader.doLoadClass(ChainedClassLoader.java:181)
    at org.eclipse.gemini.web.tomcat.internal.loading.ChainedClassLoader.loadClass(ChainedClassLoader.java:164)
    at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:144)
    at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1276)
    ... 55 common frames omitted

I am suspecting there is something special I need to do with my OSGi configuration in order for the class to be found, but I'm not sure exactly what that is. 我怀疑要对OSGi配置进行某些特殊处理才能找到该类,但是我不确定到底是什么。

From the stack trace, I discovered that the org.eclipse.gemini.web.tomcat bundle was attempting to load my custom realm. 从堆栈跟踪中,我发现org.eclipse.gemini.web.tomcat捆绑包正在尝试加载我的自定义领域。 My solution was to create a new fragment bundle that uses org.eclipse.gemini.web.tomcat as a host. 我的解决方案是创建一个使用org.eclipse.gemini.web.tomcat作为主机的新片段捆绑包。 I placed my custom realm in this bundle, which resolved this exception. 我将我的自定义领域放在该捆绑包中,此捆绑包解决了此异常。

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

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