按开源项目风格构建部署自己的项目

来源:互联网 发布:用友软件怎么下载 编辑:程序博客网 时间:2024/06/03 17:54

本文简单介绍如何将自己的maven项目组织成开源项目结构,也就是可以发布之后让别人下载解压缩运行脚本启动。

背景知识

在部署开源项目时候,一般解压缩之后设置一些配置文件就可以通过脚本启动了。
Hadoop和Spark直接./start-all.sh就可以启动服务器了,再通过客户端连接进行操作。
Cassandra也是先启动服务器,再启动客户端连接。本文仿照这种服务器+客户端的脚本启动方式来将自己的项目打造出开源项目的感觉~

项目结构

开源项目解压缩之后重要的目录:bin(sbin),lib(jars),conf,logs,doc

  • bin:运行脚本
  • lib:项目jar包和依赖的jar包
  • conf:配置文件
  • logs:输出日志
  • doc:文档

下面介绍一些主要的构建步骤:

打jar包

将项目打成多个jar包,可以使用maven-dependency-pulgin插件。

<build>      <plugins>          <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>  

outputDirectory为编译出的jar包路径,点进属性project.build.directory,进入maven系统文件pom-4.0.0.xml中,direcrory属性默认为 根目录/target。

pom-4.0.0.xml

<build>
<directory>${project.basedir}/target</directory>

现在可以将deamon项目打包了,进入项目中,通过 maven package 命令打包,这时本项jar包放在了/target下,依赖的jar包放在了/target/lib下。可以将这些jar包都挪到根目录的lib中。

配置文件

conf目录除了放项目配置文件外,还需要加一个脚本,主要用来让用户设置JAVA_HOME。

xxx_env.sh

#!/bin/shexport JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home

启动脚本

xxx_env.sh写好了,谁去调用呢,那就是启动脚本干的事了。
一般开源项目会有自己的主目录,比如SPARK_HOME,HADOOP_HOME,用户可以添加进环境变量中。在启动脚本中可以设置根目录。并且通过根目录找到conf目录和lib目录,来加载配置文件和所有的jar包。最后运行deamon。

start-xxx.sh

#获取根目录if [ -z "${XXX_HOME}" ]; then  export XXX_HOME="$(cd "`dirname "$0"`"/..; pwd)"fiXXX_CONF_DIR=${XXX_HOME}/conf#使用 .或source 在同一进程中执行xxx-env.sh,使得xxx-env.sh中的变量能被加载进来if [ -f "$XXX_CONF_DIR/xxx-env.sh" ]; then    . "$XXX_CONF_DIR/xxx-env.sh"fi#获取JAVA_HOMEif [ -n "$JAVA_HOME" ]; then    for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do        if [ -x "$java" ]; then            JAVA="$java"            break        fi    doneelse    JAVA=javafi#加载所有jar包CLASSPATH=""for f in ${XXX_HOME}/lib/*.jar; do  CLASSPATH=${CLASSPATH}":"$fdone#指定运行的主类MAIN_CLASS=XXXexec "$JAVA" -cp "$CLASSPATH" "$MAIN_CLASS"exit $?

最后exec调用java命令,-cp加载所有jar包,并制定主类,可以通过-D参数设置系统变量,也可以在主类后面加参数传给main函数。

客户端和服务器的启动脚本都可以这么写。也可以都去调用另外一个xxx-deamon.sh脚本,start和end当做不同的参数。

这样就可以打成压缩包,别人下载后通过脚本和配置文件就可以运行了。

0 0