天天看点

jar包中META-INF文件作用

通常,一个工程下会有很多个java文件,以及会依赖很多外部的jar库,我们在运行该工程时一般会将其打包成一个jar,然后指定main方法以及依赖的第三方jar来运行。结构如下:

jar包中META-INF文件作用

1、首先我们介绍一下jar文件和manifest:

JAR 文件非常类似 ZIP 文件——准确的说,它就是 ZIP 文件。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的。该文件中最重要的两个信息是:

  1. Class-Path:指定执行运行jar时的classpath;
  2. Main-Class:指定运行时的main方法所在类;

1)如果我们打包时没有指定这两个项,那么我们使用java -jar xxx.jar指令运行jar文件,会出现”no main manifest attribute, in xxx.jar”(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。如果我们打包时指定了上面两项,那么就可以直接使用java -jar xxx.jar指令运行jar文件

2)如果我们打包时没有指定,仍然想要运行该jar,那么需要额外的手动指定一些参数(-cp),例如:

java -cp lib/a.jar:lib/b.jar xxx.jar test.MainClass      

-cp:指定依赖的jar,多个jar用冒号隔开;最后的test.MainClass是运行哪个main方法的类;

2、打包时如何指定manifest中class-path和main-class:

通常使用maven来打包,这时候可以使用一下maven-jar-plugin和maven-dependency-plugin插件打包:

<build>  
    <plugins>  
  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-jar-plugin</artifactId>  
            <version>2.6</version>  
            <configuration>  
                <archive>  
                    <manifest>  
                        <addClasspath>true</addClasspath>  
                        <classpathPrefix>lib/</classpathPrefix>  
                        <mainClass>com.xxg.Main</mainClass>  
                    </manifest>  
                </archive>  
            </configuration>  
        </plugin>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-dependency-plugin</artifactId>  
            <version>2.10</version>  
            <executions>  
                <execution>  
                    <id>copy-dependencies</id>  
                    <phase>package</phase>  
                    <goals>  
                        <goal>copy-dependencies</goal>  
                    </goals>  
                    <configuration>  
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>  
                    </configuration>  
                </execution>  
            </executions>  
        </plugin>  
  
    </plugins>  
</build>      

1)maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容,<mainClass>com.xxg.Main</mainClass>指定MANIFEST.MF中的Main-Class,<addClasspath>true</addClasspath>会在MANIFEST.MF加上Class-Path项并配置依赖包,<classpathPrefix>lib/</classpathPrefix>指定依赖包所在目录。

2)maven-dependency-plugin插件用于将依赖包拷贝到<outputDirectory>${project.build.directory}/lib</outputDirectory>指定的位置,即lib目录下

配置完成后,通过mvn package指令打包,会在target目录下生成jar包,并将依赖包拷贝到target/lib目录下,目录结构如下:

jar包中META-INF文件作用

3)查看test.jar中manifest文件,如下:

Class-Path: lib/commons-logging-1.2.jar lib/commons-io-2.4.jar  
Main-Class: com.xxg.Main      

4)这时就可以直接使用java -jar test.jar 运行该工程了。