您的位置:首页 > 其它

jar包中META-INF文件作用

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



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

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

Class-Path:指定执行运行jar时的classpath;
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目录下,目录结构如下:



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

Class-Path: lib/commons-logging-1.2.jar lib/commons-io-2.4.jar
Main-Class: com.xxg.Main4)这时就可以直接使用java -jar test.jar 运行该工程了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: