On Jan 9, 2006, at 11:38 AM, David Jencks wrote:
On Jan 9, 2006, at 4:15 AM, Michael Allman wrote:
On Mon, 9 Jan 2006, David Jencks wrote:
<snip>
I started looking into the daytrader app you mentioned. I
think I found its deployed instance in config-store/28, but it
looks like it bundles the activemq and tranql resource
adapters under the TradeDataSource and TradeJMS
subdirectories, respectively. Are you saying they don't need
to be there, that they could be referenced from the daytrader
app somehow?
They are added by the configuration building process, the
simplification is that you don't need to include the rars in
your ear yourself. We are thinking about a way to make it so
deploying a j2ee artifact does not copy any of it into the
configuration but refers to it in some form in the repository,
but this will require at least a new classloader and perhaps
unpacking the nested jars into a flat structure.
I'm trying to get away from using JBoss because their software
is buggy and they're a pain in the ass, but their resource
adapter deployment and configuration is easier and more flexible
than what Geronimo currently offers. Aside from the issue of
being able to share a single rar among multiple applications, I
can also deploy a rar file to JBoss without any kind of JBoss-
specific configuration. (I understand said resource adapter is
useless without further configuration --- it's the principle
that I don't have to build multiple rar archives, one for each
app server implementation, that matters to me.)
I think there's a communication problem here, but I'm not sure
exactly what or where it is. I hope I can get you to explain
what you mean in a way I can understand more easily.
Unfortunately I don't remember all the details of how I wrote the
jboss connector stuff, and they might have changed it somewhat in
the last couple years, but... what do you mean by deploying a rar
file without a plan? it seems to me that all that is possible is
to get the classes into a classloader that can be referenced
somehow. If you want a usable instance, you need a vendor plan
and a reference to the ra.xml in the rar and some classloader
with the classes in it.
"A rar file without a plan" == a rar file packaged as required by
the J2EE connector spec and without any app server specific
configuration. I can take one of these and deploy it on a JBoss 4
instance by plopping it into one of the deploy directories. Like
I said, it needs further configuration to define actual connection
factory instances, but these can be added and modified ad hoc
without redeploying the rar file.
In geronimo, you do roughly the same thing. There are a couple
ways to make the deployment happen, and which you choose depends
a lot on whether you are trying to put together a special purpose
server for your app or viewing geronimo as something you can't
change and just want to deploy your app on. If you are trying to
build a server or want to be able to distribute your deployed
application, you should use the packaging plugin to build a
configuration from the rar and your plan. (soon there will be a
offline deployer to let you do this without needing maven). You
can then assemble a server including the .car file generated. If
you want to regard geronimo as immutable, you can use the online
deployer, again with the rar file and your plan. I don't see the
difference between putting the rar file in the maven repo or the
geronimo repo (geronimo) or "deploying" it without a plan on jboss.
If you build the car file, you will be able to include it in any
geronimo server you want: it includes all its classes and is
"predeployed". (the tool support for adding it to an existing
server is not too good yet).
I'm not familiar with Geronimo's deployment strategy, but it
sounds like each deployment module gets its own classloader.
Rather than copy dependencies, couldn't they be referenced via
classloader delegation or a similar mechanism?
We would like to come up with a way to avoid copying all the
classes into a car file, but as I mentioned this will take some
classloader tricks. However, I'm not sure how this affects a
user. The copying is done by geronimo during deployment. As
long as you only need to start with one copy of the rar, why do
you care how many times geronimo copies it?
Will the deployer transparently update all the copies if I
redeploy the rar file?
no, in fact right now you can't deploy a separate plan and rar
using the hot deployer, you would have to pack the plan into the
rar. Personally I despise the hot deployer :-) but I will try to
consider this anyway :-)
<goes away and looks at the code>
After looking at the hot deployer, I think we can make it deploy a
plan that does not need to go with a j2ee artifact. There are 2
kinds of these, gbean plans and "synthetic ears" that include one
or more ext-modules and no normal modules. If this works, you
would be able to:
-put the appropriately versioned rar in the geronimo repository
-put your rar plan in a synthetic ear plan
-copy the synthetic ear plan to the hot deploy dir (hot deployer
will deploy it)
-modify the rar in the geronimo repo (nothing will happen)
-touch the synthetic ear plan in the hot deploy dir (hot deployer
will redeploy it)
Is this too much work?
I've implemented this in geronimo head. I don't know if there are
any working nightly builds so you would probably have to build a copy
of geronimo for yourself.
thanks
david jencks
Now let me complain about the hot deployer :-) What I don't like
about it is that it doesn't integrate very will with automated
builds. You can have your automated build copy an artifact into
the hot deploy dir, but there is no way to determine that the
deployment is complete or error-free, so effectively your build
script has to have the copy as its last step. I prefer solutions
where the build script does something that positively tells it
whether the deployment worked. At the moment we have 2 ways to do
this easily with maven 1 and one way to do it with a command line
tool.
command line: call the deployer java -jar bin/deployer.jar --user
system --password manager deploy myrar.rar myplan.xml
deploy to a running server using the maven deploy plugin, using
something like this:
<deploy:distribute
uri="deployer:geronimo:jmx"
username="system"
password="manager"
module="${maven.build.dir}/openejb-itests-$
{pom.currentVersion}.jar" />
<deploy:start
uri="deployer:geronimo:jmx"
username="system"
password="manager"
id="openejb/itests/${openejb_version}/car"/>
With this method, I usually have some other maven scripting that
use the deploy plugin to unpack and start a geronimo server in the
same module. I think this is the easiest way to set up integration
tests.
build a server that includes your application: have one or more
config modules similar to the configs/ in the geronimo build, and
assemble a server with just the stuff you need, similar to an
assembly/ in the geronimo build.
The last approach is not really as easy as it should be yet. We
are working on making it easier and more flexible.
What do you think?
thanks
david jencks
Thanks.
Michael