blob: 38f2280a288c57bf50862a6af558b804e6fa1af5 [file] [log] [blame]
#!/usr/bin/env bash
base=$(cd $(dirname $0);pwd)
__cmd__() {
if which ${1:-"cmd"} >/dev/null 2>&1;then echo 1;else echo 0;fi
}
__get__() {
local i=$1
test "x$i" == "x" && read -p "Please enter $2: " -t 30 i
test "x$i" == "x" && { echo "0x0F";return; }
echo $i
}
__exit__() {
test "x$1" == "x0x0F" && { echo "parameter error.">&2;exit; }
}
create_demo_code(){
local gourp_id=$1
local module=$2
local code_dir=$3
cat > $code_dir/Demo.scala <<EOF
package ${group_id}.$module
import org.apache.spark.streaming.StreamingContext
import com.streamxhub.streamx.spark.core.Streaming
import com.streamxhub.streamx.spark.core.support.kafka.KafkaDirectSource
object HelloStreamXApp extends Streaming {
override def handle(ssc : StreamingContext): Unit = {
val source = new KafkaDirectSource[String,String](ssc)
//val conf = ssc.sparkContext.getConf
source.getDStream[(String,String)](x => (x.topic,x.value)).foreachRDD((rdd,time) => {
rdd.take(10).foreach(println)
source.updateOffsets(time.milliseconds)
})
}
}
EOF
}
create_module() {
local module=$(__get__ "$1" "module name")
__exit__ "$module"
local src_dir=src/main/scala
local code_dir=${src_dir}/${group_id//./\/}/${module}
local deploy_dir=assembly
local conf_dir=${deploy_dir}/conf/prod
local log_dir=${deploy_dir}/logs
local temp_dir=${deploy_dir}/temp
mkdir -p ${name}/${module}
test ! -d ${name}/${module} && { echo "create modulue dir failed.">&2;exit; }
mkdir -p ${name}/${module}/${code_dir}
mkdir -p $name/${module}/${src_dir/main/test}
mkdir -p ${name}/${module}/${conf_dir}
mkdir -p ${name}/${module}/${log_dir}
mkdir -p ${name}/${module}/${temp_dir}
cp -r ${base}/bin ${name}/${module}/assembly/bin
cp ${name}/default.properties ${name}/${module}/${conf_dir}/${module}.properties
echo "# $module 模块说明文档" >${name}/${module}/README.md
cat > ${name}/${module}/assembly.xml <<EOF
<assembly>
<id>bin</id>
<formats>
<format>tar.gz</format>
</formats>
<dependencySets>
<dependencySet>
<useProjectArtifact>true</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<useProjectAttachments>true</useProjectAttachments>
<includes>
<include>com.streamxhub.streamx:streamx-spark</include>
</includes>
</dependencySet>
<dependencySet>
<!--
不使用项目的artifact,第三方jar不要解压
-->
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<useProjectAttachments>true</useProjectAttachments>
<scope>provided</scope>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<outputDirectory>/</outputDirectory>
<includes>
<include>README.md</include>
</includes>
</fileSet>
<fileSet>
<directory>\${project.basedir}/assembly</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
<!-- 把项目自己编译出来的jar文件,打包进gz文件的lib目录 -->
<fileSet>
<directory>\${project.build.directory}</directory>
<outputDirectory>lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
<fileSets>
<fileSet>
<directory>\${project.build.directory}</directory>
<outputDirectory>lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>assembly/bin</directory>
<outputDirectory>bin</outputDirectory>
<fileMode>0755</fileMode>
</fileSet>
<fileSet>
<directory>assembly/conf</directory>
<outputDirectory>conf</outputDirectory>
<fileMode>0755</fileMode>
</fileSet>
<fileSet>
<directory>assembly/logs</directory>
<outputDirectory>logs</outputDirectory>
<fileMode>0755</fileMode>
</fileSet>
<fileSet>
<directory>assembly/logs</directory>
<outputDirectory>temp</outputDirectory>
<fileMode>0755</fileMode>
</fileSet>
</fileSets>
</assembly>
EOF
cat >$name/$module/pom.xml <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>$artifact_id</artifactId>
<groupId>$group_id</groupId>
<version>$version</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>$module</artifactId>
<dependencies>
<dependency>
<groupId>com.streamxhub.streamx</groupId>
<artifactId>streamx-spark</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
EOF
create_demo_code $group_id $module $name/$module/$code_dir
}
create_pom() {
local group_id=$(__get__ "$1" "group id")
__exit__ "$group_id"
local artifact_id=$(__get__ "$2" "artifact id")
__exit__ "$artifact_id"
local module=$(__get__ "$3" "module name")
__exit__ "$module"
local version=$(__get__ "${4:-"1.0"}" "version")
__exit__ "$version"
cat > $name/pom.xml <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>$group_id</groupId>
<artifactId>$artifact_id</artifactId>
<packaging>pom</packaging>
<version>$version</version>
<profiles>
<profile>
<!--
mvn clean package
直接打包,只会将 assembly.xml 文件中
<includes>
<include>com.streamxhub.streamx:streamx-spark</include>
</includes>
包含的Jar包打包进去
-->
<id>default</id>
<properties>
<scope>compile</scope>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!--
mvn clean package -Pwithjar -Dmaven.test.skip=true
包含依赖jar打包,会将assembly.xml 文件中
<includes>
<include>com.streamxhub.streamx.spark:spark-core</include>
</includes>
包含的Jarpom中设置 <scope>\${project.scope}</scope> jar一起打包进去,
这样蹩脚的设计,主要是因为我不知道怎么能优雅的把 运行、编译都依赖的JarA 抽离出来
-->
<id>withjar</id>
<properties>
<scope>provided</scope>
</properties>
</profile>
</profiles>
<modules>
<module>$module</module>
</modules>
<!-- 定义统一版本号-->
<properties>
<streamx.spark.version>1.0.0</streamx.spark.version>
<spark.version>2.2.0</spark.version>
<hadoop.version>2.10.1</hadoop.version>
<hbase.version>1.2.0-cdh5.12.1</hbase.version>
<hive.version>1.1.0-cdh5.12.1</hive.version>
<scala.version>2.11.12</scala.version>
<scala.binary.version>2.11</scala.binary.version>
<redis.version>2.8.2</redis.version>
<mysql.version>5.1.6</mysql.version>
<kafka.version>0.10.2.0</kafka.version>
<es.version>5.6.3</es.version>
<protobuf.version>2.5.0</protobuf.version>
<log4j.version>1.7.25</log4j.version>
<json4s.version>3.2.10</json4s.version>
<spray.version>1.3.3</spray.version>
<akka.version>2.3.9</akka.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<project.build.jdk>1.8</project.build.jdk>
<PermGen>64m</PermGen>
<MaxPermGen>512m</MaxPermGen>
<CodeCacheSize>512m</CodeCacheSize>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.streamxhub.streamx</groupId>
<artifactId>streamx-spark-core</artifactId>
<version>\${streamx.spark.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>\${project.build.jdk}</source>
<target>\${project.build.jdk}</target>
</configuration>
</plugin>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>4.3.0</version>
<executions>
<execution>
<id>compile-scala</id>
<phase>compile</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile-scala</id>
<phase>test-compile</phase>
<goals>
<goal>add-source</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<scalaVersion>\${scala.version}</scalaVersion>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>distro-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
EOF
create_module "$module"
}
create_git_filter() {
echo -e "# Createdby .ignore support plugin (hsz.mobi)\n.idea/\n*.iml\ntarget/\n.DS_Store" >$name/.gitignore
}
create_readme() {
echo -e "# $name 项目说明" >$name/README.md
}
create_default_conf() {
cp $base/create_conf.sh $name
bash $base/create_conf.sh > $name/default.properties
}
create_project() {
local name=$1
test "x$name" == "x" && read -p "Please enter name: " -t 30 name
test "x$name" == "x" && { echo "The name of the project can not be empty" >&2;exit; }
mkdir -p $name
test ! -d $name && { echo "project create failed." >&2;exit; }
create_git_filter
create_readme
create_default_conf
create_pom "$2" "$3" "$4" "$5"
echo "procject $name create successful."
}
test $# -eq 0 && {
echo -e "Usage:\n\tbash $0 [procject_name]\nEx:\n\tbash $0 ~/code/test_project" >&2;
exit;
}
create_project "$@"