Petr Fořt Fru-Fru
Petr Fořt Fru-Fru

Reputation: 996

Package structure and jar file with manifest

Let's say I have the following "project" structure.

*Root/
     - manifest.txt
     + com/
          + mypackage/
                     + example/
                              - MyClass.java
                              - MyClass.class

I know from the docs.oracle.com documentation that the manifest file must be written in the UTF-8 character set and that there must be a space after each colon, and a carriage return ('\r') or a new line ('\n') before save file.

/* ** MANIFEST.TXT ** */

Manifest-Version: 1.0 
Class-Path: . 
Main-Class: com.mypackage.example.MyClass

/* ** END OF MANIFEST ** */

Creating an executable .jar file using cmd from the root directory.

CMD:

jar -cvfm out.jar manifest.txt com/mypackage/example/*.class

OUTPUT from CMD:

added manifest adding: com/mypackage/example/MyClass.class(in = 648) (out= 445)(deflated 31%)

Now I'm trying to run the newly created jar file from the root directory:

java -jar out.jar

OUTPUT from CMD:

Error: Could not find or load main class com.mypackage.example.MyClass

I can't get to the goal despite the last problem. What am I doing wrong??? Thank You.

Here is a screenshot of the screen and cmd.:

Here is a screenshot of the screen and cmd

Upvotes: 1

Views: 844

Answers (2)

Samuel Marchant
Samuel Marchant

Reputation: 320

Class-Path: com.mypackage.examples Main-Class:My class

On Unix don't forget to set the .jar executable permission.

And alternate with no manifest.

Java -cp thejar.jar com.mypackage.examples

Don't forget the main class must have a public static void main(String args[]) method to start the class.

Upvotes: 1

rzwitserloot
rzwitserloot

Reputation: 102862

As you described it, you will get a running jar, and therefore, what you described is not an accurate representation of what you did.

A few steps to check:

  1. Did you paste the complete error message? For example, maybe the error message includes the note Caused by: java.lang.NoClassDefFoundError: MyClass (wrong name: com/mypackage/MyClass) or something along that vein. Then the problem is: Your MyClass.java needs to start with package com.mypackage.example;, it needs to contain class MyClass with that exact casing, and it needs to be called MyClass.java with that exact casing.

  2. Did you actually do all the steps exactly as you laid out in your question? I did, and it works fine. This isn't one of those 'works on one machine and may not work on another' kind of scenarios, which is why I conclude you didn't. For example, if you include just MyClass.class and not com/mypackage/example/MyClass.class (i.e. you run the jar command from something that isn't the directory containing the com directory), you'd get this problem.

NB: 99% of folks building java jars use a build system to do so, such as maven or gradle.

Upvotes: 2

Related Questions