Ich verwende hsql als Datenbank-Backend und ich möchte JDBCRealm für Authentifizierung/Autorisierung konfigurieren. Ich benutze IntelliJ für die Entwicklung und Bereitstellung und Tomcat 7.Tomcat JDCBRealm findet keine Treiberklasse
Dies ist mein context.xml
:
<Context antiJARLocking="true">
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="org.hsqldb.jdbcDriver"
connectionURL="jdbc:hsqldb:hsql://localhost"
userTable="customers" userNameCol="username" userCredCol="password"
userRoleTable="roles" roleNameCol="role_name"/>
</Context>
und ich habe hsqldb als Bibliothek hinzugefügt:
Als ich Wenn Sie die Anwendung bereitstellen, findet JDBCRealm den hinzugefügten Treiber nicht:
Caused by: java.lang.ClassNotFoundException: org.hsqldb.jdbcDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:195)
at org.apache.catalina.realm.JDBCRealm.open(JDBCRealm.java:688)
Aber um sicherzustellen, dass die aformentioned Klasse richtig geladen werden kann, habe ich diesen Schnipsel:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Class foo = Class.forName("org.hsqldb.jdbcDriver");
System.out.println("This is working!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
Wie es erwartet wird, durch die richtige URL im Servlet resultierenden anfordernden ausgeführt werden, wobei die Server drucken This is working
anzeigt, dass die Klasse, die JDBCRealm
nicht gefunden hat, ist richtig geladen.
Irgendeine Idee, was das Problem ist? Ich habe nur zwei Hinweise, die vielleicht relevant (oder möglicherweise irrelevant!):
- einige meiner zusätzlichen Bibliotheken
hsql
einschließlich nicht hinzugefügttarget/WEB-INF/lib
:
Aber die Frage ist, : Wenn es nicht als Bibliothek im Ziel hinzugefügt wurde, also wie das vorherige Snippet funktionierte?
Umgehung
Obwohl ich keine Ahnung, warum JDBCRealm
nicht die HSQLDriver
findet, sondern durch seine JAR-Datei /var/lib/tomcat7/lib
Kopieren wo einer der Orte ist, die Lasten JARS catalina, wurde das Problem gelöst. Aber es ist immer noch ein Rätsel für mich, wie ich das Problem auf eine normale Art und Weise beheben kann.