You'd bypass the descriptor altogether and build your modules
programmatically, by specifying the dependencies and so forth. That,
and more, is what you can do with a custom module loader.
You should come to my JUDCon talks about it. :-)
On 04/20/2011 12:12 PM, Lincoln Baxter, III wrote:
Actually, if we can still use the Maven loading strategy with JBoss
Modules, I think that's the best approach for the developer. Would we
even need a module descriptor in that case, or can we overload that part
of the system to basically accept what we give it as a "module" with no
dependencies (that we also provide via maven aether)?
So in a sense, gain classloader isolation while providing our own
dependency management.
I think it's time for me to dive into JBoss modules now, why oh why did
I have to present at JBW??? :)
~Lincoln
On Wed, Apr 20, 2011 at 1:07 PM, Lincoln Baxter, III
<lincolnbaxter(a)gmail.com <mailto:lincolnbaxter@gmail.com>> wrote:
David,
If we use a blank/empty modules descriptor, will JARs in
plugin.jar:/lib/* be loaded and isolated from the rest of the
system? If so, that might be exactly what we need, if combined with
an appopriate maven packaging strategy at build time.
~Lincoln
On Wed, Apr 20, 2011 at 12:34 PM, Lincoln Baxter, III
<lincolnbaxter(a)gmail.com <mailto:lincolnbaxter@gmail.com>> wrote:
I think what JBoss Modules can give you is a functional,
safe multiple-delegate class loader which you can't get with
URL class loaders. Specifically, f you want to have a
_graph_ of class loaders (as opposed to individual flat,
merged classloaders) then you need something like Modules.
I think I just embarrassed myself ;) But can weld even handle
this kind of separate class-loader situation?
As far as Maven integration, you could write a ModuleLoader
which does this for you. You'd have to do version
management on your own though. Perhaps you could use Aether
for the purpose of resolving and fetching artifacts, and
then use information exposed therefrom to construct the
module graph.
Right, which is something Forge can already do pretty handily
(using Aether):
https://github.com/seam/forge/blob/master/shell-api/src/main/java/org/jbo...
http://www.sonatype.com/people/2010/08/introducing-aether/
Your application does not have to be modular to use JBoss
Modules. Though of course in my opinion that makes it much
nicer. :-)
On 04/20/2011 10:56 AM, Lincoln Baxter, III wrote:
I agree with both of you guys, which is why I am
soliciting ideas for
this now.
I can also say that we do not have one big Classpath
right now (unless I
am horribly mistaken.) Forge already supports classpath
isolation of
individual plugins, so we're already half-way there. If
my understanding
of classloaders is at all right, It would not be too
much work to
implement a maven resolver and additional level of Composite
classloaders to achieve this goal.
I don't believe we need to pull in a heavyweight module
system like
OSGI, or force developers to do even the simple
configuration for
something like JBoss modules (which afaik, does not have
a way of
packaging the actual dependencies with the module, or
calling out to
Maven for dependencies - which forge can already do.)
*This is what we have right now:* (see today.png)
Notice how the Plugin ClassLoaders may reference Forge
APIs, but the
plugins may not access each other's classloaders because
there is no
link from Forge APIs to the Plugins.
*And this is all I think it should take to do what I am
suggesting:*
(see tomorrow.png)
If it is technically possible to achieve with JBoss
modules, via adding
in parsing the POM and including dependencies
automatically, then I am
all for it, but from what I understand, this would not
really be a 1-1
mapping and will not be trivial. I know my understanding
of ClassLoaders
may be a bit Naive, but I don't think that we need to
use JBoss modules
(or OSGi) to achieve this goal of automatic downloading
and loading of
plugin dependency JARs.
We certainly do not need the ability (yet) to drop an
individual module
while Forge is running, because Weld does not support
this kind of
disruption in the BeanStore. If you remove a JAR while
Weld is running,
you get a big fiery explosion. Same for loading a single
JAR, you have
to restart Weld because it will not be aware of the
changes, and there
is not a good API to make it so. It still has to build
the bean graph
all over again. That is one of the big reasons to use a
fully-fledged
module system, and we don't have that requirement. Forge
simply dumps
all classloaders (until JDK 7 we can't close them
easily, yeah memory
leaks, whatever, not really important right now,) then
builds a new
network of ClassLoaders and starts over.
However, if we can extend JBoss modules with Maven
support in this way,
and it's something that David would be interested in,
then I think
that's one big reason to do it that way. Until then, if
we can do it
quickly my way, I'd like to get it working sooner rather
than later.
Please please tell me (I'm sure I don't even have to
ask) if there are
gaping technical holes in what I am proposing, but if
there are not,
then I'm going to stick to this position until someone
bursts my bubble.
~Lincoln
On Wed, Apr 20, 2011 at 9:33 AM, Paul Bakker
<paul.bakker.nl <
http://paul.bakker.nl>
<
http://paul.bakker.nl>@gmail.com <
http://gmail.com>
<
http://gmail.com>> wrote:
Yeah, I'm afraid that's right. I think the module
system integration
should get very high priority before we reach a 1.0
version. It's
something that affects the whole way the core is
built up, and it
will be very difficult to change that later on.
Paul
On Wed, Apr 20, 2011 at 3:17 PM, Max Rydahl Andersen
<max.andersen(a)redhat.com
<mailto:max.andersen@redhat.com>
<mailto:max.andersen@redhat.com
<mailto:max.andersen@redhat.com>>> wrote:
+1
I agree with what you want to do Lincoln, but
don't see how that
can be made to happen without a module system.
Until then everything just will have to live in
one big classpath.
/max
On Apr 20, 2011, at 14:24, Paul Bakker wrote:
> And that's why a module system is needed. If people
can just
add dependencies there will be duplicate
(possibly multiple
versions) dependencies. Each plugin should be in
a separate
classloader, and each dependency should be too
so that a plugin
never breaks other plugins or Forge itself. It
would be a big
limitation if plugins can't use libraries otherwise.
>
> Paul
>
> On Tue, Apr 19, 2011 at 6:14 PM, Lincoln Baxter, III
<lincolnbaxter(a)gmail.com
<mailto:lincolnbaxter@gmail.com>
<mailto:lincolnbaxter@gmail.com
<mailto:lincolnbaxter@gmail.com>>> wrote:
> That's right, but what I'm saying is that I don't want
developers to be responsible for anything but
*their code* -- if
they have dependencies, those depenencies will
be fetched for
them (or somehow bundled in the JAR file itself,
which is
certainly possible, however not my preference.)
>
> If you could write a plugin, reference dependencies
in your
POM, and have everything *Just Work* don't you
think that would
be a friendlier experience?
>
> ~Lincoln
>
>
> On Mon, Apr 18, 2011 at 5:55 PM, Max Andersen
<manderse(a)redhat.com <mailto:manderse@redhat.com>
<mailto:manderse@redhat.com
<mailto:manderse@redhat.com>>> wrote:
> But if your plugin uses multiple jars it is not one jar.
>
>
> /max (sent from my phone)
>
>
> On 18/04/2011, at 19.06, "Lincoln Baxter, III"
<lincolnbaxter(a)gmail.com
<mailto:lincolnbaxter@gmail.com>
<mailto:lincolnbaxter@gmail.com
<mailto:lincolnbaxter@gmail.com>>> wrote:
>
>> That doesn't solve the problem of having to drop jar
files
onto the classpath in order for plugins to work.
I want one JAR
per plugin.
>>
>> ~Lincoln
>>
>> On Mon, Apr 18, 2011 at 12:59 PM, Max Rydahl Andersen
<max.andersen(a)redhat.com
<mailto:max.andersen@redhat.com>
<mailto:max.andersen@redhat.com
<mailto:max.andersen@redhat.com>>> wrote:
>>
>> On Apr 18, 2011, at 18:57, Lincoln Baxter, III wrote:
>>
>> > I don't want to force plugin-developers to create
modules
for every dependency that their plugin requires.
That's why I've
been avoiding OSGI or JBoss Modules.
>>
>> But then you shouldn't be forcing them to shade
either - you
should just have one global classloader for the
plugins then.
>>
>> /max
>>
>> >
>> > ~Lincoln
>> >
>> > On Mon, Apr 18, 2011 at 12:37 PM, Max Rydahl Andersen
<max.andersen(a)redhat.com
<mailto:max.andersen@redhat.com>
<mailto:max.andersen@redhat.com
<mailto:max.andersen@redhat.com>>> wrote:
>> >
>> > > What do you think about using Maven APIs to
inspect the
POM and fetch dependencies dynamically for each
plugin, then
isolate them in the plugin's classloader?
>> >
>> > Why not just load them in to one classloader so
you don't
have collisions when there are mixed
dependencies on Forge it self ?
>> >
>> > How about shared data instances ? How does that work ?
>> >
>> > ...as a side note...creating our own module system
now - I
feel that is a very bad direction :(
>> > Might as well adopt osgi plugin system if you want
this
kind of separation ?
>> >
>> > /max
>> >
>> > >
>> > > ~Lincoln
>> > >
>> > > On Mon, Apr 18, 2011 at 11:56 AM, Max Rydahl
Andersen
<max.andersen(a)redhat.com
<mailto:max.andersen@redhat.com>
<mailto:max.andersen@redhat.com
<mailto:max.andersen@redhat.com>>> wrote:
>> > >
>> > > On Apr 18, 2011, at 15:15, Lincoln Baxter, III
wrote:
>> > >
>> > > > "if there is a standard location for
dependencies"
>> > > >
>> > > > What do you mean?
>> > >
>> > > Your "standard" for shading is that you put
all
classes
into the plugin.jar.
>> > >
>> > > A "standard" for dependencies for a
plugin.jar
could be
"next to the plugin.jar".
>> > >
>> > > Would still have the problem of overlapping jars but
then at least its easier to see where the
duplication is.
>> > >
>> > > /max
>> > >
>> > > >
>> > > > Thx,
>> > > > ~Lincoln
>> > > >
>> > > > On Mon, Apr 18, 2011 at 6:20 AM, Max Rydahl
Andersen
<max.andersen(a)redhat.com
<mailto:max.andersen@redhat.com>
<mailto:max.andersen@redhat.com
<mailto:max.andersen@redhat.com>>> wrote:
>> > > >
>> > > > > I was thinking we might already be able to
do that
using the existing pom.xml metadata that's
stored in the
artifact itself, or is that too tricky?
>> > > >
>> > > > if there is a standard location for
dependencies then
it should be fine - at least better than shading ;)
>> > > >
>> > > > /max
>> > > >
>> > > > >
>> > > > > On Mon, Apr 11, 2011 at 6:51 PM, Max
Andersen
<manderse(a)redhat.com <mailto:manderse@redhat.com>
<mailto:manderse@redhat.com
<mailto:manderse@redhat.com>>> wrote:
>> > > > > I was thinking Plugin jar having references
to
dependent jars via manifest.mf
>> > > > >
>> > > > > /max (sent from my phone)
>> > > > >
>> > > > >
>> > > > > On 12/04/2011, at 00.39, "Lincoln
Baxter, III"
<lincolnbaxter(a)gmail.com
<mailto:lincolnbaxter@gmail.com>
<mailto:lincolnbaxter@gmail.com
<mailto:lincolnbaxter@gmail.com>>> wrote:
>> > > > >
>> > > > >> Can you give an example of how you
would
bundle the
JARs? (Just put them in /META-INF/dependencies/
... ?) And would
that not cause just as many class conflicts? If you
shade/relocate then the deps *should be*
completely isolated.
>> > > > >>
>> > > > >> On Mon, Apr 11, 2011 at 4:11 PM, Max
Rydahl
Andersen <max.andersen(a)redhat.com
<mailto:max.andersen@redhat.com>
<mailto:max.andersen@redhat.com
<mailto:max.andersen@redhat.com>>> wrote:
>> > > > >> well, recommending just bundling jars
would
be a
better approach than shading IMO.
>> > > > >>
>> > > > >> /max
>> > > > >>
>> > > > >> On Apr 11, 2011, at 16:00, Lincoln
Baxter,
III wrote:
>> > > > >>
>> > > > >> > Yeah, shading is currently the
recommended
approach. Conflicts should be avoided by using
relocations. I
know this is... not a great method, but for now
it's all we've
got. Open to suggestions.
>> > > > >> >
>> > > > >> > ~Lincoln
>> > > > >> >
>> > > > >> > On Mon, Apr 11, 2011 at 3:41 AM,
Max Rydahl
Andersen <max.andersen(a)redhat.com
<mailto:max.andersen@redhat.com>
<mailto:max.andersen@redhat.com
<mailto:max.andersen@redhat.com>>> wrote:
>> > > > >> > Heya,
>> > > > >> >
>> > > > >> > Lincoln, I just saw your commits
to
hibernattools
plugin at
(
https://github.com/forge/plugin-hibernate-tools/commit/8b208b4a8e79dbb8a0...)
>> > > > >> >
>> > > > >> > Is shading of jars really the
recommended
approach for plugins in Forge ?
>> > > > >> >
>> > > > >> > How are you going to share/avoid
collisions of
libraries across plugins if they need to bundle
via shading ?
>> > > > >> >
>> > > > >> > /max
>> > > > >> >
http://about.me/maxandersen
>> > > > >> >
>> > > > >> >
>> > > > >> >
>> > > > >> >
>> > > > >> >
_______________________________________________
>> > > > >> > forge-dev mailing list
>> > > > >> > forge-dev(a)lists.jboss.org
<mailto:forge-dev@lists.jboss.org>
<mailto:forge-dev@lists.jboss.org
<mailto:forge-dev@lists.jboss.org>>
>> > > > >> >
https://lists.jboss.org/mailman/listinfo/forge-dev
>> > > > >> >
>> > > > >> >
>> > > > >> >
>> > > > >> > --
>> > > > >> > Lincoln Baxter, III
>> > > > >> >
http://ocpsoft.com
>> > > > >> >
http://scrumshark.com
>> > > > >> > "Keep it Simple"
>> > > > >>
>> > > > >> /max
>> > > > >>
http://about.me/maxandersen
>> > > > >>
>> > > > >>
>> > > > >>
>> > > > >>
>> > > > >>
>> > > > >>
>> > > > >> --
>> > > > >> Lincoln Baxter, III
>> > > > >>
http://ocpsoft.com
>> > > > >>
http://scrumshark.com
>> > > > >> "Keep it Simple"
>> > > > >
>> > > > >
>> > > > >
>> > > > > --
>> > > > > Lincoln Baxter, III
>> > > > >
http://ocpsoft.com
>> > > > >
http://scrumshark.com
>> > > > > "Keep it Simple"
>> > > >
>> > > > /max
>> > > >
http://about.me/maxandersen
>> > > >
>> > > >
>> > > >
>> > > >
>> > > >
>> > > >
>> > > > --
>> > > > Lincoln Baxter, III
>> > > >
http://ocpsoft.com
>> > > >
http://scrumshark.com
>> > > > "Keep it Simple"
>> > >
>> > > /max
>> > >
http://about.me/maxandersen
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > --
>> > > Lincoln Baxter, III
>> > >
http://ocpsoft.com
>> > >
http://scrumshark.com
>> > > "Keep it Simple"
>> >
>> > /max
>> >
http://about.me/maxandersen
>> >
>> >
>> >
>> >
>> >
>> >
>> > --
>> > Lincoln Baxter, III
>> >
http://ocpsoft.com
>> >
http://scrumshark.com
>> > "Keep it Simple"
>>
>> /max
>>
http://about.me/maxandersen
>>
>>
>>
>>
>>
>>
>> --
>> Lincoln Baxter, III
>>
http://ocpsoft.com
>>
http://scrumshark.com
>> "Keep it Simple"
>
>
>
> --
> Lincoln Baxter, III
>
http://ocpsoft.com
>
http://scrumshark.com
> "Keep it Simple"
>
> _______________________________________________
> forge-dev mailing list
> forge-dev(a)lists.jboss.org
<mailto:forge-dev@lists.jboss.org>
<mailto:forge-dev@lists.jboss.org
<mailto:forge-dev@lists.jboss.org>>
>
https://lists.jboss.org/mailman/listinfo/forge-dev
>
>
> _______________________________________________
> forge-dev mailing list
> forge-dev(a)lists.jboss.org
<mailto:forge-dev@lists.jboss.org>
<mailto:forge-dev@lists.jboss.org
<mailto:forge-dev@lists.jboss.org>>
>
https://lists.jboss.org/mailman/listinfo/forge-dev
/max
http://about.me/maxandersen
_______________________________________________
forge-dev mailing list
forge-dev(a)lists.jboss.org
<mailto:forge-dev@lists.jboss.org>
<mailto:forge-dev@lists.jboss.org
<mailto:forge-dev@lists.jboss.org>>
https://lists.jboss.org/mailman/listinfo/forge-dev
_______________________________________________
forge-dev mailing list
forge-dev(a)lists.jboss.org
<mailto:forge-dev@lists.jboss.org>
<mailto:forge-dev@lists.jboss.org
<mailto:forge-dev@lists.jboss.org>>
https://lists.jboss.org/mailman/listinfo/forge-dev
--
Lincoln Baxter, III
http://ocpsoft.com
http://scrumshark.com
"Keep it Simple"
--
- DML
--
Lincoln Baxter, III
http://ocpsoft.com
http://scrumshark.com
"Keep it Simple"
--
Lincoln Baxter, III
http://ocpsoft.com
http://scrumshark.com
"Keep it Simple"
--
Lincoln Baxter, III
http://ocpsoft.com
http://scrumshark.com
"Keep it Simple"