How to generate an executable .jar from an Eclipse plug-in project? - java

I have created an eclipse plug-in project that runs correctly and that can be deployed to a windows exe. However I need to be able to run this application on other platforms, so I would like to generate an executable .jar file of the application. The problem is that I have searched everywhere and all the methods of doing this require a "Main" class that contains a main method to be provided. Because my project is a plug-in project it makes use of an "Application" class that is generated by eclipse to kick start the application, and therefore does not contain a "Main" class that can be referenced. If i neglect to reference it a jar gets generated, but it won't run because it gets the "Failed to load Main-class manifest attribute" error.Is there a way to get around referencing a main class to create an executable jar?

The idea doesn't help, because the "eclipse.exe" is not the only OS-dependent file in your distribution: the SWT libraries can't be used on other platforms too.
With eclipse you'll have to build your application for different platforms from within eclipse.

It's not exactly clear to me what you want to accomplish. A plug-in by its very definition can't run on it's own. You always need the framework in order to execute it. Basically you can do two things:
If you intend to distribute the plug-in for others to use, you can export the plug-in from the Overview tab of the plugin.xml editor.
If you want to run the plug-in on its own in an instance of the Eclipse platform, you have to create a .product file that describes which plug-ins your application needs, what its name is, splashscreen etc. Eclipse has an editor that helps you setting up that file. This creates a platform specific launcher with which you can easily run the application on the desired platform. Depending on your target platform you might need to install a delta pack.

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_22-b04 (Sun Microsystems Inc.)
Class-Path:
X-COMMENT: Main-Class will be added automatically by build
Main-Class: javaapplication2.JavaApplication2
in your jar "META-INF" create folder
name file MANIFEST.MF append above content
point your main class file

Related

main class inside inner jar

I am trying to build an installer for a couple of Java Maven projects (using Eclipse). I would like to use maven assembly to produce a jar file (henceforth big-fat jar) which contains all the installation files (JARs + docs + others) as well as the installer JAR (the result of building the installer project). I want the installer to unpack the big-fat jar and therefore I want the main class to be included in the installer jar. The user will get the big-fat jar and I want java -jar big-fat.jar to execute the main inside installer.jar. To recap, here is the structure of the big-fat jar:
big-fat-jar:
--installer.jar
--application.jar
--readme.doc,
--META-INF:
----MANIFEST.MF
where installer.jar is the Java program which unpacks big-fat-jar and contains main, application.jar is the application being installed (there may be multiple jars or wars instead of just one application.jar) and readme.doc stands for any docs. My question is: what do I do to make the main inside installer.jar be called when the user executes java -jar big-fat-jar? I read on other posts that OneJar may be helpful but I am not sure how to indicate that main resides inside the inner jar.
I have never tried this with a jar inside another jar as you have described but I think it could work if you specify this in your Manifest.txt file. You could do this like so:
Manifest-Version: 1.0
Created-By: StackOverflow
Main-Class: installer.MyClass
In the example above the MyClass file will have the main method that will be called when running java -jar <jarname.jar>
Please see the top of this page for more information: https://docs.oracle.com/javase/tutorial/deployment/jar/appman.html
Head First Java by Sierra and Bates also goes over how to do this with a class but not a Java jar inside another Java jar.
I hope this helps.
Thank-you for reading this.

JAR file of java application is not working

I have written a java application in eclipse and then I have made its runnable JAR file, but the problem is that the application is not opening when I click its JAR file to open it, but the application is opening and running perfectly when I open it in the eclipse, I have made the JAR file number of times again and again but I am facing the same issue every time, no error is shown when I click the JAR but it is not opening.
So please tell what can be the problem with the JAR file.
Any number of things can be wrong with a jar file that prevents you from being able to run it after you create it. Some things to check:
Do you have java associated with your jar file?
Did you specify a main class when you built your manifest?
Are there dependent library jars your application depends on that did not get added to the classpath? The manifest file in your jar file should tell you any additional classpath entries that were generated.
Do you get an exception when you run it from command line?
You can run it two ways:
java -cp [path to your jar] your.package.MainClass
java -jar [path to your jar]
See if any of these are your issue and it should point you to the solution to your problem.
When you generate a JAR file, it doesn't mean something is going to happen, maybe it is just a library you generated, a reusable module of the system, etc.
"JAR (Java ARchive) is a package file format typically used to aggregate many Java class files and associated metadata and resources (text, images, etc.) into one file to distribute application software or libraries on the Java platform." - Wikipedia
So, Make sure you have a main class in your manifest, for example:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 16.3-b01 (Sun Microsystems Inc.)
Main-Class: com.example.MainClass
Class-Path: lib/lib1.jar lib/lib2.jar

How to customize java options of a independent netbeans application?

