First off: This is an Impatient Guide and it will be short on explanation and possibly accuracy

Second off: This method is a first attempt and is probably fraught with errors and inefficiencies, but it worked for me.

Let's get started!

Say you have a LibGDX project and you want to package it up for redistribution, but you don't want to give out a jar and would like it to be wrapped in a nice executable (.exe) just like any ordinary Windows binary.  In addition, obfuscating the code to make reverse engineering more difficult might be something you want too.

Here's how I did it manually with Eclipse, ProGuard, Launch4j, and 7-zip.

Creating the JAR files:

  1. Export a jar file with the Eclipse Export Wizard.  I did this for my desktop version, by right clicking on the project "myapp-desktop" -> Export -> Java -> Runnable Jar File.
  2. Plug in the usual stuff into the wizard, but choose "Copy required libraries into a sub-folder next to the generated JAR."  Otherwise, ProGuard will make your life a nightmare when you try to obfuscate (e.g. "Warning: org.lwjgl.input.Controllers: can't find referenced class").
  3. Hit "finish" and the wizard will generate your shiny new .jar file.
  4. Do 1 through 3 again, but in step 2 choose "Package required libraries into generated JAR."  The jarinjarloader files and the MANIFEST.MF from this second generated JAR will be used later on.

Obfuscate your jar with ProGuard:

  1. Run the GUI version of ProGuardjava -jar proguardgui.jar
  2. In the Input/Output tab, click "Add input..." and enter the first generated JAR path.
  3. Click "Add output..." and enter your output JAR... say (e.g. output.jar).
  4. Click "Add..." in the Add libraries section and add the library export directory generated with the first JAR.  If your export JAR name was foo.jar, the export dependencies should be in foo_lib.
  5. In the Obfuscation tab uncheck "Use mixed-case class names."
  6. Keep the default settings for now (you can tweak them later once you have this working).
  7. Start processing the JAR.  In the Process tab click Process!
  8. If ProGuard finishes it will produce a nice obfuscated/shrunk JAR, output.jar.

Combine library dependencies into obfuscated JAR

  1. The output.jar is not runnable as is.  It needs to know how to find the library dependencies.  You can pack the dependencies into the JAR with 7-zip.  So, open output.jar in 7-zip.
  2. Add/drag the contents of foo_lib (from step 2 in the first section) into the root level of the JAR (e.g. they should be in the same directory META-INF is in).
  3. Extract the other JAR from the first section (see step 4) into a temp directory (e.g. temp).
  4. In output.jar, clobber the file "META-INF/MANIFEST.MF" with the file from "temp/META-INF/MANIFEST.MF".
  5. In output.jar, add the directory "org/eclipse" from "temp/org/eclipse".
  6. Confirm the JAR is runnable: java -jar output.jar

Wrap your JAR in a Windows executable

  1. Use Launch4j to wrap your JAR.  Open the Launch4j GUI.
  2. Add your output file: out.exe
  3. Add your input JAR file: output.jar
  4. In the JRE tab, set the Min JRE version (e.g. 1.6.0)
  5. Click the gear icon to build the wrapper.
  6. Confirm the binary works.  High Fives all Around!
comments powered by Disqus