2

I have made a Java Swing application and now I want to export it as an executable jar file. I have created the app in , and it has the following structure : enter image description here where folder mysqlconnector contains also a jar file. I did the following effors : 1. First I tried to export it as a Runnable jar from Eclipse, following the instructions in this link. I created seo.jar, but when I try to execute it from the terminal by java -jar seo.jar I get an error :

Error: Could not find file connectionprops.properties

I checked the jar and I saw that it does not contain the file connectionprops.properties. Even if I add manually connectionprops.properties to my jar file, the problem remains.

2. Then I tried making a manifest file named manifest.mf with contents :

Main-Class: bin.main.MainClass   //also tried Main-Class: MainClass

I placed the manifest.mf in folder seo and I gave the following command in the terminal :

jar -cvfm seo.jar manifest.mf *

After I have created the jar, the command :

jar -tvf seo.jar

gives me the following output :

0 Wed Mar 15 09:13:26 EET 2017 META-INF/
101 Wed Mar 15 09:13:26 EET 2017 META-INF/MANIFEST.MF
0 Fri Dec 09 14:00:06 EET 2016 arial-unicode-ms/
23275812 Fri Dec 09 14:00:06 EET 2016 arial-unicode-ms/ARIALUNI.TTF
2426 Fri Dec 09 14:00:06 EET 2016 arial-unicode-ms/arial-unicode-ms.png
98 Fri Dec 09 14:00:06 EET 2016 arial-unicode-ms/myfontsfree.txt
23275812 Fri Dec 09 13:59:58 EET 2016 ARIALUNI.TTF
0 Mon Mar 13 11:35:16 EET 2017 bin/
0 Mon Mar 13 09:03:32 EET 2017 bin/gui/
5702 Mon Mar 13 09:03:32 EET 2017 bin/gui/GuiFrame.class
73666 Mon Mar 13 09:03:24 EET 2017 bin/gui/img.png
0 Wed Mar 15 09:10:16 EET 2017 bin/main/
1961 Mon Mar 13 09:03:32 EET 2017 bin/main/ReadProperties.class
1007 Mon Mar 13 11:30:24 EET 2017 bin/main/MainClass.class
0 Mon Mar 13 11:29:12 EET 2017 bin/main/resources/
157 Mon Mar 13 11:29:12 EET 2017 bin/main/resources/connectionprops.properties
0 Mon Mar 13 09:03:32 EET 2017 bin/listeners/
5395 Mon Mar 13 09:03:32 EET 2017 bin/listeners/RegisterIdListener.class
5065 Mon Mar 13 09:03:32 EET 2017 bin/listeners/PayIdListener.class
5081 Mon Mar 13 09:03:32 EET 2017 bin/listeners/StarToBirdListener.class
5095 Mon Mar 13 09:03:32 EET 2017 bin/listeners/DeleteStarListener.class
648 Mon Mar 13 09:03:32 EET 2017 bin/listeners/GoBackListener.class
2707 Mon Mar 13 09:03:32 EET 2017 bin/listeners/DeleteListener.class
73666 Mon Mar 13 09:03:24 EET 2017 bin/listeners/img.png
2612 Mon Mar 13 09:03:32 EET 2017 bin/listeners/NewYearListener.class
6023 Mon Mar 13 09:03:32 EET 2017 bin/listeners/PassListener.class
6710 Mon Mar 13 09:03:32 EET 2017 bin/listeners/AllListener.class
3523 Mon Mar 13 09:03:32 EET 2017 bin/listeners/PdfListener.class
7011 Mon Mar 13 09:03:32 EET 2017 bin/listeners/NewStarListener.class
6620 Mon Mar 13 09:03:32 EET 2017 bin/listeners/PaidIdListener.class
2644 Mon Mar 13 09:03:32 EET 2017 bin/listeners/PayListener.class
6737 Mon Mar 13 09:03:32 EET 2017 bin/listeners/GotIdListener.class
6671 Mon Mar 13 09:03:32 EET 2017 bin/listeners/ToBirdsListener.class
5474 Mon Mar 13 09:03:32 EET 2017 bin/listeners/ReportsListener.class
5385 Mon Mar 13 09:03:32 EET 2017 bin/listeners/NewListener.class
2892 Mon Mar 13 09:03:32 EET 2017 bin/listeners/RegisterListener.class
0 Mon Mar 13 11:35:16 EET 2017 bin/META-INF/
53 Mon Mar 13 11:35:16 EET 2017 bin/META-INF/MANIFEST.MF
73666 Mon Mar 13 09:03:24 EET 2017 bin/img.png
0 Mon Mar 13 11:35:18 EET 2017 classes/
0 Mon Mar 13 11:35:18 EET 2017 classes/artifacts/
0 Mon Mar 13 11:35:18 EET 2017 classes/artifacts/seo_jar/
3406481 Mon Mar 13 11:35:18 EET 2017 classes/artifacts/seo_jar/seo.jar
157 Sun Jan 22 18:26:06 EET 2017 connectionprops.properties
2148384 Mon Nov 14 17:22:10 EET 2016 itextpdf-5.5.4.jar
31 Mon Mar 13 09:27:02 EET 2017 manifest.mf
0 Thu Dec 08 14:32:48 EET 2016 mysqlconnector/
960374 Fri Oct 17 08:05:36 EEST 2014 mysqlconnector/mysql-connector-java-5.1.34-bin.jar
1358 Fri Mar 10 09:57:22 EET 2017 seo.iml
0 Wed Mar 15 09:11:32 EET 2017 src/
0 Wed Feb 01 15:01:04 EET 2017 src/gui/
73666 Fri Dec 09 13:56:32 EET 2016 src/gui/img.png
5617 Wed Feb 01 12:15:26 EET 2017 src/gui/GuiFrame.java
0 Wed Mar 15 09:08:44 EET 2017 src/main/
601 Fri Mar 03 19:11:24 EET 2017 src/main/MainClass.java~
1315 Sun Jan 22 18:30:54 EET 2017 src/main/ReadProperties.java
1060 Mon Mar 13 11:30:24 EET 2017 src/main/MainClass.java
0 Mon Mar 13 11:27:02 EET 2017 src/main/resources/
157 Sun Jan 22 18:26:06 EET 2017 src/main/resources/connectionprops.properties
48 Wed Mar 15 09:08:32 EET 2017 src/main/MANIFEST.MF
0 Fri Mar 10 10:55:40 EET 2017 src/listeners/
4761 Wed Feb 01 15:33:12 EET 2017 src/listeners/DeleteStarListener.java
5330 Fri Mar 10 10:55:38 EET 2017 src/listeners/PaidIdListener.java
5268 Fri Mar 10 10:55:40 EET 2017 src/listeners/GotIdListener.java
5233 Fri Mar 10 10:55:40 EET 2017 src/listeners/ToBirdsListener.java
5217 Wed Feb 01 15:33:52 EET 2017 src/listeners/RegisterIdListener.java
405 Wed Feb 01 15:32:56 EET 2017 src/listeners/GoBackListener.java
2361 Wed Feb 01 12:13:34 EET 2017 src/listeners/PdfListener.java
5761 Fri Mar 10 10:55:40 EET 2017 src/listeners/AllListener.java
4700 Wed Feb 01 15:33:30 EET 2017 src/listeners/PayIdListener.java
5165 Fri Mar 10 10:15:20 EET 2017 src/listeners/NewListener.java
4717 Wed Feb 01 15:33:18 EET 2017 src/listeners/StarToBirdListener.java
5222 Fri Mar 10 10:12:06 EET 2017 src/listeners/ReportsListener.java
5922 Fri Mar 10 10:17:32 EET 2017 src/listeners/PassListener.java
73666 Fri Dec 09 13:56:32 EET 2016 src/listeners/img.png
2333 Wed Feb 01 12:13:34 EET 2017 src/listeners/NewYearListener.java
6827 Wed Feb 01 15:33:36 EET 2017 src/listeners/NewStarListener.java
2008 Fri Mar 10 10:14:06 EET 2017 src/listeners/PayListener.java
2162 Fri Mar 10 10:15:20 EET 2017 src/listeners/RegisterListener.java
1982 Fri Mar 10 10:15:20 EET 2017 src/listeners/DeleteListener.java
73666 Fri Dec 09 13:56:32 EET 2016 src/img.png

But when I execute from the terminal java -jar seo.jar I get an error :

Error: Could not find or load main class src.main.MainClass What am I doing wrong? Should I change something in my project structure? Is there a problem that I have other jar files inside my project? How can I create the executable jar and execute it successfully?

Marievi
  • 4,951
  • 1
  • 16
  • 33

1 Answers1

0

Your first approach is fine, but property files cannot be accessed as files in the file system when stored inside a jar-file. You need to access it as a resource on the classpath.

The second approach indicates you built the jar file incorrectly. It is a zip file and you should have a file exactly corresponding to your Main-Class entry. For "foo.Bar" the file "foo/Bar.class" must exist in your jar file (and have the main method).

(EDIT: From the "jar tvf" output, it is very clear that you built the file incorrectly. You have bin/main/MainClass.classinstead of main/MainClass.class).

Thorbjørn Ravn Andersen
  • 73,784
  • 33
  • 194
  • 347
  • `You need to access it as a resource on the classpath.` How can I do this? As for the comment on the second approach... My `MainClass` is in `bin/main` but still when I use this path, the same problem exists. – Marievi Mar 13 '17 at 07:48
  • See this question: http://stackoverflow.com/q/12024672/53897 - Also I would suggest you read up on jar files so you understand the problem. https://docs.oracle.com/javase/tutorial/deployment/jar/basicsindex.html – Thorbjørn Ravn Andersen Mar 13 '17 at 08:51
  • I have also tried this, but the input stream keeps being NULL. – Marievi Mar 13 '17 at 08:57
  • Then your resource name is wrong. You must get it exactly right. There is very little help from the system here. – Thorbjørn Ravn Andersen Mar 13 '17 at 09:10
  • I created a folder `resources` under `src` folder, and tried `prop.load(MainClass.class.getClassLoader().getResourceAsStream("../../resources/connectionprops.properties"));` . Is it wrong? – Marievi Mar 13 '17 at 09:12
  • Yes. It is not a file name but a name on the classpath. Try either "connectionprops.properties" or "/connectionprops.properties" depending on your code. You MUST understand how this work, i.e. how class loaders work, like many new programmers before you, because class loader problems are _hard_. – Thorbjørn Ravn Andersen Mar 13 '17 at 09:22
  • I tried both of what you propose but they didn't work either. Thanks for your help though! – Marievi Mar 13 '17 at 09:24
  • Is the property file even in the jar file? – Thorbjørn Ravn Andersen Mar 13 '17 at 09:46
  • When I add it in the `resources` file that I create (and actually placed it under `src/main`) yes, it is. – Marievi Mar 13 '17 at 09:52
  • Then you just need to get the resource name right. You may want to show the output of "jar tvf ..." on your jar file. – Thorbjørn Ravn Andersen Mar 15 '17 at 05:57
  • Your jar file is broken. – Thorbjørn Ravn Andersen Mar 15 '17 at 07:38
  • How did you understand that? What should I do differently? – Marievi Mar 15 '17 at 07:43
  • Lets revisit. You need to demonstrate what is inside your jar. This is done with "jar tvf ..." (not as you did with "jar cvf"). The relative paths inside the jar are very, very important. – Thorbjørn Ravn Andersen Mar 15 '17 at 09:27
  • Sorry for the late reply, I had been off for a few days. I edited my post with the command you proposed. – Marievi Mar 20 '17 at 09:26
  • Please see updated answer. I would suggest again that you follow the Oracle tutorial - a more suitable link is https://docs.oracle.com/javase/tutorial/deployment/jar/index.html – Thorbjørn Ravn Andersen Mar 20 '17 at 11:31
  • I have tried `bin.main.MainClass`, `main.MainClass` and `src.main.MainClass` but the same error appears in all cases. I did all this following this tutorial, but nothing :/ Sorry for bothering you for so long. – Marievi Mar 20 '17 at 11:50
  • If the class is "main.MainClass" (i.e package main and "MainClass.java") it _MUST_ be present in the jar file as "main/mainClass.class". Nothing else will do! Keep experimenting with the jar command (and a zip file viewer) until this happens. – Thorbjørn Ravn Andersen Mar 20 '17 at 13:01
  • But it is present : `src/main/MainClass.java`. – Marievi Mar 20 '17 at 13:20
  • Can you see the difference between `main/mainClass.class` and `src/main/MainClass.java`? One is a file containing compiled byte code and the other one is a file containing uncompiled Java source. Please go back and do it again! Now is the time for you to demonstrate that trying to help you is worth the effort! – Thorbjørn Ravn Andersen Mar 20 '17 at 14:06
  • But I already stated in my post and in a comment above that I have tried `bin.main.MainClass`, `main.MainClass` and `src.main.MainClass` but nothing! Of course I am making an effort. – Marievi Mar 20 '17 at 14:11