i'm developing an application using Netbeans RCP. I have added an option to add a jar to my class path in the project.properties file of my platform:
run.args.extra=-cp:a ./appclient/glassfish/lib/gf-client.jar
The problem i encounter is that is does work when i run it from the Netbeans IDE but not when i try to create a independent application (build for Mac OSX for instance). I hear that the project.properties is no longer taken in account when you run an independent application and of course my appclient directory containing the jars does not exist anymore in the application package (so my jar is not added to class path).
How can i make this -cp option works for my independent Mac OSX application?
EDIT: i was able to create a custom conf file for my independent platform but i can't find a way to add my jar to the class path, i don't know what options to use.
EDIT: i found that i need to you endorsed mechanism to achieve it. So i have added the following command to my app.conf file:
J-Djava.endorsed.dirs=/Users/altanis/appclient/glassfish/lib/gf-client.jar
But when i run the .app (mac application), i get this error:
-J-Djava.endorsed.dirs=/Users/altanis/appclient/glassfish/lib/gf-client.jar: No such file or directory
The path is correct. Do i need to make something special to make the JVM aware of this? I followed this tutorial and somewhere in the comments the author says:
Right, but the package-appclient copies everything for you and you
should be able to put it on the classpath using the endorsed
mechanism. Unpack the jar created by that and add everything you need
from there (the jars) to your application installer. Then you can use
the endorsed (-J-Djava.endorsed.dirs=${GFCLIENT_PATH}) mechanism in
your app.conf to put it on the application classpath. This way you
should be able to deploy it together with your client.
I think, that create a new library is the better way.
Create module type library with required jars
In your module add dependency to created module (type wrapped library)
You must add entry Class-path to you application's MANIFEST.MF
For example
Class-Path: apache-commons-2.1.jar ejb-api-3.0.jar
all this jars should be in the root directory of your application
Your appliction should have next structure
MyApplication.jar
/META-INF
/META-INF/MANIFEST.MF
/apache-commons-2.1.jar
/ejb-api-3.0.jar
/com/package/classes
or you can use jar tool of JDK to create a jar
read more here Oracle doc

Having trouble exporting runnable JARs from Eclipse

Jar available at http://dl.dropbox.com/u/10919879/roller.jar
After writing and testing my program with Eclipse's built-in run Utilities, I decided it was time to export and distribute. So I go to File>Export>Runnable JAR and designate the class whose main method I want to invoke. Everything seems to be going off without a hitch, until I try to actually run the JAR.
Error: Could not find or load main class C:\Users\Matt\Documents\My Dropbox\Publ
ic\roller.jar
Contents of roller.jar
dice/Roller$RollData.class
dice/Roller.class
META-INF/MANIFEST.MF
contents of META-INF\MANIFEST.MF:
Manifest-Version: 1.0
Class-Path: .
Main-Class: dice.Roller
What's going on, and how do I fix it?
It's not a problem with your jar. It's a problem with OS setting that launches jar files incorrectly. I don't know if currently on Windows after installing Java it will be correctly configured automatically and why it isn't on your system. It may require editing registry to set jar files to be launched with java -jar command.
You can use application that converts JARs to EXEs if you're going to distribute it only to users with Windows.

NoClassDefFoundError with Executable Jar

Probably a very usual problem with exec jar. I am trying to create and run an executable jar and its driving me crazy.
I have couple of classes(with package stmts), one of which has a main method, a simple empty constructor and ofcourse few biz methods, these form part of a small eclipse project.
I am bundling both these and a manifest file into a jar(arc.jar) using a build.xml. My program uses jdom library and also references from one of my other eclipse projects, so I am including both the jdom libray and other biz library while building my arc.jar.
This is the Manifest.MF I wrote, there is a new lineafter Main-Class
Manifest-Version: 1.2
Class-Path: jdom.jar other.jar
Main-class: uk.co.Art
When I unzip this arc.jar, it contains jdom.jar, other.jar, META-INF/Manifest.mf and the package with my classes.
Funnily, the Manifest file in jar looks like this -
Manifest-Version: 1.2
Created-By: 14.2-b01 (Sun Microsystems Inc.)
Main-class: uk.co.Art
Class-Path: jdom.jar other.jar
I got the ClassNotFoundException ClassNotFoundException: uk.co.Art when the value of Main class was without the package. With package the error changed to ClassNotFoundException: org.jdom.JDOMException.
So just for testing purpose, I tried giving the fullpaths with c:\ for both my executing class and the jars but still it is not able to locate the main class, errors out ClassNotFoundException: uk.co.Art.
I cant seem to understand why.
The command line I am using is - java -jar Arc.jar
The version on cmd prompt is -
java version "1.6.0_16"
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) Client VM (build 14.2-b01, mixed mode)
while the eclipse installed jre is jre6
What can you folks suggest ?
Alex' solution did solve the problem for local execution.
I am also thinking of another way(as an extra option) of execution, to deploy the Arc.jar on server and run a batch on that machine which basically sets the java classpath and then calls either the jar or directly the class whichever way it works. But its only an option, not a preferred one though.
Or, also, set that classpath in my manifest and build jar locally and deploy on the server.
Would like to try out a few things though. But now I understand that the basic problem was jars into jar and hence classpath issue.
Thanks a lot folks.
You cannot bundle other JAR's in a JAR. They have to go in the same folder or at least in a folder relative to the Arc.jar. You specify then its relative path in the Class-Path entry.
Eclipse however has an useful export tool which allows you to embed the contents of other JAR's in your JAR so that you don't end up with multiple loose JAR's which are required to be placed in a specific location. Check the 2nd Library Handling option when you choose Export > Runnable JAR file.
When choosing Package required libraries into generated JAR, then Eclipse will add a special classloader which will load those JAR's transparently for you before executing the main class. It's doing that with help of JarRsrcLoader.
You do not have to pack your additional jars into your jar. These jars should be in the same directory as your application jar. By other words: put all jars into one directory and run. Everything will work.
Reasons: think what does executable jar mean. If you jar is not "executable" you run it as following:
java -cp art.jar;ldom.jar;other.jar uk.co.Art
when your jar is executable you use the following command line:
java -jar art.jar
No magic: jvm opens manifest and takes name of main class and other jars from there and virtually creates command line like first one. Now you understand that all jars in your case must be in the same directory.
Maybe the .jar is corrupt, like sometimes happened to me. Take a look at this.
Just couple of things to be noted when exporting.
JRE associated to the project is consistent with the JRE that would be used to run it.
Please export your project into a local drive, then move it into any shared drive (this fixed my issue).
Thank you.

Categories

Resources