getResourceAsStream() problem

  • Follow


Hello, I have a problem with getResourceAsStream().

I'm using these tools: Eclipse JEE edition version 3.5.1 with the Apache 
CXF plugin and Apache Tomcat version 6.0.20. Java is version 6. This is 
under Windows.

I've written a very simple JAX-WS web service, here's the complete code:

package bioweb;

import java.rmi.Remote;
import java.rmi.RemoteException;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService(name="BioWebInterface", targetNamespace="http://bioweb/")
public interface BioWebInterface extends Remote {	
    @WebMethod(operationName="sayHello", action="urn:SayHello")
    public String sayHello() throws RemoteException;
}

package bioweb;

import java.io.InputStream;
import java.rmi.RemoteException;

import javax.annotation.PostConstruct;
import javax.jws.WebService;

@WebService(targetNamespace="http://bioweb/", 
endpointInterface="bioweb.BioWebInterface", portName="BioWebPort", 
serviceName="BioWebService")
public class BioWeb implements BioWebInterface {

    @Override
    public String sayHello() throws RemoteException {
       return "Hello from the BioWeb Web Service!";
    }
	
	
    @PostConstruct
    protected void init() {
       System.out.println("I'm in the postconstruct method.");

       InputStream is1 = 		 
getClass().getClassLoader().getResourceAsStream("get-all-model-links.xquery");
       InputStream is2 =	 
BioWeb.class.getClassLoader().getResourceAsStream("get-all-model-links.xquery");
		
       if (is1 != null && is2 != null) {
          System.out.println("Successfully loaded resource using both 
methods!");
       }
       else if (is1 != null) {
          System.out.println("Successfully loaded resource using method 
1.");
       }
       else if (is2 != null) {
          System.out.println("Successfully loaded resource using method 
2.");
       }
       else {
          System.err.println("Not successful at all in loading the 
resource!");
       }
    }

	
    /**
     * @param args
     */
    public static void main(String[] args) {
       new BioWeb().init();
    }
}

I've created folder called xqueries and added it to the classpath (under 
project properties->java build path->libraries tab->add class folder 
button and in it I have an XQuery file named get-all-model-links.xquery 
(will be lots more later).

When I run the BioWeb class like a normal Java program (by invoking 
main(), which calls init(), I can load the XQuery resource fine, the 
output is:
I'm in the postconstruct method.
Successfully loaded resource using both methods!

However, when run as a service (then Tomcat calls the init() method due 
to its @PostConstruct annotation), the loading of the resource fails. 
The output is:
I'm in the postconstruct method.
Not successful at all in loading the resource!

It seems that the class folder I added isn't visible anymore or maybe 
the "URL:s" need to be altered when in this context. I'm very new at 
this web stuff and I need help, I've had this problem for two days now. :(
I'm doing all the interfacing with Tomcat via Eclipse btw, and I haven't 
really tampered with any settings for it.

Thanks for reading and for any replies!

- Fencer
0
Reply Fencer 1/27/2010 3:02:08 PM

On 2010-01-27 16:02, Fencer wrote:
> Hello, I have a problem with getResourceAsStream().
[snip my OP]

I believe I solved this problem!

- Fencer
0
Reply Fencer 1/27/2010 3:48:11 PM


On 1/27/2010 7:48 AM, Fencer wrote:
> On 2010-01-27 16:02, Fencer wrote:
>> Hello, I have a problem with getResourceAsStream().
> [snip my OP]
>
> I believe I solved this problem!
It is often considered courteous to explain how you solved your problem.

Others may find your post while looking into a similar problem, and 
would benefit from your explanation.
-- 
Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>
0
Reply Daniel 1/27/2010 6:17:05 PM

Fencer wrote:
> Hello, I have a problem with getResourceAsStream().
>
> [snip my OP]
>
> I believe I solved this problem!
>

Thank you so much for sharing the solution so that others besides
yourself may benefit!

--
Lew
0
Reply Lew 1/27/2010 8:00:12 PM

On Wed, 27 Jan 2010 16:48:11 +0100, Fencer
<no.i.dont@want.mail.from.spammers.com> wrote, quoted or indirectly
quoted someone who said :

>
>I believe I solved this problem!

Some day someone will have the same problem as you, find you question
in Google then curse you for refusing to share your solution.

-- 
Roedy Green Canadian Mind Products
http://mindprod.com
Computers are useless. They can only give you answers. 
~ Pablo Picasso (born: 1881-10-25 died: 1973-04-08 at age: 91)
0
Reply Roedy 1/28/2010 6:14:15 AM

On 2010-01-27 16:48, Fencer wrote:
> On 2010-01-27 16:02, Fencer wrote:
>> Hello, I have a problem with getResourceAsStream().
> [snip my OP]
>
> I believe I solved this problem!
>
> - Fencer

Hello again. I wish to offer my sincere apologies for not specifying the 
details of my solution in my previous post.

The problem turned out to be not in the actual Java code but in how I 
was using my tools. Adding a directory to the classpath in the Eclipse 
project settings didn't propagate to Tomcat in my context. What I did 
was to add the directory to the classpath to Tomcat's launch 
configuration under Eclipse. That solved it!

If you you doubleclick on the Tomcat server under the Server tab (in the 
window that usually holds tabs like console, problems etc, I'm not sure 
what it's called), an "Overview" of settings should open. There's a link 
there "Open Launch Configuration" which opens a configuration dialog. 
The dialog has a tab called "classpath" and you can add your entry 
there, under "User Entries".

Again, I apologise for not writing this the first time around and thanks 
to those who reminded me to do so.

- Fencer
0
Reply Fencer 1/28/2010 3:26:34 PM

On Jan 28, 10:26=A0am, Fencer <no.i.d...@want.mail.from.spammers.com>
wrote:
> On 2010-01-27 16:48, Fencer wrote:
>
> > On 2010-01-27 16:02, Fencer wrote:
> >> Hello, I have a problem with getResourceAsStream().
> > [snip my OP]
>
> > I believe I solved this problem!
>
> > - Fencer
>
> Hello again. I wish to offer my sincere apologies for not specifying the
> details of my solution in my previous post.
>
> The problem turned out to be not in the actual Java code but in how I
> was using my tools. Adding a directory to the classpath in the Eclipse
> project settings didn't propagate to Tomcat in my context. What I did
> was to add the directory to the classpath to Tomcat's launch
> configuration under Eclipse. That solved it!
>
> If you you doubleclick on the Tomcat server under the Server tab (in the
> window that usually holds tabs like console, problems etc, I'm not sure
> what it's called), an "Overview" of settings should open. There's a link
> there "Open Launch Configuration" which opens a configuration dialog.
> The dialog has a tab called "classpath" and you can add your entry
> there, under "User Entries".
>

You're supposed to include libraries needed by a web app in the "lib/"
directory of the web app.

You shouldn't entirely depend on the IDE to specify a class path.  You
should be able to deploy the application from the command line.

--
Lew
0
Reply Lew 1/28/2010 7:29:57 PM

On 2010-01-28 20:29, Lew wrote:
>>
>
> You're supposed to include libraries needed by a web app in the "lib/"
> directory of the web app.
>
> You shouldn't entirely depend on the IDE to specify a class path.  You
> should be able to deploy the application from the command line.

Thanks for your reply, Lew, and you make a dood point. There are several 
jar-files in my WebContent->WEB-INF->lib folder, but if I put my XQuery 
file in there, getResourceAsStream() doesn't find it :(

If I could make it work without adding a directory to classpath like I'm 
doing that would be even better!

- Fencer
0
Reply Fencer 1/28/2010 7:51:01 PM

Fencer wrote:
> Thanks for your reply, Lew, and you make a dood point. There are several 
> jar-files in my WebContent->WEB-INF->lib folder, but if I put my XQuery 
> file in there, getResourceAsStream() doesn't find it :(
> 
> If I could make it work without adding a directory to classpath like I'm 
> doing that would be even better!

There are already several directories in your class path for a web app.

Is your "XQuery file" a JAR?  No?  Then it doesn't go in the "lib/" directory.

The root directory of your application ("application-name/") and the classes 
directory ("application-name/WEB-INF/classes/") are already in your path.  Put 
your resource relative to one of those.

-- 
Lew
0
Reply Lew 1/29/2010 3:11:19 AM

On Thu, 28 Jan 2010 16:26:34 +0100, Fencer
<no.i.dont@want.mail.from.spammers.com> wrote, quoted or indirectly
quoted someone who said :

>
>Again, I apologise for not writing this the first time around and thanks 
>to those who reminded me to do so.

Thank you for sharing your solution rather than getting defensive as a
normal person would.
-- 
Roedy Green Canadian Mind Products
http://mindprod.com
Computers are useless. They can only give you answers. 
~ Pablo Picasso (born: 1881-10-25 died: 1973-04-08 at age: 91)
0
Reply Roedy 1/29/2010 6:16:18 AM

On 2010-01-29 04:11, Lew wrote:
> Fencer wrote:
>> Thanks for your reply, Lew, and you make a dood point. There are
>> several jar-files in my WebContent->WEB-INF->lib folder, but if I
>> put my XQuery file in there, getResourceAsStream() doesn't find it
>> :(
>>
>> If I could make it work without adding a directory to classpath
>> like I'm doing that would be even better!
>
> There are already several directories in your class path for a web
> app.
>
> Is your "XQuery file" a JAR? No? Then it doesn't go in the "lib/"
> directory.

No, it's a text file containing code written in the XQuery (an XML query
language), I should have detailed that better in my OP. That's why I
didn't put it in the lib directory (however, I did put the Saxon 
jar-file there which I use for running XQuery).

>
> The root directory of your application ("application-name/") and the
>  classes directory ("application-name/WEB-INF/classes/") are already
> in your path. Put your resource relative to one of those.
>

I can't check right now but I believe I already put the file in the 
project root but I still couldn't load it. I will try again a little later.

Can I get runtime information on which directories are in the classpath?

- Fencer
0
Reply Fencer 1/29/2010 10:32:22 AM

Fencer wrote:
> On 2010-01-29 04:11, Lew wrote:
>> Fencer wrote:
>>> Thanks for your reply, Lew, and you make a dood point. There are
>>> several jar-files in my WebContent->WEB-INF->lib folder, but if I
>>> put my XQuery file in there, getResourceAsStream() doesn't find it
>>> :(
>>>
>>> If I could make it work without adding a directory to classpath
>>> like I'm doing that would be even better!
>>
>> There are already several directories in your class path for a web
>> app.
>>
>> Is your "XQuery file" a JAR? No? Then it doesn't go in the "lib/"
>> directory.
>
> No, it's a text file containing code written in the XQuery (an XML
> query language), I should have detailed that better in my OP. That's
> why I didn't put it in the lib directory (however, I did put the 
> Saxon
> jar-file there which I use for running XQuery).
>
>>
>> The root directory of your application ("application-name/") and 
>> the
>>  classes directory ("application-name/WEB-INF/classes/") are 
>> already
>> in your path. Put your resource relative to one of those.
>>
>
> I can't check right now but I believe I already put the file in the
> project root but I still couldn't load it. I will try again a little
> later.

I don't think the project root is in the classpath.   The normal wasy 
to make a resource available is

1. Put it below WEB-INF/classes, e.g. a resource named a/b/c.xml would 
go at WEB-INF/classes/a/b/c.xml
2. Put it into a jar file, and put the jar file into WEB-INF/lib 


0
Reply Mike 1/29/2010 11:15:36 AM

Mike Schilling wrote:
> I don't think the project root is in the classpath.   The normal wasy 
> to make a resource available is

Depends on which of the three types of 'getResource*' methods you use.  Those 
in 'javax.servlet.ServletContext' include the project root.

-- 
Lew
0
Reply Lew 1/29/2010 1:43:41 PM

Lew wrote:
> Mike Schilling wrote:
>> I don't think the project root is in the classpath.   The normal 
>> wasy
>> to make a resource available is
>
> Depends on which of the three types of 'getResource*' methods you
> use.  Those in 'javax.servlet.ServletContext' include the project
> root.

That you need to call a method on a completely different class is a 
critical bit of information to omit.  And it remains true that the 
project root is not in the classpath. 


0
Reply Mike 1/29/2010 7:22:53 PM

In article <hjuome$p2l$1@news.albasani.net>, Lew <noone@lewscanon.com> 
wrote:

> Mike Schilling wrote:
> > I don't think the project root is in the classpath.   The normal wasy 
> > to make a resource available is
> 
> Depends on which of the three types of 'getResource*' methods you use.  Those 
> in 'javax.servlet.ServletContext' include the project root.

In this context, does "three types" mean those "getResource*" methods 
found in java.lang, java.beans.beancontext, and javax.servlet?

-- 
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>
0
Reply John 1/29/2010 8:19:45 PM

John B. Matthews wrote:
> In article <hjuome$p2l$1@news.albasani.net>, Lew <noone@lewscanon.com> 
> wrote:
> 
>> Mike Schilling wrote:
>>> I don't think the project root is in the classpath.   The normal wasy 
>>> to make a resource available is
>> Depends on which of the three types of 'getResource*' methods you use.  Those 
>> in 'javax.servlet.ServletContext' include the project root.
> 
> In this context, does "three types" mean those "getResource*" methods 
> found in java.lang, java.beans.beancontext, and javax.servlet?

Four!

I had in mind Class, ClassLoader and ServletContext.  Packages don't have methods.

-- 
Lew
0
Reply Lew 1/29/2010 11:56:12 PM

On 29-01-2010 18:56, Lew wrote:
> John B. Matthews wrote:
>> In article <hjuome$p2l$1@news.albasani.net>, Lew <noone@lewscanon.com>
>> wrote:
>>> Mike Schilling wrote:
>>>> I don't think the project root is in the classpath. The normal wasy
>>>> to make a resource available is
>>> Depends on which of the three types of 'getResource*' methods you
>>> use. Those in 'javax.servlet.ServletContext' include the project root.
>>
>> In this context, does "three types" mean those "getResource*" methods
>> found in java.lang, java.beans.beancontext, and javax.servlet?
>
> Four!
>
> I had in mind Class, ClassLoader and ServletContext. Packages don't have
> methods.

No, but you know perfectly well what he means.

Arne

0
Reply UTF 1/30/2010 12:00:03 AM

John B. Matthews wrote:
>>> In this context, does "three types" mean those "getResource*" methods
>>> found in java.lang, java.beans.beancontext, and javax.servlet?

Lew wrote:
>> Four!
>>
>> I had in mind Class, ClassLoader and ServletContext. Packages don't have
>> methods.

Arne Vajhøj wrote:
> No, but you know perfectly well what he means.

And answered what he intended to say.  What's your problem?

-- 
Lew
0
Reply Lew 1/30/2010 12:12:45 AM

In article <hjvtht$qpt$3@news.albasani.net>, Lew <noone@lewscanon.com> 
wrote:

> John B. Matthews wrote:
> >>> In this context, does "three types" mean those "getResource*" 
> >>> methods found in java.lang, java.beans.beancontext, and 
> >>> javax.servlet?
> 
> Lew wrote:
> >> Four!
> >>
> >> I had in mind Class, ClassLoader and ServletContext. Packages 
> >> don't have methods.
> 
> Arne Vajhøj wrote:
> > No, but you know perfectly well what he means.
> 
> And answered what he intended to say.  What's your problem?

I thank you both for clearing that up. I had tried asterisks as 
wildcards, but the meaning was even less clear.

I was intrigued by how the three packages implement the notion of 
getting a resource: ClassLoader is foundational, while the bean approach 
"allows a BeanContext implementation to interpose behavior between the 
child Component and underlying ClassLoader." The ServletContext 
implementation "does not use class loaders" at all but serves a similar 
purpose relative to the servlet container's context.

This seems like a handy pattern to put in one's hip pocket.

-- 
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>
0
Reply John 1/30/2010 1:10:48 AM

On 29-01-2010 19:12, Lew wrote:
> John B. Matthews wrote:
>>>> In this context, does "three types" mean those "getResource*" methods
>>>> found in java.lang, java.beans.beancontext, and javax.servlet?
>
> Lew wrote:
>>> Four!
>>>
>>> I had in mind Class, ClassLoader and ServletContext. Packages don't have
>>> methods.
>
> Arne Vajhøj wrote:
>> No, but you know perfectly well what he means.
>
> And answered what he intended to say. What's your problem?

I don't think there were any reason to point out the obvious.

Arne

0
Reply UTF 1/30/2010 3:10:56 AM

19 Replies
467 Views

(page loaded in 0.01 seconds)

Similiar Articles:


















7/26/2012 9:09:38 PM


Reply: