I've solved part of the problem... or at least made it less
complicated (I hope). The ClassNotFound exception mentioned at the
bottom is due to the jackrabbit jars being located in server/lib as
opposed to common/lib. I'd placed them in server lib on the advice of
someone more familiar with jackrabbit than I. I'd assumed that, as
long as the jar was included in the web app, this would not be a
problem; obviously that was incorrect. So after putting jackrabbit
and its dependencies in common/lib, here's what I've got:
If the context for web-app only resources and environment variables
(jcr/model1Repository and testNum in the code below) are placed in
<Host><Context> in $TOMCAT_HOME/conf/server.xml, the web app is able
to find them.
If they are placed in the web-app's WEB-INF/context.xml, an exception
is thrown (javax.naming.NamingException: Cannot create resource
instance).
As the latter is definitely the preferred option (by tomcat
documentation and myself), I'd really like to get that to work. I've
also confirmed that I get the same errors on a newly downloaded and
configured Tomcat 5.5.15.
Mark
On Feb 13, 2006, at 6:23 PM, Mark Slater wrote:
I'm running Tomcat 5.5.9 with JVM 1.5.0_05-83 on MacOS X 10.4.4.
I'm trying to build an example webapp that shows the configuration
for two Jackrabbit resources: one configured as an embedded
resource for that web app and another configured as a shared
resource for the entire host. I've tried to define the resources in
a variety of places and haven't been able to get any of them to work.
My context files are defined like this....
$TOMCAT_HOME/conf/context.xml:
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
webapp/WEB-INF/context.xml:
<Context docBase="jackrabbit_config_test" reloadable="false">
<Resource name="jcr/model1Repository"
auth="Container"
type="javax.jcr.Repository"
factory="org.apache.jackrabbit.core.jndi.BindableRepositoryFactory"
configFilePath="conf/repository_model1.xml"
repHomeDir="shared/jackrabbit_model1" />
<Environment name="testNum" value="10"
type="java.lang.Integer" override="false"/>
</Context>
I've got the following setup in server.xml:
<GlobalNamingResources>
...
<Resource name="jcr/model2Repository"
auth="Container"
type="javax.jcr.Repository"
factory="org.apache.jackrabbit.core.jndi.BindableRepositoryFactory"
configFilePath="conf/repository_model2.xml"
repHomeDir="shared/jackrabbit_model2" />
</GlobalNamingResources>
And in my web.xml, I've got the following references:
<web-app>
...
<resource-ref>
<description>Jackrabbit Model 1 Repository</description>
<res-ref-name>jcr/model1Repository</res-ref-name>
<res-type>javax.jcr.Repository</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-env-ref>
<description>Jackrabbit Model 2 Repository</description>
<resource-env-ref-name>jcr/model2Repository</resource-env-
ref-name>
<resource-env-ref-type>javax.jcr.Repository</resource-env-
ref-type>
</resource-env-ref>
<resource-ref>
<description>Test Number</description>
<res-ref-name>testNum</res-ref-name>
<res-type>java.lang.Integer</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
I know tomcat is finding the jcr/model2Repository resource because
if I delete all of the database entries and repository files, and
then restart Tomcat, upon restart the database and repository files
are recreated. There's also log output in catalina.out about
jackrabbit initializing itself for the model2Repository.
When I get to my servlet, I've got some code that prints the
context entries for the initial context and the environment's
context to the output webpage. Then I try to access both
repositories. For good measure, I also try to access the testNum I
defined in my webapp's context.xml. None of the objects are
accessible. The locally defined objects (those in webapp/WEB-INF/
context.xml) throw an exception:
javax.naming.NamingException: Cannot create resource instance
at org.apache.naming.factory.ResourceEnvFactory.getObjectInstance
(ResourceEnvFactory.java:99)
at javax.naming.spi.NamingManager.getObjectInstance
(NamingManager.java:304)
at org.apache.naming.NamingContext.lookup(NamingContext.java:792)
at org.apache.naming.NamingContext.lookup(NamingContext.java:139)
at org.apache.naming.NamingContext.lookup(NamingContext.java:780)
at org.apache.naming.NamingContext.lookup(NamingContext.java:152)
at
edu.ucsc.whisper.jackrabbit_test.JackrabbitTest.getObjectFromContext
(JackrabbitTest.java:85)
at edu.ucsc.whisper.jackrabbit_test.JackrabbitTest.doGet
(JackrabbitTest.java:54)
The shared repository object (defined in the server.xml and global
context.xml) simply comes back null when I call context.lookup
( "jcr/model2Repository" ) without throwing an exception.
I tried moving the configuration in the {webapp}/WEB-INF/
context.xml to server.xml's <Host> section, as below:
<Context path="/jackrabbit_config_test"
docBase="jackrabbit_config_test">
<Resource name="jcr/model1Repository"
auth="Container"
type="javax.jcr.Repository"
factory="org.apache.jackrabbit.core.jndi.BindableRepositoryFactory"
configFilePath="conf/repository_model1.xml"
repHomeDir="shared/jackrabbit_model1" />
<Environment name="testNum" value="10"
type="java.lang.Integer" override="false"/>
</Context>
Doing this made the servlet able to find the testNum environment
variable and the jcr/model2Repository was still null. But accessing
jcr/model1Repository seems to be worse because I got a
ClassNotFound exception on
org.apache.jackrabbit.core.jndi.BindableRepositoryFactory calling
context.lookup() on it. But the jackrabbit.jar is in both {webapp}/
WEB-INF/lib and $TOMCAT_HOME/server/lib, so I don't know why the
factory wouldn't be found. And, in the logs when the server starts
using this configuration, the jcr/model2Repository is still getting
initialized. But even if this configuration did work, my
understanding is that with Tomcat 5.5, this is really *not* the
preferred way of handling web-app specific context data.
Other information that might be helpful. I've got log4j configured
for the server and my webapp to print out all logging info for the
jackrabbit project and no errors are being reported. I've tried
using just one of the repositories at a time (commenting the other
out) and even without the risk of them interfering with each other,
I get the same failures. I'm using maven's war target to build the
webapp.
I've spent most of the day trying to work this out, using the
Tomcat 5.5 docs, the jackrabbit web pages (where the format for the
resource came from), and some other webapps for reference and I'm
just about at my wits end. Any pointers or tips would be very
helpful and appreciated.
Thanks,
Mark
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]