80

So I will be using Java Web Start to deploy the java application. When exporting to a Runnable Jar, there are three options in eclipse Helios.

  • Extract required libraries into JAR
  • Package required libraries into JAR
  • Copy required libraries into sub folder next to JAR.

What are differences, and how will they affect my .jnlp file?

If it's a single jar, isn't it easier because I wouldn't have to write all the different paths to all the libraries it uses?

If there are changes in both the library and the application, a single jar would be a better solution? Or would I need <jar href=''> for each individual libraries?

Also note that I need to make use of native libraries like .dll and .so files.

GEOCHET
  • 21,119
  • 15
  • 74
  • 98
KJW
  • 15,035
  • 47
  • 137
  • 243

1 Answers1

144
  1. Extract required libraries into JAR - Extracts the actual .class files from the libraries your app uses and puts those .class files inside the runnable JAR. So, the runnable JAR will not only contain the .class files of your application, but also the .class files of all the libraries your application uses.

  2. Package required libraries into JAR - Puts the actual JAR files of the libraries into your runnable JAR. Normally, a JAR file within a JAR file cannot be loaded by the JVM. But Eclipse adds special classes to the runnable JAR to make this possible.

  3. Copy required libraries into sub folder next to JAR - Keeps the library JARs completely separate from the runnable JAR, so the runnable JAR will only contain the .class files of your application.

Option #2 is convenient because it packages everything neatly into a single JAR, and keeps the library JARs separated from your application's .class files.

However, a downside to packaging everything inside of a single JAR (options #1 and #2) is that, if you update your application, then the user will have to download more data to update the application. If the JARs are kept separate, then the user would only have to download the JAR that contains your application code, instead of a single, massive JAR that contains your application code and all the library code.

Michael
  • 34,873
  • 17
  • 75
  • 109
  • Curious, what about just creating a jar that is not runnable? is there any difference? – KJW Dec 01 '11 at 21:20
  • 10
    @KimJongWoo You can "execute" runnable JARs like this `java -jar myjar.jar` because the JAR defines the location of a `main()` method in its "META-INF/MANIFEST.MF" file. The "Main-Class" setting inside of this file defines the class that has the `main()` method. "Normal" JARs tend not to have this setting, so you can't "execute" them in the same way. – Michael Dec 02 '11 at 02:30
  • 1
    @Michael, Well for deploying standalone applications (no version update), wouldn't option 1 be the obvious choice? It also seems to be the lean-nest solution and cost the least bytes isn't it? – Pacerier Jul 25 '14 at 07:50
  • 1
    Is a jar with extract faster than package?? In loading speed and executing – Developer66 Jan 05 '18 at 13:43
  • 1
    @Developer66 My guess would be that any performance differences are negligible. – Michael Jan 05 '18 at 15:07
  • I still don't completely understand the difference between #1 and #2 – derHugo Jan 07 '19 at 11:50