exporting java app as jar which contains other libraries - java

I have exported my simple java application as normal jar file which contains all the source file and the dependent libraries ie jar files.
Here all the jars I have kept inside the lib folder of my application.
so these things I am able to do but when I am accessing my application as a jar file in other application then I am getting ClassNotFoundException because whatever libraries I have added inside the First application (which I have exported as jar contains all the dependent libraries) are not visible in runtime.
I think I need to give this information about the dependent libraries in MANIFEST.MF file of first application.
but I don't know whether I am thinking right or wrong.
I don't know how to write the MANIFEST.MF file and what would be the directory structure of the of my application if I want to keep the MANIFEST.MF file in my application.
Here for example I have created one jdbc application to create Connection object for that I had to add the ojdbc14.jar in the classpath of my application so for that I have created one lib folder inside the project root directory and I kept that ojdbc14.jar inside that lib folder and then I build the path.
then I exported this application as simple jar which contains that ojdbc14.jar also then I added this jar in my other application but while running my second application I am getting ClassNotFoundException.
Please Help Me On It.

Related

Changing the classpath order in play framework

Some time back, I had written a library in java-play.
I wanted to re-use this library, so I added in my sbt dependencies.
But the problem is, I had to modify a couple of files and I don't have source files (only jar).
So I have created classes with same class name and package name and added it to my new project.
But when I run my project, it still picks up my old file.
If it was Java world, I would have modified my classpath file and everything would have been fine, but this is play framework.
When I looked more into this issue, I landed at this.
A play application classpath is built as follows (in this order):
The /conf directory for the application The
$PLAY_PATH/framework/play.jar All jar files found in your application
/lib directory All jar files found in the $PLAY_PATH/framework/lib
directory
Is there a way to change the classpath, so that it picks my file first and then the libraries?

diffrence between adding jars files in lib folder and setting it in classpath

could you please explain the difference in addng jars in lib folder and adding jars to classpath .
are both just a way to add jars(anyone will work) or is there any difference ?
I tried searching but couldn't find any answer.
If you have a web application project that bundles into a WAR, then adding the jar files into WEB-INF/lib will automatically put all these jar in the classpath of the application when being deployed in a servlet container (Jetty, Tomcat) or in an application server (GlassFish, Wildfly). Note that these libraries will only be available for your single application being deployed, not for any other app deployed in this server.
If you have a simple jar with a lib folder inside it, then adding any jar into this folder will do nothing. For jar files that must be executed on their own, you need to specify the libraries to use in the classpath, otherwise your jar will not run. For this case, it will be better to have the libraries inside a lib filder outside the jar, so you could reference them in the MANIFEST file. On the other hand, you may use maven to generate a fat jar.
If you are using any third party jar files then you need to add it in classpath because you java application tries to find out the class which you are using in you app.
Adding jars in classpath means you are explicitly adding the jar files in classpath at the time of execution.
Adding jars in lib folder will be done in eclipse will internally add the jar files in classpath at the time of execution.
To verify both the things execute the following command
ps -eaf | grep -i java
which will display your app with the dependencies(jar files) in classpath.

How to create Jar file with external folders and Jars

I made a simple standard-lone java Application using Spring,Apache Camel,Activemq for processing messages.
Note: My Application don't have any GUI.
My project structure is in the following way.
SACLib folder have nearly 70 external jars(all Spring,Camel and Activemq corresponding jars).
It's working fine in Eclipse. SO Now We want to deploy into Jar file.I tried in Eclipse,But I didn't seen Rod1,Rod2,Copy1 and SACLib folders in my Jarfile.
after Deploying Jar, If I run FirstConsumer.java it runs Rod1-->ThMapInfratab1-2.exe file. For this I mention Real paths of .exe file.
How can I make Jar file with including all my folders.
Thanks
Well, this is a kind of work that is typically done with build automation tools like Apache Ant, Maven or Gradle, so you can investigate there if you want to make this happen automatically next time.
But, if you want to do it manually...
First, you project needs a META-INF folder where you will place a file called a MANIFEST.
That manifest contains a Main-Class entry pointing to you main class. You can read about this in the Java Tutorial: Setting Application's Entry Point.
But it can also contain a Class-Path entry, pointing to all other jars required by your application and that should be loaded by the executable jar.
You can read about it the Java Tutorial: Adding Classes to your Jar Class Path.
If you are building your executable jar with Eclipse, it will let you choose the MANIFEST file that you want to use during the creation process.
Now, if you want to use build automation tools, there are other answers here that explain how to do it:
Creating a bundle jar with ant
How to create executable jar with dependencies with Maven
How to export an executable jar in Gradle
simply using ant download it , and then make a build.xml file and put it
Here's an simple example of an ant target that will create a jar (named test.jar) that includes all jar files under the lib directory. Maybe this will solve your problem?
for using apache ant, see this
http://ant.apache.org/manual/using.html

How to make jar file created by netbeans work from any location in the system

I have a java desktop application in netbeans. I have created an executable jar file for the project using clean and build command provided by the netbeans. By using this command the executable jar file gets created under netbeansProjects//dist/.jar. I am able to execute this jar file from command line using java -jar .jar from within project path. But the problem is that when i move this jar outside of netbeans projects folder, say to desktop and run the jar file, it is giving error of type "Exception in thread "main" java.lang.NoClassDefFoundError". How to solve this problem and make the jar file executable from any location of the system.
Complete instructions may be found in dist/README.TXT:
To distribute this project, zip up the dist folder (including the lib folder)
and distribute the ZIP file.
Ensure that the manifest inside of the jar file contains the necessary classpaths. If you are unfamiliar with the concept, go here: http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html
Netbeans has probably included any external projects/libraries/Jars in the dist/lib folder.
In order to run the application, you must include all the files in the dist folder when you copy the application
Check if in your projects Manifest.mf file has the Attribute
"Main-Class" set to your projects current main Class file.

I need some help concerning using 2 jar files in Java

Well I have 2 .jar files. The main jar file is the jar file for my whole project and the other .jar file being the MySql JDBC Connector.
Well basically whats happening right now is that when I build the project I have the one main .jar file with everything but the MySql JDBC Connector .jar file is inside the main jar file when it builds in NetBeans.
Now when I am just running the project from within NetBeans the MySql JDBC driver can be found inside the src/com/game/mysql folder that I have it in. But when I build the project the Java application cannot locate the JDBC driver from within the main jar file.
When I open the main jar file with WinRar I can see that the JDBC jar file is still in its /com/game/mysql/ folder. But why cant the Java application access it?
I have heard that nested .jar files are not supported in Java so Im thinking this might be the reason although Im not sure if thats true. Is there a way that I can make it so that the application can find the JDBC .jar file within the main jar file?
Also I have done the thing in NetBeans where you add the .jar file through right clicking project -> properties -> Library -> Add Folder/Jar. Thats what makes it work in the NetBeans run but still not the App build.
I have heard that nested .jar files are not supported in Java
More precise, classes in a JAR file which is packaged as a child JAR inside a main JAR are indeed by default invisible to classes in the main JAR.
You have basically 2 options:
Ship your application with 2 loose JARs: your.jar and mysql.jar and define the relative path to the mysql.jar in the Class-Path entry of the MANIFEST.MF file of your.jar.
Class-Path: mysql.jar
When you put both JARs in the same folder and execute your.jar by java -jar your.jar, then it will work.
Let your IDE repackage all loose classes of mysql.jar inside your.jar or add a special classloader which preloads the classes of any embedded JARs. Since I don't do Netbeans, I can't tell whether it supports it and if so, how to do it. In Eclipse, however, this is definitely possible. See also this answer.

Categories