> The DTD/schema for web.xml files is not small (e.g. 
> http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd).  Rather than offering a 
> transliteration of a subset of web.xml's elements into sexprs, perhaps it 
> would be better to be able to control your web.xml directly, and have 
> lein-ring use it when it's present rather than generating one.

Much better idea :)

Allen

> Just a thought from the suffering equine department. :-)
>
> - Chas
>
> On May 23, 2011, at 8:48 PM, Allen Johnson wrote:
>
>> On a related note. About a month or two ago I started work on a patch
>> for lein-ring so you'd have more control over the web.xml that is
>> generated. This was motivated by the desire to use the container's
>> datasource instead of creating one yourself. If anyone is interested I
>> can finish this up and contact weavejester to see if it's something
>> worth incorporating.
>>
>> https://github.com/mefesto/lein-ring/commit/3016142e1c7aadc77d273453e04f9196319406a2
>>
>> Allen
>>
>> On Mon, May 23, 2011 at 7:43 PM, Allen Johnson <akjohnso...@gmail.com> wrote:
>>> I'm also interested in this topic. It was discussed briefly on the
>>> clojure-web-dev mailing list a little while ago. What I've been doing
>>> is something like this:
>>>
>>> # lein ring project
>>> myapp/
>>>  config/
>>>    production/WEB-INF/myapp.properties
>>>    development/WEB-INF/myapp.properties
>>>    test/WEB-INF/myapp.properties
>>>  src/
>>>  project.clj
>>>
>>> $ # create war file
>>> $ lein ring uberwar
>>>
>>> $ # update configuration for production
>>> $ jar uvf myapp.war -C config/production .
>>>
>>> $ # or... update configuration for development server
>>> $ jar uvf myapp.war -C config/development .
>>>
>>> This assumes you have a ServletContextListener or equivalent in place
>>> to read on deployment.
>>>
>>> This is quick and dirty. I'd definitely like to see something better emerge.
>>>
>>> Allen
>>>
>>> On Mon, May 23, 2011 at 3:59 PM, Shantanu Kumar
>>> <kumar.shant...@gmail.com> wrote:
>>>> Hello Laurent, Quite interesting points there.
>>>>
>>>> Yes, I agree - having confidential config (production etc.) in code
>>>> base is not advisable. The reason I mentioned that though, was because
>>>> I was trying to cover a gamut of workflows the situation may demand.
>>>> One one extreme there may be a company where no developer gets to
>>>> touch production servers and must develop for a target config
>>>> constraint. On the other a set of developers who routinely deploy to
>>>> production and can get away with changing deployment practices on the
>>>> fly.
>>>>
>>>> What I would like to emphasize is to distinguish one environment from
>>>> the other (the code base may contain dummy config data in version
>>>> control.) A developer can change the dev config to a valid setup, and
>>>> similarly the person who builds for production deployment can change
>>>> the config locally (without committing the config details back to the
>>>> version control) and build a deployable bundle.
>>>>
>>>> An added level of indirection (where a config script loads details
>>>> from either a discoverable or a fixed resource) can bring some
>>>> flexibility -- the Ops guys can even edit config and re-start the app.
>>>> Though web container specific and servlet specific solutions are
>>>> useful for many cases, I am not sure I would recommend that as a
>>>> general practice -- for example, what am I to do if I have to deploy
>>>> my code to Netty/Aleph? IMHO ideally a Clojure webapp should be easily
>>>> buildable/deployable as a WAR (or EAR :-\) for web containers like
>>>> Tomcat/JBoss etc., but it may not depend on one.
>>>>
>>>> How to accomplish such builds where we cherry pick config stuff when
>>>> building for a certain environment (and how it integrates with the
>>>> development workflow) is a different aspect. I think I have seen
>>>> Apache Ant gives sufficient flexibility to do these things. Maybe
>>>> Leiningen can deliver some of the same things using plugins.
>>>>
>>>> Regards,
>>>> Shantanu
>>>>
>>>> On May 23, 12:48 pm, Laurent PETIT <laurent.pe...@gmail.com> wrote:
>>>>> Hello,
>>>>>
>>>>> Thanks for answering !
>>>>>
>>>>> My remarks follow:
>>>>>
>>>>> 2011/5/22 Shantanu Kumar <kumar.shant...@gmail.com>:
>>>>>
>>>>>> I have wondered about this problem and at the first glance it looked
>>>>>> straightforward to me to put moving parts (config elements that could
>>>>>> change) into dynamic vars/atoms/refs. The production env can use the
>>>>>> default config, and anything else (dev, testing) can alter the default
>>>>>> config to override the settings.
>>>>>
>>>>> The idea of having production settings in the codebase as "default
>>>>> values" doesn't feel right to me -in general- (and in my particular
>>>>> case).
>>>>> Generally, some of these info are confidential, and their lifecycle
>>>>> does not match the lifecycle of the product.
>>>>>
>>>>>> The dev/testing should have different
>>>>>> entry point (may be in "test" directory, as opposed to "src") than the
>>>>>> prod version. That said, the config elements themselves can be loaded
>>>>>> from certain config files. If it's a web app, you can bundle config in
>>>>>> file(s) in WEB-INF and load from there on init -- now that leads to a
>>>>>> complicated build process because you cherry pick the config file (for
>>>>>> staging, prod or integration test?) for the build target.
>>>>>
>>>>>> Another complexity might arise where the config must be used to carry
>>>>>> out certain stateful initialization to be useful to the app. How do
>>>>>> you gracefully handle the errors? So we go back to some mutable flag
>>>>>> that gives the go-ahead. Ugh!
>>>>>
>>>>> For what you describe, there are ways (as far as I remember) to manage
>>>>> this with webapps, I think. By placing an HttpFilter/Listener in front
>>>>> of the servlet, etc. (not sure about the details)
>>>>>
>>>>>> If the config element is common enough (e.g. database coords), it
>>>>>> might make sense to go for convention-based settings that remains more
>>>>>> or less the same. I have experimented a bit on this here:
>>>>>> https://bitbucket.org/kumarshantanu/clj-dbcp/src(jump to the section
>>>>>> "Create DataSource from .properties file") - I am interested in
>>>>>> knowing what others think about this.
>>>>>
>>>>> Yes, to some extent convention settings can work. But it's not rare to
>>>>> have some intermediate servers (dev's computer, test server) run on
>>>>> e.g. Linux, and sometimes the final server run on Windows. Not to say
>>>>> that this places a strong constraint on the server.
>>>>>
>>>>> I've got some more ideas from friends of mine, one of which seems real
>>>>> interesting : leverage extensions provided by the servlet container
>>>>> (e.g. Tomcat) provider: tomcat provides a way to "extend" the
>>>>> classpath of the webapp via configuration : that way you can put in
>>>>> your externalized context.xml file a "VirtualWebAppLoader" and
>>>>> initialize it to add to the classloader of the webapp the contents of
>>>>> e.g. $catalina_home$/conf/myAppConfig/ directory. From them on, your
>>>>> webapp will be able to see your configuration files in the classpath,
>>>>> even so they're neither in WEB-INF/classes/ nor WEB-INF/libs/
>>>>> directories.
>>>>>
>>>>> Of course this technique will be limited to those servlet containers
>>>>> which provide similar classpath extension mechanism, so you need to be
>>>>> in control of the potential servlet containers to which your app may
>>>>> be deployed.
>>>>>
>>>>> So far, the "most" general techniques I can see are : either
>>>>> bundle/repackage your webapp for the target servlet container
>>>>> instance, either pass the path to configuration file(s) via one (or
>>>>> more) JNDI parameters.
>>>>>
>>>>> Cheers,
>>>>>
>>>>> --
>>>>> Laurent
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Clojure" group.
>>>> To post to this group, send email to clojure@googlegroups.com
>>>> Note that posts from new members are moderated - please be patient with 
>>>> your first post.
>>>> To unsubscribe from this group, send email to
>>>> clojure+unsubscr...@googlegroups.com
>>>> For more options, visit this group at
>>>> http://groups.google.com/group/clojure?hl=en
>>>
>>
>> --
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clojure@googlegroups.com
>> Note that posts from new members are moderated - please be patient with your 
>> first post.
>> To unsubscribe from this group, send email to
>> clojure+unsubscr...@googlegroups.com
>> For more options, visit this group at
>> http://groups.google.com/group/clojure?hl=en
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with your 
> first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to