Although, to go back on my previous statement a little...
I think the gwt super dev mode will have to use URLClassLoader no matter what,
since it will be responsible for compiling any configuration of gwt modules you would like to create.
This means using the IDE to select jars and source, so no way to know ahead of time what to send to vertx.
My plan is to build a highly modular set of standalone gwt components which expose their controller as either javascript api or html5 webworker.
The master page will just be a thin layer which hooks up and controls jsni components, each of which can be recompiled and hotswapped without a page reload.
When compiling for production, any modules which do not run in an iframe widget or web worker will just become .runAsync() split points, guaranteed to be wholly isolated.
Best of all, I'm going to rebind GWT.create(java.lang.Thread.class) to generate two artifacts:
One is a synthetic, single-script-linker js glob that can run the thread independently in a web worker (or iframe, or just in the top window if ie doesn't like either)
The other is a controller class returned by the generator which will interface with the emulated thread in the root host page.
Whatever methods are annotated @Export on your thread become the communication protocol to your web worker,
and the actual Thread methods, sleep(), yield(), etc. will be emulated as best as possible.
I'm currently using AsyncCallback to get all data, which may seem obtuse, but actually allows multiple return types by convention,
so calling worker.calculate(listOfStuff<Dto>, listOfCallbacks<Async<Dto>>, Async<Void> onDone) would stash the callbacks, serialize the rest and send it to the worker in batches.
The web worker environment performs your actual heavyweight calculations, ui thread stays happy, and you can send back responses whenever they are ready.
This will allow me to properly emulate (and achieve) concurrency in the browser,
so when I write PlayN games, I will be able to run heavy A* without glitching out my redraw,
and actually use ThreadLocal in shared code when that is the behavior I want in the server.
So, for me, collide is the perfect environment to rapidly iterate;
why reload or recompile everything when I can get runtime concurrency, hotswapping, module isolation and tight code splitting?
One-click of a test button will recompile whatever little bit of code you need, run in fresh window as soon as it is ready, immediately run/debug the result.
After all that rant, I'll get to my point:
Maven has the strict classpath management I need to enforce isolation, control dependencies and keep out code bloat,
but there's no reason to require a dependency management toolkit when the current dependencies are java 7 & ant 1.8.4.
So, I am just going to symlink my fork and just make the poms defer to ant tasks until I need to write some Mojos.
In order to fulfil my life-long obsession to write a program which codes, compiles, recompiles and hotswaps itself,
I just need gwt super dev mode, an ant runner, and a maven runner plugged in.
All three of these plugins require essentially the same data:
list of source / jars, property map, and a string command.
The rest is just "perform long and boring task in background, pipe log to user",
Ideally, all of these plugins would just be run targets we could infer from a filename regex,
and the run configuration / dialog / controls can just be an IsEditor<RunConfig>
The whole plugin would look something like:
interface PluginRunner{
String getMain();//target
JsoArray[String] getClasspath();//libs
String getAddressBase();//socket channel, so subclasses play nice
//maybe project id in here or something
}
class GwtPluginClient implements PluginRunner, IsEditor<GwtConfig>{
Editor<GwtConfig> getEditor();//widget to edit plugin configuration
String getFilenameRegex();//to integrate with run button on selected files
}
class GwtPluginServer extends BusModBase implements PluginRunner{
//compile stuff. send messages. be cool.
}
Anyway,
that's my plan.