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 运行该工程了。
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 运行该工程了。
相关文章推荐
- JAR文件中的META-INF文件夹的作用
- jar包详解和META-INF作用
- JAR文件中的META-INF文件夹
- jar包详解和META-INF作用
- META-INF/MANIFEST.MF文件中Sealed头的作用与含义
- Jar文件 META-INF/MANIFEST.MF文件详解
- Maven打jar包把配置文件放在META-INF目录下
- META-INF/MANIFEST.MF文件中Sealed头的作用与含义
- jar包详解和META-INF作用
- Jar包详解和META-INF作用(…
- 【转】jar包详解和META-INF作用
- 解决两个jar包中META-INF文件内容重复的bug
- jar包详解和META-INF作用
- META-INF/MANIFEST.MF文件中Sealed头的作用与含义
- META-INF的编写。eclipse打包jar可执行文件
- jar包详解和META-INF作用(转)
- Jar包中的META-INF的MANIFEST.MF文件用途
- <Android APK签名验签>二:META-INF文件分析
- WEB-INF目录与META-INF目录的作用
- 【Symbian基础知识整理】_bld.inf、*.mmp、*.pkg文件的作用