Java: Accessing properties file inside a war

2020-02-01 02:25发布

问题:

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?

Thank you

回答1:

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.



回答2:

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");


回答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.



回答4:

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.



回答5:

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?



回答6:

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">