12

I already searched StackOverflow for "properties inside war", but none of the results worked for my case.

I am using Eclipse Galileo and GlassFish v3 to develop a set of web services. I am using a "dynamic web project" with the following structure

Src
-java_code_pkg_1
-java_code_pkg_2
-com.company.config
--configfile.properties WebContent
-META-INF
-WEB-INF
--log4jProperties
--web.xml
--applicationContext.xml
--app-servlet.xml

I want to access the "configfile.properties" inside one of the source files in "java_code_pkg1". I am using the Spring Framework and this file will be instantiated once the application starts on the server.

I have tried the following with no luck

getResourceAsStream("/com.company.config/configfile.properties");
getResourceAsStream("/com/company/config/configfile.properties");
getResourceAsStream("com/company/config/configfile.properties");
getResourceAsStream("/configfile.properties");
getResourceAsStream("configfile.properties");

getResourceBundle(..) didn't work either.

Is it possible to access a file when it's not under the WEB-INF/classes path? if so then how?

İsmail Y.
  • 3,579
  • 5
  • 21
  • 29
del.ave
  • 1,888
  • 5
  • 17
  • 23

6 Answers6

11
Properties props = new Properties();
props.load(this.getClass().getResourceAsStream("/com/company/config/file.properties"));

works when I'm in debug mode. I can see the values in the debugger, but I get a NullPointerException right after executing the "props.load" line and before going into the light below it.

That's a different issue. At least now I know this is the way to access the config file.

Thank you for your help.

jmj
  • 237,923
  • 42
  • 401
  • 438
del.ave
  • 1,888
  • 5
  • 17
  • 23
7

If you are in a war, your classpath "current directory" is "WEB-INF/classes". Simply go up two levels.

getResourceAsStream("../../com/company/config/configfile.properties");

It is horrible but it works. At least, it works under tomcat, jboss and geronimo and It works today.

P.S. Your directory structure is not very clear. Perhaps it is:

getResourceAsStream("../../com.company.config/configfile.properties");
andcoz
  • 2,202
  • 15
  • 23
  • Thanks for the hack. Worked well for having a war file load a properties file located in the containing ear. Any suggestions for loading property files located in a sibling war file with an indeterminate full name? – Snekse Aug 13 '13 at 23:10
  • Mumble, I suppose you can not. The application server should isolate wars from each other and it should not let you to access a file in a sibling war. Obviously ways to circumvent or relax the AS security policies exist but they are AS dependent. – andcoz Aug 15 '13 at 16:49
3

Check the location of the properties file in WAR file. If it is in WEB-INF/classes directory under com/company/config directory getResourceAsStream("com/company/config/configfile.properties") should work or getResourceAsStream(" This should work if the config file is not under WEB-INF/classes directoy

Also try using getClass().getClassLoader().getResourceAsStream.

Rajendra
  • 1,703
  • 2
  • 16
  • 22
1

Are you sure the file is being included in your war file? A lot of times, the war build process will filter out non .class files.

corsiKa
  • 81,495
  • 25
  • 153
  • 204
0

What is the path once it is deployed to the server? It's possible to use Scanner to manually read in the resource. From a java file within a package, creating a new File("../applications/") will get you a file pointed at {glassfish install}\domains\{domain name}\applications. Maybe you could alter that file path to direct you to where you need to go?

Dorrene Brown
  • 619
  • 1
  • 6
  • 13
0

Since you are using Spring, then use the Resource support in Spring to inject the properties files directly.

see http://static.springsource.org/spring/docs/3.0.x/reference/resources.html

Even if the class that requires the properties file is not Spring managed, you can still get access to the ApplicationContext and use it to load the resource

resource would be something like, classpath:settings.properties, presuming that your properties file got picked up by your build and dropped in the war file.

You can also inject directly, from the docs:

<property name="template" value="classpath:some/resource/path/myTemplate.txt">
Al Baker
  • 524
  • 2
  • 3