views:

85

answers:

5

Hi

I've built a nice little Java App and created a JAR file and deployed it. The App uses external JARs such as the Log4J JAR. My question is this: When creating my JAR file, how do I include all external dependent JARs into my archive? In order to get my App working, I'm having to copy the Log4J JAR into the same directory as my own JAR which kinda defeats the object. Wouldn't it be more elegant to have 1 single JAR file to deploy? I'm still a newbie to all this so please forgive my ignorance :)

Thanks to all in advance

Cheers

John

+2  A: 

You could use something like One-JAR to package your Java application together with its dependency into a single executable Jar file (One-JAR uses a custom classloader to make JARs nesting possible).

Pascal Thivent
A: 

You have to expand the library jars into the same place where your compiled classes go, then make a jar from that. Depending on how your build process is set up, there may be multiple ways to achieve this. It's not rocket science - a jar is just a zip archive with a META-INF directory at the root level.

Mike Baranczak
A: 

A JAR is not itself capable of nesting other JARs, as you discovered.

Traditionally, one would distribute a ZIP archive or other installer that would unwind the application JAR (yours) as well as any support JARs in the appropriate location for classpath access. Frequently, then, the application was invoked through a script that invoked the primary JAR and created a classpath that listed the support JARs.

As other posters have noted, you have some options to create a super-JAR if that's what you want.

RonU
A: 

You can use Maven + assembly plugin (http://maven.apache.org/plugins/maven-assembly-plugin/)

BTW, probably that's not the easiest way, if you did not work with maven.

Kel
A: 

Keeping JAR separate is better as it is easy to upgrade only the specific JARs to its new versions without touching any other configuration. As of your issue of having to copy each file to same location as of your JAR, you can always use Java CLASSPATH and include any JAR to your application's class path.

Ashish Patil