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