I'm just wondering whether to keep some of my variables in Constants class or keep it in web.xml

Say, I want to keep a variable of Facebook graph API prefix or api_key, client_id

From my understand, the difference between Constants.java and web.xml is web.xml is easier to rewrite on compile using ant.

So, you can replace your variables in web.xml according to what environment you are building you app for. (client_id varies by development environment/production environment, for example)

If I understand it right, then Facebook graph API prefix should be kept in Constants.java (because it always is "https://graph.facebook.com/") and api_key, client_id should be kept in web.xml?

What's the proper way to use them?


In your scenario, these values are best kept in properties file. Create a properties file in classpath and read it at your application startup to instantiate the values. Or you can read them fresh for each request, if they tends to change. Java provides very easy way for reading/writing properties file with Properties class.

You can also externalize the properties file if you want. i.e. put them into user home directory to make them completely independent. Think of it, when you change the value and the running application takes the new value without re-build or even re-deployment.

  • Thank you. Keeping all of them in one properties file seems to be a good way to handle them. We can have a properties file for each environment and have the application choose properties file based on environment it is running on. – Pongsakorn Semsuwan Nov 7 '12 at 7:08

Well it really depends on how really "constant" they are:

  • if they're true constants that never ever change, not when you change the deployment environment (integration, production, etc.), not when you deploy it at your client's side, than it's perfectly sensible to keep them as Java constants (final fields) in some Java class.

  • if they change with environment, having them as Java constants is obviously bad. Putting them in web.xml is somewhat better, but you'll still have to change something in your project to redeploy to a different environment. What I like to do in these situations is pass the values as system properties. Your app should have a generic "Config" class which is able to recuperate the value of a system property given it's name (via System.getProperty("propName")) and then configure my environment with specific values for those properties (via .bashrc, or via Web App Server start-up arguments).

  • Thank you. This gives me a better understand of using them. :) – Pongsakorn Semsuwan Nov 7 '12 at 7:07

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.