Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #12180

Re: is it possible to package a Java application in one jar that includes everything?

From Lew <noone@lewscanon.com>
Newsgroups comp.lang.java.programmer
Subject Re: is it possible to package a Java application in one jar that includes everything?
Date 2012-02-19 22:41 -0800
Organization albasani.net
Message-ID <jhspuk$6qc$1@news.albasani.net> (permalink)
References <jhsau8$8oo$1@speranza.aioe.org> <4f41b474$0$289$14726298@news.sunsite.dk>

Show all headers | View raw


Arne Vajhøj wrote:
> Nasser M. Abbasi wrote:
>> Its been few years since I've used Java, since jdk 1.1 I think,
>> and I'd just like to ask a simple question:

Life has somewhat changed in Java universe since then.

>> Is it possible to package my Java application,
>> including all and any other Java code, that I might have
>> downloaded from the web and used, into one jar file,
>> such that one can just download this one jar file and
>> double click on it on their PC or Linux or Mac, and it
>> will run (ofcourse one needs to have the JRE installed
>> on their end).

Yes and no. The "jar" and "java -jar" commands /per se/ do not carry that 
capability, but you can package things such that they will work.

Besides external packaging products, and Arne's excellent suggestion of Web 
Start, the JAR format is intended as the vehicle to distribute Java 
applications, but it does not pretend to package third-party works for you. 
Nor should you be tempted to unpackage third-party work and package their 
classes into your own JAR. That way lies madness.

If you study the JAR documentation you find the manifest file "MANIFEST.MF". 
One of its elements is "Class-Path:", which specifies where third-party 
libraries go *relative to the JAR* in its final resting place.

So the trick is to package third-party JARs with your JAR in parallel, or 
conventionally, in a "lib/" subdirectory relative to your JAR's deployment.

The rest is packaging. I like ZIP. You put your JAR and all the library JARs 
in a ZIP. It looks like this (from a project I just did as an exercise):

$ cd ~/projects/someproject/
$ ls configurator.* lib/
configurator.jar  configurator.zip

lib/:
log4j-1.2.16.jar
$ unzip -l configurator.zip
Archive:  configurator.zip
Unzip into desired directory, run 'java -jar configurator.jar &' from there.
   Length      Date    Time    Name
---------  ---------- -----   ----
     23197  2012-02-11 19:25   configurator.jar
    481534  2012-02-11 15:40   lib/log4j-1.2.16.jar
---------                     -------
    504731                     2 files
$

Now that ZIP file is a complete distribution package for the 'configurator' 
program.

It is one step away from your request. You have to unpack the ZIP on the 
target machine, say, into "/var/opt/configurator/".

$ ls /var/opt/configurator/ /var/opt/configurator/lib/
/var/opt/configurator/:
configurator.jar  configurator.zip  lib

/var/opt/configurator/lib/:
log4j-1.2.16.jar
$

Now a GUI can run "configurator.jar" with a double click if you associate JAR 
files with the "java -jar" command.

Here's the manifest:
$ unzip -p configurator.jar META-INF/MANIFEST.MF
Manifest-Version: 1.0
Class-Path: lib/log4j-1.2.16.jar
Created-By: Lew Bloch
Main-Class: exercise.ui.ConfiguratorScreen
$

>> I've done something like this before, and I remember using
>> Makefiles and the jar command
>>
>> jar cvf0 myjar.jar .../*.class
>>
>> I assume only *.class files can go into a Jar. Can other
>> jar files go into a Jar file also?

Yes, but it won't help you. In fact, your assumption is wrong. You can put any 
kind of file whatsoever into a JAR file. Why would you assume when you can 
look it up?

>> For example, If I use 3rd party Jar file myself, do I
>> need to extract the content of that Jar file out first,
>> and then jar the resulting tree into my jar file?

NO!

>> Just wanted to check if things has changed, and if
>> there might be now better tools or ways to do this,
>> as I have not kept up with Java.

Things have changed, and there are other tools for other use cases, but really 
nothing better than the JAR, which is magnificent for the purpose.

>> If someone has a good link I can read on this whole topic
>> of building one Jar for an application, and what to
>> watch for, that will help. I am using latest JDK.

Have you considered Googling for that?

Have you considered reading the Oracle Java site? You know, they really do 
have some excellent documentation there. In fact, from the technologies page
<http://www.oracle.com/technetwork/java/javase/tech/index.html>
there's a link right to a whole bunch of stuff about JARs, ion the column 
labeled "Tools and Utilities"
<http://docs.oracle.com/javase/7/docs/technotes/guides/jar/index.html>
Though sometimes (but not always) somewhat superficial, the tutorials are a 
great introduction to all things Java
<http://www.oracle.com/technetwork/java/javase/documentation/tutorials-jsp-138802.html>

I am somewhat surprised you aren't using these resources, as they come from 
the same site whence you get the downloads.

> Java does not standard read jars in jars (you can get special
> classloaders that can do it though).
>
> You can obviously package all the class files you need
> from various external jar files into you jar file.
>
> But I will suggest that you keep your stuff in your jar
> file and the external stuff in their jar files.

Absolutely.

Quite aside from the compelling technical reasons to do things correctly, you 
can have interesting licensing issues if you repackage other people's code 
into your own.

> That enables independent updates of your stuff and the
> external stuff.
>
> And if it is simplicity of distribution you need, then
> take a look at Java Web Start.

JARs in ZIPs aren't all that complicated, and can boldly go where Web Start 
sometimes can't. OTOH, Web Start handles dependencies for you when you can 
rely on a suitable server for distribution.
<http://docs.oracle.com/javase/7/docs/technotes/guides/javaws/index.html>

But OP, all this is pretty accessible on the Java site, even if you aren't too 
terribly familiar with it. In fact, there's a lot more there I haven't even 
had time to suggest, so I suggest that you explore it fully. You'll get much 
better answers more quickly from the material at your fingertips than trying 
to piece it together piecemeal from Usenet posts, and you won't waste 
everyone's time with stuff that is trivial for you to find out.

After that, IBM Developerworks has a ton of useful Java articles.

And remember, GIYF.

-- 
Lew
Honi soit qui mal y pense.
http://upload.wikimedia.org/wikipedia/commons/c/cf/Friz.jpg

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

is it possible to package a Java application in one jar that includes everything? "Nasser M. Abbasi" <nma@12000.org> - 2012-02-19 20:25 -0600
  Re: is it possible to package a Java application in one jar that includes everything? Arne Vajhøj <arne@vajhoej.dk> - 2012-02-19 21:48 -0500
    Re: is it possible to package a Java application in one jar that includes everything? Lew <noone@lewscanon.com> - 2012-02-19 22:41 -0800
      Re: is it possible to package a Java application in one jar that includes everything? Arne Vajhøj <arne@vajhoej.dk> - 2012-02-20 18:44 -0500
  Re: is it possible to package a Java application in one jar that includes everything? Roedy Green <see_website@mindprod.com.invalid> - 2012-02-19 19:02 -0800
  Re: is it possible to package a Java application in one jar that includes everything? Fredrik Jonson <fredrik@jonson.org> - 2012-02-20 20:48 +0000
    Re: is it possible to package a Java application in one jar that includes everything? Lew <noone@lewscanon.com> - 2012-02-20 14:28 -0800
      Re: is it possible to package a Java application in one jar that includes everything? Arne Vajhøj <arne@vajhoej.dk> - 2012-02-20 18:42 -0500

csiph-web