Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
RE: [aspectj-users] lauching applications from anotherone with load-time weaving

Fabio,

The easiest thing would be to set up your classpath to include the relevant
aspects for your nested child application to use. If you need to create a
separate loader you can add them in there separately. I'd normally expect
you'd want to use load-time weaving at the VM level with -javaagent as
Matthew described. In unusual cases you might want to use the class
org.aspectj.weaver.WeavingURLClassLoader to explicitly weave in a specific
loader but I'd suggest you avoid that approach if possible.

-----Original Message-----
From: aspectj-users-bounces@xxxxxxxxxxx
[mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Stalsy
Sent: Friday, October 27, 2006 1:10 AM
To: aspectj-users@xxxxxxxxxxx
Subject: Re: [aspectj-users] lauching applications from anotherone with
load-time weaving

Hi Fabio,

to launch an application from another java program it is possible using 
either reflection or create another process and execute java command 
with Runtime.getRuntime().exec(command);
In both cases you can implement a programmatic version of aspectj 
compiler like the follow (as discussed at 
http://www.eclipse.org/aspectj/doc/released/devguide/ajc-ref.html):

  public class AspectWeaverImpl implements AspectWeaver {
    ...

    public void compile(boolean debug) throws AspectWeavingException {
         
          Main compiler = new Main();
          MessageHandler m = new MessageHandler();       

          // call compiler parameters from XML file      
          XMLReader xmlp = new XMLReaderImpl(Constants.configFilename); 
// call XML parser      
          Vector v = xmlp.getArray("aj", "compilerParam");       
          String[] param = Utility.vectorTOString(v);
       
         // call ajc
         compiler.run(param, m);
       
         // print compiler verbose infos
         if (debug) {
             IMessage[] ms = m.getMessages(null, true);       
             System.out.println("messages: " + Arrays.asList(ms));
         }
       
     }

 }

At this point you can chose two approaches (more complicated than using 
-javaagent but effective):
1) if you want use reflection put "-d" parameter in the compiler 
options. This parameter puts generated class files in a destination 
directory. Then you can recall your main class instance and invoke main 
method.
2) if you want use "Runtime.exec()" command you can insert "-outjar" 
parameter in the compile options. This parameter creates a jar file 
containing the generated output class file. So firstly you can recall 
your personal AspectWeaver (with -outjar option) and then launch the 
application (recall the jar file).

regards


Fabio Fagundes Silveira ha scritto:
> *Hi Matthew,
>
>    Ok ... but how to get this working?  I just can get this working if 
> I type: java -javaagent:xxx Test ... Therefore, I dont know how to 
> load the other application (e.g. from App1.main) using a separate 
> class loader ... :-(
>
> **  Would you please send me some hints (piece of code)?*
> *
> Thank you,
> Fabio
>
> On Thu, 26 Oct 2006 16:07:14 +0100, Matthew Webster wrote*
> > Fabio,
> >
> > If you are using Java 5 then just use the -javaagent that comes with 
> AspectJ: 
> http://www.eclipse.org/aspectj/doc/released/devguide/ltw-agents.html. 
> You may want to load you test application using a separate class 
> loader, with it's own classpath. As each class is loaded it will 
> automatically get passes to AspectJ.
> >
> > Matthew Webster
> > AOSD Project
> > Java Technology Centre, MP146
> > IBM Hursley Park, Winchester,  SO21 2JN, England
> > Telephone: +44 196 2816139 (external) 246139 (internal)
> > Email: Matthew Webster/UK/IBM @ IBMGB, matthew_webster@xxxxxxxxxx
> > http://w3.hursley.ibm.com/~websterm/
> >
> >
>
> > To 	aspectj-users@xxxxxxxxxxx
>
> > cc 	
>
> > Subject 	[aspectj-users] lauching applications from another one with 
>        load-time weaving
>
>
> >
>
> 	
>
>
> >
>
>
> >
> > Hello,
> >
> >   To launch an application from another java program is possible using
> > reflection, such as:
> >
> > Class cls = Class.forName("Test");
> > String s[] = new String[] {};
> > Object arguments[] = new Object[] { s };
> > Method mainMethod = cls.getMethod("main", new Class[] {s.getClass()});
> > Object result = mainMethod.invoke(null, arguments);
> >
> >  Ok, but how to do that (ie. launching "Test" application) using
> > load-time weaving? I meant, lauching Test and aspects defined to be
> > applied to this class in a META-INF/aop.xml file?
> >
> >  I've tried to find out any WeavingAdaptor tutorial or something like
> > that ... but I didn't  ... :-(
> >
> >  Could you help me?  :-)
> >
> > Regards,
> > Fabio
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>   


-- 
Stalsy

  HomePage   --:. http://www.stalsy.it
  Blog       --:. http://blog.stalsy.com
  Public Key --:. http://www.stalsy.it/key.php
  E-Mail     --:. stalsy@xxxxxxxxx  
  MSN        --:. faricci@xxxxxxxx
  Skype      --:. www.stalsy.it




_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users



Back to the top