Manifest attribute for java jar

孤街浪徒 提交于 2019-12-03 10:20:29

问题


With all the help from you i was able to finish my first project in java. Now i want to create a jar and run the application (Java project - it is a plain console application which is having another project(console application) as a dependence) from jar.

I created a jar with eclipse by right click - export - created a jar. When i try to run this jar from my cmd, I have an error (below is the error I am geting)

no main manifest attribute, in AAA.jar

I Googled the error - most of them subjected to create the Manifest file. I created a manifest file like below in the project equal to src level

Manifest-Version: 1.0
Main-Class: com.Pacakename.mainclass
Class-Path: log4j-1.2.16.jar db2jcc.jar db2jcc_license_cu.jar

Then J tried run the jar again but this time it says no main method where i have a main method in the class

Please some one please explain a clear step's for creating the Manifest(it really help's me if you show me the folder structure of the place where we have Manifest file)


回答1:


Lets assume you have following directory structure:

MyJavaProject
   |-src 
      |- com
          |- example
               |- Main.java

To compile such project in cmd line, (no external dependencies) you need to invoke commands

$ cd MyJavaProject
$ mkdir bin         //to separate *.class file from source files
$ javac -d bin src\com\example\Main.java

This will create Main.class file in bin directory. To pack it to *.jar file, you can: 1) create jar with binary files and specify Main class in cmd 2) create Manifes and embbed it to jar (I will focus on this one)

You should create META-INF directory under src and inside it create MANIFEST.mf file

Your manifest should look like this:

Manifest-Version: 1.0
Created-By: <Your info>
Main-Class: com.example.Main

Remember to add empty line at end on Manifest!!

In this case, you specify Manifest-Version attribute, Created-By attribute, and fully qualified name of main class to run in Main-Class attribute

To create Jar with this Manifest file and you binary file, invoke commands

$ cd bin
$ jar cfm MyJavaProject.jar ..\src\META-INF\MANIFEST.MF .

this will create new jar called MyJavaProject.jar and use your manifest

If you project depends on external classas or jar, add them to your classpath when compiling (-cp option) and add another line in Manifest

ClassPath: path/to/dependent/jars/jar.jar

Recompile it and create new jar and enjoy your Java quest :)

For more info on Manifest please see: docs

PS: Working with jars,amnifest from cmd line might seem ugly, but it can teach you some ava-like concepts. If you want to skip it, please consider using Apache Maven or Apache Ant




回答2:


If you are using maven I can recommend you to use the shade plugin to produce runnable jars with all dependencies (and manifest :-)) on-board.

Include this in your pom.xml:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.1</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <!-- your main class: -->
                  <mainClass>org.sonatype.haven.HavenCli</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

And then execute mvn clean package shade:shade to build a jar that you can run from the command line with java -jar jarfilename.jar.




回答3:


If you are using eclipse you can use "Export" --> Runnable jar to achieve your goals. In that case you should have a valid run configuration for your project since eclipse uses this run configuration as a kind of blueprint for the runnable jar.

In this case eclipse will build the manifest for you.



来源:https://stackoverflow.com/questions/17096587/manifest-attribute-for-java-jar

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!