You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avalon.apache.org by Eric Pugh <ep...@upstate.com> on 2003/11/03 00:33:09 UTC

Merlin Component Service for Turbine

Hi all,

I have committed the first cut of the MerlinComponentService [1] by Peter
Courcoux and added in a working unit test [2].  Here are my issues at this
point with understanding Merlin.

1) If you look at the unit test, I can run the HelloComponent from the Maven
tutorial fine.  In fact, by adding it to the Turbine repo, Merlin nicely
downloads and installs the jar!  Very handy.

However...  I want to master all my jar dependencies in my project.xml file.
That way, run I build the maven war task to build my WAR file to deploy, all
my dependencies are included, versus this dynamic downloading from the
block.xml files.  However, there doesn't seem to be built in any way to load
all my jars from the WEB-INF/lib directory.  The DefaultFileRepository could
be pointed at a web-inf/lib directory, but it wants to load things as
WEB-INF/lib/{groupId}/jar/{artifactId}.  However, I could replace it with
one that resolved them directly.

But, the other problem is that I can't seem to pass in my own classloader.
I do most of my development in Eclipse, and one of the things I am used to
with ECM is just including my jar in my classpath and having everything
work.  But, because Merlin is using it's own classloader, it doesn't pick up
the Eclipse classpath, therefore it has to download and install it someplace
to use it.  (I think...)

2) If you look in the MerlinCompoenentServiceTest the second unit test won't
run.  I am not sure how to load the TestComponent when it is part of the
same code.  Or, does it have to be a seperate project?  I am used to writing
components that are just part of my application classpath and source tree,
not loaded from seperate jars.

3) Integrating ECM components.  I am looking at the various changes, and to
use a component that was compatible with ECM in Merlin requires some
signficant changes.  I guess the big issue is the need for the .xinfo file.
If I have an existing jarred up ECM component that I want to use in Merlin.
Can I just write by hand the .xinfo file?  How do I get it to load?  Just
add into my /classes directory the full path to the class name and put the
.xinfo there?  So, the .class file is loaded from the jar, but the .xinfo
loads form the /classes directory?

4) Running unit tests inside of Eclipse.  I discovered one issue, which is
that the AbstractMerlinTestCase expects a System property like this in the
getBaseDirectory method.  I'm guessing because it is oriented towards Maven:

	String basedir = System.getProperty( "basedir" );

However, in Eclipse this isn't provided, therefore it fails with an NPE.
Now, I think the AbstractMerlinTestCase could do something like:
	if(basedir==null){
		basedir = new File(".").toString()
	}

   I think it is crucial to be able to run unit tests via the IDE debugger.


Overall, I can definitly see the niceness of having a single Merlin
repository on a machine for multiple applications.  However, I think for
many of the Turbine users, they are going to want to instead have all their
jars included in the war file, or at least, have the option.  I like the
repository as it'll make my WAR files much smaller and look forward to when
I can set up a single repo to load from.

Eric Pugh


[1]
http://cvs.apache.org/viewcvs/jakarta-turbine-2/src/java/org/apache/turbine/
services/avaloncomponent/TurbineMerlinComponentService.java
[2]
http://cvs.apache.org/viewcvs.cgi/jakarta-turbine-2/src/test/org/apache/turb
ine/services/avaloncomponent/MerlinComponentServiceTest.java


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@avalon.apache.org
For additional commands, e-mail: dev-help@avalon.apache.org


Re: Merlin Component Service for Turbine

Posted by Stephen McConnell <mc...@apache.org>.

Eric Pugh wrote:

>Hi all,
>
>I have committed the first cut of the MerlinComponentService [1] by Peter
>Courcoux and added in a working unit test [2].  Here are my issues at this
>point with understanding Merlin.
>
>1) If you look at the unit test, I can run the HelloComponent from the Maven
>tutorial fine.  In fact, by adding it to the Turbine repo, Merlin nicely
>downloads and installs the jar!  Very handy.
>
>However...  I want to master all my jar dependencies in my project.xml file.
>That way, run I build the maven war task to build my WAR file to deploy, all
>my dependencies are included, versus this dynamic downloading from the
>block.xml files.  However, there doesn't seem to be built in any way to load
>all my jars from the WEB-INF/lib directory.  The DefaultFileRepository could
>be pointed at a web-inf/lib directory, but it wants to load things as
>WEB-INF/lib/{groupId}/jar/{artifactId}.  However, I could replace it with
>one that resolved them directly.
>

If you want to have local copies of jar files (merlin system and app) then
we should be populating the WEB-INF/ with both a system repository and an
application repository. Resolving against a flat /lib is not recommended
as jar names are scoped relative to a group and you quickly end up with
name conflicts in a flat structure.

