欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

maven打可执行jar包

程序员文章站 2022-04-29 16:37:07
...

1 前言
本文示例基于dubbo的系统架构,jar包程序入口使用dubbo框架提供的com.alibaba.dubbo.container.Main方法。
2 软件架构(部分)
xd-parent(maven父配置)
xd-common(公共工程)
xd-service-test(dubbo test服务提供者:依赖xd-common)
xd-web(dubbo服务消费者)
3 以xd-service-test工程打成可执行jar包为例
3.1 配置xd-service-test工程中pom文件,在build节点中加入如下内容

<resources>
	<!-- jar中会包含resources夹下所有的xml和properties文件;**/*可包含所有文件 -->
	<resource>
		<targetPath>${project.build.directory}/classes</targetPath>
		<!-- resources目录中(通常)不是代码,他们不被编译 -->
		<directory>src/main/resources</directory>
		<filtering>true</filtering>
		<includes>
			<include>**/*.xml</include>
			<include>**/*.properties</include>
		</includes>
	</resource>

	<!-- 把 spring配置文件spring-context.xml文件拷贝到classes/META-INF/spring目录下; 因为该目录是 dubbo中Main方法执行时,默认加载spring配置文件的位置 -->
	<resource>
		<targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
		<directory>src/main/resources/spring</directory>
		<filtering>true</filtering>
		<includes>
			<include>spring-context.xml</include>
		</includes>
	</resource>
</resources>

<pluginManagement>
	<plugins>
		<!-- 解决maven插件在Eclipse内执行了一系列的生命周期引起冲突 -->
		<plugin>
			<groupId>org.eclipse.m2e</groupId>
			<artifactId>lifecycle-mapping</artifactId>
			<version>1.0.0</version>
			<configuration>
				<lifecycleMappingMetadata>
					<pluginExecutions>
						<pluginExecution>
							<pluginExecutionFilter>
								<groupId>org.apache.maven.plugins</groupId>
								<artifactId>maven-dependency-plugin</artifactId>
								<versionRange>[2.0,)</versionRange>
								<goals>
									<goal>copy-dependencies</goal>
								</goals>
							</pluginExecutionFilter>
							<action>
								<ignore />
							</action>
						</pluginExecution>
					</pluginExecutions>
				</lifecycleMappingMetadata>
			</configuration>
		</plugin>
	</plugins>
</pluginManagement>

<plugins>
	<!-- 打可执行jar包插件:配置manifest文件(程序入口)、加入依赖包 -->
	<plugin>
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-jar-plugin</artifactId>
		<configuration>
			<classesDirectory>target/classes/</classesDirectory>
			<archive>
				<manifest>
					<!-- 可执行jar包 入口 -->
					<mainClass>com.alibaba.dubbo.container.Main</mainClass>
					<!-- 打包时 MANIFEST.MF文件不记录的时间戳版本;反之每打一个版本都会记录一个时间戳 -->
					<useUniqueVersions>false</useUniqueVersions>
					<addClasspath>true</addClasspath>
					<!-- 系统会将这个路径下所有的jar包(依赖包)加入到classpath路径中 -->
					<classpathPrefix>lib/</classpathPrefix>
				</manifest>
				<manifestEntries>
					<!-- 系统会将这个路径加入到classpath中,主要是用于加载配置文件 -->
					<Class-Path>.</Class-Path>
				</manifestEntries>
			</archive>
		</configuration>
	</plugin>
	<!-- 依赖包插件 -->
	<plugin>
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-dependency-plugin</artifactId>
		<executions>
			<execution>
				<id>copy-dependencies</id>
				<phase>package</phase>
				<goals>
					<goal>copy-dependencies</goal>
				</goals>
				<configuration>
					<type>jar</type>
					<includeTypes>jar</includeTypes>
					<useUniqueVersions>false</useUniqueVersions>
					<outputDirectory>
						${project.build.directory}/lib
					</outputDirectory>
				</configuration>
			</execution>
		</executions>
	</plugin>
</plugins>

<import resource=“classpath:spring/spring-mybatis.xml” />
<import resource=“classpath:spring/dubbo-provider.xml” />
注意:spring配置文件中,导入其它配置文件时,需要加入classpath。
因为读取spring配置文件位置发生变化,dubbo-provider.xml等文件并不与spring配置文件同目录了。

3.2 对xd-parent工程及xd-service-test的所有依赖工程(根据依赖关系),依次执行maven install 命令。
(eclipse中单击右键项目名–> Run as–> Maven install)

对xd-service-test项目执行install命令时,maven会去本地仓库寻找依赖工程的jar包;所以需要把所有依赖工程,依次执行install命令(打包并部署到本地仓库)

3.3 对xd-service-test项目执行install命令
target目录下会生成lib目录及xd-service-test.jar包(生成的其它文件可删除)

到此,maven打可执行jar包完成。

3.4 通过java -jar xd-service-test.jar & 可运行项目
生产中一般使用shell脚本维护项目启停,例如:
./xd-service-test.sh start
./xd-service-test.sh stop
./xd-service-test.sh restart

#!/bin/sh

## java env
export JAVA_HOME=/usr/local/jdk1.8.0_201
export JRE_HOME=$JAVA_HOME/jre

## service name
APP_NAME=test

SERVICE_DIR=/home/dubbo/service/$APP_NAME
SERVICE_NAME=xd-service-$APP_NAME
JAR_NAME=$SERVICE_NAME\.jar
PID=$SERVICE_NAME\.pid

cd $SERVICE_DIR

case "$1" in

    start)
        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >/dev/null 2>&1 &
		echo $! > $SERVICE_DIR/$PID
		echo "*** start $SERVICE_NAME success"
		;;

    stop)
        kill `cat $SERVICE_DIR/$PID`
		rm -rf $SERVICE_DIR/$PID
		echo "*** stop $SERVICE_NAME"
	
		sleep 5
		P_ID=`ps -ef | grep -w "$SERVICE_NAME" | grep -v "grep" | awk '{print $2}'`
		if [ "$P_ID" == "" ]; then
		    echo "=== $SERVICE_NAME process not exists or stop success"
		else
		    echo "=== begin kill $SERVICE_NAME process,pid is:$P_ID"
		    kill -9 $P_ID
		    echo "=== stop $SERVICE_NAME success"
		fi
		;;

    restart)
        $0 stop
		sleep 2
		$0 start
		echo "=== restart $SERVICE_NAME success"
		;;

    *)
        echo "=== parameter error"
		;;
esac
exit 0

windows编辑的shell脚本,文件格式需要转换为unix格式。

4 延伸
解压xd-service-test.jar包,打开 META-INF目录下MANIFEST.MF文件,大体内容如下:

Manifest-Version: 1.0
Built-By: zombie
Build-Jdk: 1.7.0_80
# 打包插件:配置<Class-Path>及<classpathPrefix>节点的值
Class-Path: . lib/xd-common-1.0-SNAPSHOT.jar lib/antlr-2.7.6.jar...等等依赖包
Created-By: Apache Maven 3.5.4
# 程序入口
Main-Class: com.alibaba.dubbo.container.Main
Archiver-Version: Plexus Archiver