Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!news.albasani.net!.POSTED!not-for-mail From: Lew Newsgroups: comp.lang.java.programmer Subject: Re: is it possible to package a Java application in one jar that includes everything? Date: Sun, 19 Feb 2012 22:41:26 -0800 Organization: albasani.net Lines: 161 Message-ID: References: <4f41b474$0$289$14726298@news.sunsite.dk> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Trace: news.albasani.net uoJaEX+W/fBQc0Ctqqlas0AnSawDUno1x2ZHsVl2pEDMcmB9+da6KGozG5DHrmFR6it/fAA+xHAYWBEQn/pX6Ve7fn2sS0kLjle0etPHiKUihRJMmnQP4KH2xBzyveyU NNTP-Posting-Date: Mon, 20 Feb 2012 06:41:24 +0000 (UTC) Injection-Info: news.albasani.net; logging-data="k9kLsMbJ5exPPL8oq/90VQ8f7opuczVX4EJhB0MABTmg9H3s5HmKOmqEzTpubweDLyOXHiBjIinYfW08IiXCN0yKZSvzzvnfqFOP2RVcD5W47C3clBOXp6phOln4okV6"; mail-complaints-to="abuse@albasani.net" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.2) Gecko/20120216 Thunderbird/10.0.2 In-Reply-To: <4f41b474$0$289$14726298@news.sunsite.dk> Cancel-Lock: sha1:5S1gOSEvKHtDs/zijUL6SKRdZA4= Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:12180 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 there's a link right to a whole bunch of stuff about JARs, ion the column labeled "Tools and Utilities" Though sometimes (but not always) somewhat superficial, the tutorials are a great introduction to all things Java 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. 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