>But, the other problem is that I can't seem to pass in my own classloader.
>I do most of my development in Eclipse, and one of the things I am used to
>with ECM is just including my jar in my classpath and having everything
>work.  But, because Merlin is using it's own classloader, it doesn't pick up
>the Eclipse classpath, therefore it has to download and install it someplace
>to use it.  (I think...)
>

In Merlin there is a strict isolation between container classes and 
component
classes.  ECM does not have this notion.  I don't know what would be 
required
to deal with this in Eclipse - but there are others here who use Eclipse and
Merlin who can probably help.

>2) If you look in the MerlinCompoenentServiceTest the second unit test won't
>run.  I am not sure how to load the TestComponent when it is part of the
>same code.  Or, does it have to be a seperate project?  I am used to writing
>components that are just part of my application classpath and source tree,
>not loaded from seperate jars.
>

I took a quick look at the build but was unable to run maven.  Looks 
like your assuming RC1 and I'm using beta-10 (RC1 has bugs related to 
doc generation) - so the following comments are related to just looking. 

First off - I strongly recommend - in fact I *very* *very* strongly 
recommend - that you do *not* include all the merlin system jar files in 
you project.xml.  An embedded merlin jar such as merlin-unit-3.2.2 
handles all of this automatically - you simply do not need to expose of 
this stuff - and in fact - your asking for problems within the maven 
classloader. What you should be doing is including just one application 
embeddor jar (e.g. turbine-merlin-1.x.jar).  That jar would contain the 
kernel bootstrap which in turn builds a classloader heirachy that is 
seperate and independent of the maven classloader. 

Once you have that in place - you simply provide component deployment 
dirtectives to the kernel it establishes.  Those directives can be 
directories, jar files, url to remotely located deployment descriptors.  
It is in the deployment descriptor that you reference something like 
TestComponent.

Concerning the test case failure - can you post the error report?

>3) Integrating ECM components.  I am looking at the various changes, and to
>use a component that was compatible with ECM in Merlin requires some
>signficant changes.  I guess the big issue is the need for the .xinfo file.
>If I have an existing jarred up ECM component that I want to use in Merlin.
>Can I just write by hand the .xinfo file?  
>

Yes.

>How do I get it to load?  Just
>add into my /classes directory the full path to the class name and put the
>.xinfo there?  
>

Yes - if - and only if - the directory containing the xinfo file is 
included in the classpath declaration for a container in you deployment 
descriptor (block.xml).

>So, the .class file is loaded from the jar, but the .xinfo
>loads form the /classes directory?
>

Yep - its possible - providing your container classpath contains both.

>
>4) Running unit tests inside of Eclipse.  I discovered one issue, which is
>that the AbstractMerlinTestCase expects a System property like this in the
>getBaseDirectory method.  I'm guessing because it is oriented towards Maven:
>
>	String basedir = System.getProperty( "basedir" );
>
>However, in Eclipse this isn't provided, therefore it fails with an NPE.
>Now, I think the AbstractMerlinTestCase could do something like:
>	if(basedir==null){
>		basedir = new File(".").toString()
>	}
>
>   I think it is crucial to be able to run unit tests via the IDE debugger.
>

It should be possible to update the abstract unit test form this sort of 
context. 

>
>
>Overall, I can definitly see the niceness of having a single Merlin
>repository on a machine for multiple applications.  However, I think for
>many of the Turbine users, they are going to want to instead have all their
>jars included in the war file, or at least, have the option.  I like the
>repository as it'll make my WAR files much smaller and look forward to when
>I can set up a single repo to load from.
>

Suggestion for now is to leverage the shared repository - get things 
working and validated (it is simply simpler).  Next step is to build a 
war file and aggregating the jar files into system and application 
repositories in the war file - and that can be done with a bit of jelly 
in the maven.xml.

Last comment - we are in the process of improving the kernel embedding 
side of things and will be refactoring all of the embedded scenarios to 
use a common defaults and parameterization model.  This will make things 
a lot simpler - in fact the TurbineMerlinComponentService will probably 
shrink down to only a few lines of code - and as a result - the stuff 
such classloader establishment will be taken care of automatically.

Cheers, Steve.

>
>Eric Pugh
>
>
>[1]
>http://cvs.apache.org/viewcvs/jakarta-turbine-2/src/java/org/apache/turbine/
>services/avaloncomponent/TurbineMerlinComponentService.java
>[2]
>http://cvs.apache.org/viewcvs.cgi/jakarta-turbine-2/src/test/org/apache/turb
>ine/services/avaloncomponent/MerlinComponentServiceTest.java
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: dev-unsubscribe@avalon.apache.org
>For additional commands, e-mail: dev-help@avalon.apache.org
>
>
>  
>

-- 

Stephen J. McConnell
mailto:mcconnell@apache.org




---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@avalon.apache.org
For additional commands, e-mail: dev-help@avalon.apache.org