You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@maven.apache.org by thiago <tc...@gmail.com> on 2006/08/22 21:23:50 UTC

Antrun issue

Hi,

  I have a multi-project with severals modules. I was trying to use the
assembly plugin to create the final project structure. Unfortunatelly the
assembly descriptor does not have all the features that I need to achieve
this final structure. So I tried to use the antrun plugin. I could make a
set of tasks that builds what I want but unfortunatelly the antrun plugin
runs before submodules are built so the tasks doesn't do anything at all and
then I end up having to call maven twice ("mvn package" and then "mvn
antrun:run"). 
   So how can I make the antrun behave like the assembly plugin (that is, to
have it ran AFTER the submodules are built)?

Regards,
Thiago Souza
-- 
View this message in context: http://www.nabble.com/Antrun-issue-tf2148246.html#a5932040
Sent from the Maven - Users forum at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


Re: Antrun issue

Posted by Mick Knutson <mi...@gmail.com>.
Sorry, did not mean to respond.

On 8/22/06, thiago <tc...@gmail.com> wrote:
>
>
>
> What?
>
>
> Mick Knutson-4 wrote:
> >
> > ...
> >
> > On 8/22/06, thiago <tc...@gmail.com> wrote:
> >>
> >>
> >> Hi,
> >>
> >> I have a multi-project with severals modules. I was trying to use the
> >> assembly plugin to create the final project structure. Unfortunatelly
> the
> >> assembly descriptor does not have all the features that I need to
> achieve
> >> this final structure. So I tried to use the antrun plugin. I could make
> a
> >> set of tasks that builds what I want but unfortunatelly the antrun
> plugin
> >> runs before submodules are built so the tasks doesn't do anything at
> all
> >> and
> >> then I end up having to call maven twice ("mvn package" and then "mvn
> >> antrun:run").
> >>   So how can I make the antrun behave like the assembly plugin (that
> is,
> >> to
> >> have it ran AFTER the submodules are built)?
> >>
> >> Regards,
> >> Thiago Souza
> >> --
> >> View this message in context:
> >> http://www.nabble.com/Antrun-issue-tf2148246.html#a5932040
> >> Sent from the Maven - Users forum at Nabble.com.
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
> >> For additional commands, e-mail: users-help@maven.apache.org
> >>
> >>
> >
> >
> > --
> >
> > ---
> > Thanks
> >
> > DJ MICK
> > http://www.djmick.com
> > http://www.myspace.com/mickknutson
> >
> >
>
> --
> View this message in context:
> http://www.nabble.com/Antrun-issue-tf2148246.html#a5932097
> Sent from the Maven - Users forum at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
> For additional commands, e-mail: users-help@maven.apache.org
>
>


-- 

---
Thanks

DJ MICK
http://www.djmick.com
http://www.myspace.com/mickknutson

Re: Antrun issue

Posted by thiago <tc...@gmail.com>.

What?


Mick Knutson-4 wrote:
> 
> ...
> 
> On 8/22/06, thiago <tc...@gmail.com> wrote:
>>
>>
>> Hi,
>>
>> I have a multi-project with severals modules. I was trying to use the
>> assembly plugin to create the final project structure. Unfortunatelly the
>> assembly descriptor does not have all the features that I need to achieve
>> this final structure. So I tried to use the antrun plugin. I could make a
>> set of tasks that builds what I want but unfortunatelly the antrun plugin
>> runs before submodules are built so the tasks doesn't do anything at all
>> and
>> then I end up having to call maven twice ("mvn package" and then "mvn
>> antrun:run").
>>   So how can I make the antrun behave like the assembly plugin (that is,
>> to
>> have it ran AFTER the submodules are built)?
>>
>> Regards,
>> Thiago Souza
>> --
>> View this message in context:
>> http://www.nabble.com/Antrun-issue-tf2148246.html#a5932040
>> Sent from the Maven - Users forum at Nabble.com.
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
>> For additional commands, e-mail: users-help@maven.apache.org
>>
>>
> 
> 
> -- 
> 
> ---
> Thanks
> 
> DJ MICK
> http://www.djmick.com
> http://www.myspace.com/mickknutson
> 
> 

-- 
View this message in context: http://www.nabble.com/Antrun-issue-tf2148246.html#a5932097
Sent from the Maven - Users forum at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


Re: Antrun issue

Posted by Mick Knutson <mi...@gmail.com>.
...

On 8/22/06, thiago <tc...@gmail.com> wrote:
>
>
> Hi,
>
> I have a multi-project with severals modules. I was trying to use the
> assembly plugin to create the final project structure. Unfortunatelly the
> assembly descriptor does not have all the features that I need to achieve
> this final structure. So I tried to use the antrun plugin. I could make a
> set of tasks that builds what I want but unfortunatelly the antrun plugin
> runs before submodules are built so the tasks doesn't do anything at all
> and
> then I end up having to call maven twice ("mvn package" and then "mvn
> antrun:run").
>   So how can I make the antrun behave like the assembly plugin (that is,
> to
> have it ran AFTER the submodules are built)?
>
> Regards,
> Thiago Souza
> --
> View this message in context:
> http://www.nabble.com/Antrun-issue-tf2148246.html#a5932040
> Sent from the Maven - Users forum at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
> For additional commands, e-mail: users-help@maven.apache.org
>
>


-- 

---
Thanks

DJ MICK
http://www.djmick.com
http://www.myspace.com/mickknutson

Re: Jar With Dependencies

Posted by Arnaud Bailly <ab...@oqube.com>.
Arnaud Bailly <ab...@oqube.com> writes:

Oops ! Did not mean to clutter the list with code, sorry. 

-- 
OQube < software engineering \ génie logiciel >
Arnaud Bailly, Dr.
\web> http://www.oqube.com


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


RE: Jar With Dependencies

Posted by Douglas Ferguson <do...@epsiia.com>.
Ah.. that's nifty.

However, this is not a console app. These are our java apis that we are sending the client. They need to add this jar to their classpath.

Here's a simplified example what we have:

Common.jar
Persistence.jar
WSA.jar
Client.jar

Where Client.jar is just a composite module with dependencies on Common, Persistence, WSA.

I think the trick is to use the assembly plug and set unpack to true.
However, if someone else knows another trick.....

D-



-----Original Message-----
From: Arnaud Bailly [mailto:abailly@oqube.com] 
Sent: Wednesday, August 23, 2006 8:38 AM
To: Maven Users List
Subject: Re: Jar With Dependencies

Douglas Ferguson <do...@epsiia.com> writes:

> Sure, I'd love to see that script. 

import java.io.File;
import java.io.FileFilter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Lanceur implements Runnable {

	private static final Log LOG = LogFactory.getLog(Lanceur.class);
	
	/*
	 * the command line arguments array
	 */
	private String[] arguments;

	/*
	 * the exit status
	 * 
	 */
	private int status = 0;

	/*
	 * class loader constructed by this lanceur
	 */
	private URLClassLoader loader;

	public static void main(String[] argv) {
  		if(argv.length == 0)
		   System.exit(1); 
		/* first argument is real lanucher class */
	        String real = argv[0];
                Class realC = Class.forName(real);
		/* shift les arguments */
		String[] nargs = new String[argv.length - 1];
		if (nargs.length != 0) {
			System.arraycopy(arguments, 1, nargs, 0, nargs.length);
		}	
		Lanceur l = (Lanceur)realC.newInstance();
		l.setArguments(argv);
		l.run();
	}

	public void run() {
		/* extraction du repertoire */
		String libdir = System.getProperty("libdir","..\\lib");
		if (libdir == null) {
			LOG.error("Definir le repertoire contenant les bibliotheques : -Dlibdir=<xxxxx>");
			setStatus(1);
			return;
		}
		/* verifications */
		File f = new File(libdir);
		if (!f.exists()) {
			LOG.error("Le repertoire" + libdir + " n'existe pas");
			setStatus(2);
			return;
		}
		if (!f.isDirectory()) {
			LOG.error(libdir + " n'est pas un repertoire");
			setStatus(2);
			return;
		}
		if (!f.canRead()) {
			LOG.error("Le contenu de " + libdir + " ne peut etre lu");
			setStatus(2);
			return;
		}
		/* extraction du nom de la classe principale */
		String clname = System.getProperty("main","Main");
		if (clname == null)
			clname = "Main";
		/* construction du classpath */
		File[] jars = f.listFiles(new FileFilter() {

			public boolean accept(File pathname) {
				return pathname.getName().endsWith(".jar")
						|| pathname.getName().endsWith(".zip");
			}

		});
		int ln = jars.length;
		URL[] urls = new URL[ln + 1];
		/* ajout du repertoire courant par defaut*/
		try {
			urls[0] = new URL("file://.");
		} catch (MalformedURLException e) {
			LOG.error("Impossible d'ajouter . au classpath : "
					+ e.getLocalizedMessage());
		}
		for (int i = 0; i < ln; i++)
			try {
				handleJar(jars[i]);
				urls[i] = new URL("file://" + jars[i].getPath());
			} catch (MalformedURLException e) {
				LOG.error("Impossible d'ajouter . au classpath : "
						+ e.getLocalizedMessage());
			}
		/* chargement */
		loader = new URLClassLoader(urls, ClassLoader.getSystemClassLoader());
		try {
			Class cls = loader.loadClass(clname);
			Method main = cls.getDeclaredMethod("main", new Class[] { nargs
					.getClass() });
			LOG.debug("Execution de "+clname +".main(");
			for(int i=0;i<arguments.length;i++) {
				LOG.debug(arguments[i]);
				if(i < arguments.length -1)
					LOG.debug(','+"");
			}
			LOG.debug(")");
			main.invoke(null, new Object[] { nargs });
		} catch (ClassNotFoundException e) {
			LOG.error("Impossible de trouver la classe " + clname
					+ " : " + e.getLocalizedMessage());
			setStatus(3);
		} catch (SecurityException e) {
			LOG.error("Erreur de securite pour charger la methode main dans "
							+ clname + " : " + e.getLocalizedMessage());
			setStatus(3);
		} catch (NoSuchMethodException e) {
			LOG.error("Impossible de trouver la methode main dans  "
					+ clname + " : " + e.getLocalizedMessage());
			setStatus(3);
		} catch (IllegalArgumentException e) {
			LOG.error("Argument incorrecte a l'execution de " + clname
					+ ".main() : " + e.getLocalizedMessage());
			e.printStackTrace();
			setStatus(3);
		} catch (IllegalAccessException e) {
			LOG.error("Acces interdit a l'execution de " + clname
					+ ".main() : " + e.getLocalizedMessage());
			setStatus(3);
		} catch (InvocationTargetException e) {
			setStatus(4);
			e.printStackTrace();
		}
	}

	/**
	 * This method may be used to do something with the
	 * content of each loaded jar file before they are put into
	 * the classpath.
	 * 
	 * @param file the File object representing a jar or zip file.
	 */
	protected void handleJar(File file) {
		// NOP
	}

	public String[] getArguments() {
		return arguments;
	}

	public void setArguments(String[] arguments) {
		this.arguments = arguments;
	}

	/**
	 * @return Returns the status.
	 */
	public int getStatus() {
		return status;
	}

	/**
	 * @param status The status to set.
	 */
	public void setStatus(int status) {
		this.status = status;
	}

	/**
	 * @return Returns the loader.
	 */
	public URLClassLoader getLoader() {
		return loader;
	}

	/**
	 * @param loader The loader to set.
	 */
	public void setLoader(URLClassLoader loader) {
		this.loader = loader;
	}
}

-- 
OQube < software engineering \ génie logiciel >
Arnaud Bailly, Dr.
\web> http://www.oqube.com


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


Re: Jar With Dependencies

Posted by Arnaud Bailly <ab...@oqube.com>.
Douglas Ferguson <do...@epsiia.com> writes:

> Sure, I'd love to see that script. 

import java.io.File;
import java.io.FileFilter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Lanceur implements Runnable {

	private static final Log LOG = LogFactory.getLog(Lanceur.class);
	
	/*
	 * the command line arguments array
	 */
	private String[] arguments;

	/*
	 * the exit status
	 * 
	 */
	private int status = 0;

	/*
	 * class loader constructed by this lanceur
	 */
	private URLClassLoader loader;

	public static void main(String[] argv) {
  		if(argv.length == 0)
		   System.exit(1); 
		/* first argument is real lanucher class */
	        String real = argv[0];
                Class realC = Class.forName(real);
		/* shift les arguments */
		String[] nargs = new String[argv.length - 1];
		if (nargs.length != 0) {
			System.arraycopy(arguments, 1, nargs, 0, nargs.length);
		}	
		Lanceur l = (Lanceur)realC.newInstance();
		l.setArguments(argv);
		l.run();
	}

	public void run() {
		/* extraction du repertoire */
		String libdir = System.getProperty("libdir","..\\lib");
		if (libdir == null) {
			LOG.error("Definir le repertoire contenant les bibliotheques : -Dlibdir=<xxxxx>");
			setStatus(1);
			return;
		}
		/* verifications */
		File f = new File(libdir);
		if (!f.exists()) {
			LOG.error("Le repertoire" + libdir + " n'existe pas");
			setStatus(2);
			return;
		}
		if (!f.isDirectory()) {
			LOG.error(libdir + " n'est pas un repertoire");
			setStatus(2);
			return;
		}
		if (!f.canRead()) {
			LOG.error("Le contenu de " + libdir + " ne peut etre lu");
			setStatus(2);
			return;
		}
		/* extraction du nom de la classe principale */
		String clname = System.getProperty("main","Main");
		if (clname == null)
			clname = "Main";
		/* construction du classpath */
		File[] jars = f.listFiles(new FileFilter() {

			public boolean accept(File pathname) {
				return pathname.getName().endsWith(".jar")
						|| pathname.getName().endsWith(".zip");
			}

		});
		int ln = jars.length;
		URL[] urls = new URL[ln + 1];
		/* ajout du repertoire courant par defaut*/
		try {
			urls[0] = new URL("file://.");
		} catch (MalformedURLException e) {
			LOG.error("Impossible d'ajouter . au classpath : "
					+ e.getLocalizedMessage());
		}
		for (int i = 0; i < ln; i++)
			try {
				handleJar(jars[i]);
				urls[i] = new URL("file://" + jars[i].getPath());
			} catch (MalformedURLException e) {
				LOG.error("Impossible d'ajouter . au classpath : "
						+ e.getLocalizedMessage());
			}
		/* chargement */
		loader = new URLClassLoader(urls, ClassLoader.getSystemClassLoader());
		try {
			Class cls = loader.loadClass(clname);
			Method main = cls.getDeclaredMethod("main", new Class[] { nargs
					.getClass() });
			LOG.debug("Execution de "+clname +".main(");
			for(int i=0;i<arguments.length;i++) {
				LOG.debug(arguments[i]);
				if(i < arguments.length -1)
					LOG.debug(','+"");
			}
			LOG.debug(")");
			main.invoke(null, new Object[] { nargs });
		} catch (ClassNotFoundException e) {
			LOG.error("Impossible de trouver la classe " + clname
					+ " : " + e.getLocalizedMessage());
			setStatus(3);
		} catch (SecurityException e) {
			LOG.error("Erreur de securite pour charger la methode main dans "
							+ clname + " : " + e.getLocalizedMessage());
			setStatus(3);
		} catch (NoSuchMethodException e) {
			LOG.error("Impossible de trouver la methode main dans  "
					+ clname + " : " + e.getLocalizedMessage());
			setStatus(3);
		} catch (IllegalArgumentException e) {
			LOG.error("Argument incorrecte a l'execution de " + clname
					+ ".main() : " + e.getLocalizedMessage());
			e.printStackTrace();
			setStatus(3);
		} catch (IllegalAccessException e) {
			LOG.error("Acces interdit a l'execution de " + clname
					+ ".main() : " + e.getLocalizedMessage());
			setStatus(3);
		} catch (InvocationTargetException e) {
			setStatus(4);
			e.printStackTrace();
		}
	}

	/**
	 * This method may be used to do something with the
	 * content of each loaded jar file before they are put into
	 * the classpath.
	 * 
	 * @param file the File object representing a jar or zip file.
	 */
	protected void handleJar(File file) {
		// NOP
	}

	public String[] getArguments() {
		return arguments;
	}

	public void setArguments(String[] arguments) {
		this.arguments = arguments;
	}

	/**
	 * @return Returns the status.
	 */
	public int getStatus() {
		return status;
	}

	/**
	 * @param status The status to set.
	 */
	public void setStatus(int status) {
		this.status = status;
	}

	/**
	 * @return Returns the loader.
	 */
	public URLClassLoader getLoader() {
		return loader;
	}

	/**
	 * @param loader The loader to set.
	 */
	public void setLoader(URLClassLoader loader) {
		this.loader = loader;
	}
}

-- 
OQube < software engineering \ génie logiciel >
Arnaud Bailly, Dr.
\web> http://www.oqube.com


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


Re: Jar With Dependencies

Posted by Arnaud Bailly <ab...@oqube.com>.
Douglas Ferguson <do...@epsiia.com> writes:

> Sure, I'd love to see that script. 

Just to be clear, this is not a script, this is java code for a
wrapper main application that just adds all jars it find in a list of directories
in a classloader then call the real main. I used this as a stable main
entry point for an application assembled with maven-assembly-plugin
which had a set of changing components and as a replacement for a
platform-dependent script. 

For loading jars inside jar:
http://www-128.ibm.com/developerworks/library/j-onejar/

The main wrapper is sent to you by mail.

regards.

-- 
OQube < software engineering \ génie logiciel >
Arnaud Bailly, Dr.
\web> http://www.oqube.com


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


RE: Jar With Dependencies

Posted by Douglas Ferguson <do...@epsiia.com>.
Sure, I'd love to see that script. 
 
----- Original Message -----
From: Arnaud Bailly 
Sent: Wed, 8/23/2006 2:01am
To: Maven Users List 
Subject: Re: Jar With Dependencies 
 
 
Douglas Ferguson <do...@epsiia.com> writes:

> Does anybody have a suggestion for creating a jar with dependencies
> that has all the dependencies exploded?

There is an <unpack> tag in assembly descriptor that does this.
http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

>
> If I send them a jar with dependencies, then they would have to crack
> the jar open, because the classloader won't read a jar within a jar.
>

I think that classworlds can do this. You could also write a simple
wrapper classloader that launches your application. I did this once to
ensure platform-independent classpath resolution as I could not write
a script in windows that would add a list of jars in one lib to
classpath (not an expert rin windows scripting obviously). 
If you are interested by this small snippet, I can send you.

BTW, IBM released recently a tool for doing just that kind of things
(loading jars from jars). Lost references to it.

regards

-- 
OQube < software engineering \ génie logiciel >
Arnaud Bailly, Dr.
\web> http://www.oqube.com


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


Re: Jar With Dependencies

Posted by Arnaud Bailly <ab...@oqube.com>.
Douglas Ferguson <do...@epsiia.com> writes:

> Does anybody have a suggestion for creating a jar with dependencies
> that has all the dependencies exploded?

There is an <unpack> tag in assembly descriptor that does this.
http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

>
> If I send them a jar with dependencies, then they would have to crack
> the jar open, because the classloader won't read a jar within a jar.
>

I think that classworlds can do this. You could also write a simple
wrapper classloader that launches your application. I did this once to
ensure platform-independent classpath resolution as I could not write
a script in windows that would add a list of jars in one lib to
classpath (not an expert rin windows scripting obviously). 
If you are interested by this small snippet, I can send you.

BTW, IBM released recently a tool for doing just that kind of things
(loading jars from jars). Lost references to it.

regards

-- 
OQube < software engineering \ génie logiciel >
Arnaud Bailly, Dr.
\web> http://www.oqube.com


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


Jar With Dependencies

Posted by Douglas Ferguson <do...@epsiia.com>.
Does anybody have a suggestion for creating a jar with dependencies that has all the dependencies exploded?

We have a module that is a composite of a bunch our other modules, the purpose of this is for our client who are using java integration rather than web integration. 

If I send them a jar with dependencies, then they would have to crack the jar open, because the classloader won't read a jar within a jar.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org