简体   繁体   中英

Making an open source Java webapp easy to install and deploy on Tomcat, Jetty etc

I'm distributing a simple Java webapp as open source. The webapp needs to be configured before it can be run – a configuration file needs to be created, and the location of that configuration file needs to be made known to the webapp as a parameter in web.xml .

Now my question is how to best package and distribute the webapp in order to make it easy to install, and how to describe that installation process in the documentation. The options I can think of are:

  • Distribute the webapp as a WAR archive. Recommend that users deploy the WAR into their Tomcat/Jetty/whatever, then drop their configuration file into /webapps/ myapp /WEB-INF , and modify /webapps/ myapp /WEB-INF/web.xml accordingly
  • Distribute the webapp as source. Recommend that users should drop their configuration file into the /src/main/webapp/WEB-INF folder, then modify their /src/main/webapp/WEB-INF/web.xml accordingly, then build a WAR using Ant or Maven, and deploy that into their servlet container.

There are probably other options that I can't think of.

What setup is likely to be most convenient to users that need to install, configure and deploy the webapp?

Edit: I should add that the configuration file isn't just a few lines – it's a large file that contains a database schema and other stuff and is potentially generated using an external editor; so just providing good defaults isn't an option.

Externalize this configuration and maybe provide some default values. If you make a new version of your app, everybody will have to remember to back-up that configuration file, then redeploy and then copy back that file--> this is a nightmare.

There are many ways to put that configuration somewhere else. You can use Java Preferences for example.

I would say the WAR, although not requiring the configuration would likely be more convenient :)

What is it, loosely, that must be configured such that there isn't a sensible default value for everyone? URL string?

Providing an answer of my own, after more reading on the issue: JNDI seems to be the “official”, although somewhat heavyweight, way of solving this. With JNDI, a configuration option (like the location of the full config file I need) can be declared in the web.xml , and its actual value can be set in a per-webapp context.xml that lives in the /webapps directory of Tomcat (or the /contexts directory of Jetty). This setup has a bunch of advantages:

  • The big configuration file can live outside of the servlet container and webapp
  • The webapp can be updated without danger of losing the configuration
  • The distributed war doesn't need to be modified or rebuilt

Downside: It's sort of complicated, requires messing around with XML, and configuring JNDI on Tomcat works differently from Jetty (requiring twice as much documentation).

Maybe use a system property for the config file location. Can easily be passed on the command line as -Dorg.example.config.file=/foo/bar , in startup scripts or in Java code. I think I've seen some tools, eg logging frameworks, use system properties for similar things in webapps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM