The issue was related to scoping variables as "static" in the LifecycleExecutor and its subclasses. In storing the JSF LifecycleFactory and our own specific executors (JsfLifecycleExecutor and SwfLifecycleExecutor) statically, it caused the noted problem when the libraries where deployed in a shared location on the app server. Due to classloading complexities, the application would end up with the same instances of the Lifecycle and Executors. Since they are responsible for running the JSF lifecycle (and, in turn, firing events to the PhaseListeners), having them as static would cause the first application to set the values for all applications.
I've changed the logic to remove the static scoping and store the desired executors in the application map. This should be nearly as efficient and allows each application to have it's own proper set of references.
Attached my two test cases. Example1 uses a simple Phase Listener called PhaseOne. Example2 uses a Phase Listener called PhaseTwo. I added the necessary jar files to the server/default/lib directory in a standard install of JBoss 4.2.3 GA. These are regular JSF/ICEfaces examples.