Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The magic behind the eclipse generated executable jar file

I can make a executable jar file with Eclipse. Let's say it is called ast.jar, and the Main class is ASTExplorer. I can verify that this works with java -jar ast.jar.

Then, I unzip the jar file in a separate directory and verify that the ASTExplorer is in astexplorer directory. But when I executed this command java -cp . astexplorer.ASTExplorer I get this error.

java -cp . astexplorer/ASTExplorer
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Composite
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)

The thing is that there is no org/eclipse/swt directory in the jar file.

Directory screenshot

What's the magic behind the executable jar file? Why doesn't it run when unzipped?

like image 694
prosseek Avatar asked Sep 24 '12 21:09

prosseek


People also ask

What is an executable jar file?

A Java Archive, or JAR file, contains all of the various components that make up a self-contained, executable Java application, deployable Java applet or, most commonly, a Java library to which any Java Runtime Environment can link.

What are jar files in Eclipse?

The Jar File wizard can be used to export the content of a project into a jar file. To bring up the Jar File wizard − In the Package Explorer select the items that you want to export. If you want to export all the classes and resources in the project just select the project. Click on the File menu and select Export.

How do I create an executable jar file?

Right click on your Java Project and select Export. Select Java -> Runnable JAR file -> Next. Select the Destination folder where you would like to save it and click Finish.


1 Answers

When Eclipse packages a runnable jar, it includes the dependencies as nested jar files, and also includes a special classloader that understands how to find classes in nested jars. It works only with nested jars and when you extract everything you prevent it from working.

I've looked in an Eclipse-produced runnable jar, and here's what I think you'd need to do:

  1. Extract everything to a directory. The dependency jars are extracted at the top level directory
  2. Delete the org/eclipse/jdt/internal directory
  3. Run your main class from the top level directory with

    java -cp .;dep-jar;dep-jar;... your.main.class

I tried this with a runnable jar I happen to have lying around and it works. Step 2 isn't strictly necessary.

like image 130
Jim Garrison Avatar answered Nov 15 '22 10:11

Jim Garrison