Skip to content

About how to use Maven to package executable jar projects

june edited this page Jul 18, 2018 · 2 revisions

关于如何使用maven打包可执行的jar项目

关于这一点,可以参考pom.xml文件中的插件定义部分:

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<configuration>
		<source>1.8</source>
		<target>1.8</target>
		<archive>
			<manifestFile>src/main/java/META-INF/MANIFEST.MF</manifestFile>
			<manifest>
				<addClasspath>true</addClasspath>
				<classpathPrefix>lib/</classpathPrefix>
				<mainClass>com.judy.Runner</mainClass>
			</manifest>
		</archive>
		<classesDirectory>
		</classesDirectory>
	</configuration>
</plugin>

需要注意的一点儿就是,必须自定义MANIFEST.MF文件,这是因为,项目中引用了本地的三个jar包文件,插件默认是不会将这三个文件放到MANIFEST.MF中去的,运行jar项目后还是会报未找到XXX类的异常,因此我们必须自己写MANIFEST.MF文件。

编写MANIFEST.MF文件时需要注意

  • 第一行不能空,行与行之间不能有空行,每一行的最后一个字符不能是空格
  • 最后一行一定是空行
  • 每个属性的名称和值之间(冒号后面)一定要有空格
  • 文件的每一行都不能超过72个字节(一般是70个ASCII字母加上回车换行符)
  • 如果72个字节不够用,则另起一行并以空格开头
  • 以空格开头的行都被视为前一行的续行

具体详细的规范请参见Java的官方文档,注意事项见“Notes on Manifest and Signature Files” 一节.

还需要注意的是,Class-Path属性指定的类或jar包是本地的文件,不可以是远程访问的类或者JAR包文件中的JAR包,即不能是jar in jar;当然也就不能是本jar包中包含的jar包。要实现对jar in jar的引用,需要自定义相关代码来读取它们。

最后,使用 maven install命令后,执行 java -jar name.jar,成功运行。