配置步骤及其他事项

  • 首先我们需要在pom.xml中配置maven的assembly插件
<build> 
  <plugins> 
    <plugin> 
      <groupId>org.apache.maven.plugins</groupId>  
      <artifactId>maven-compiler-plugin</artifactId>  
      <configuration> 
        <source>1.7</source>  
        <target>1.7</target>  
        <encoding>UTF-8</encoding> 
      </configuration> 
    </plugin>  
    <plugin> 
      <groupId>org.apache.maven.plugins</groupId>  
      <artifactId>maven-jar-plugin</artifactId>  
      <version>2.3.1</version>  
      <configuration> 
        <archive> 
          <manifest> 
            <!--运行jar包时运行的主类,要求类全名-->  
            <mainClass>com.datapps.metric.cli.MetricsCLI</mainClass>  
            <!-- 是否指定项目classpath下的依赖 -->  
            <addClasspath>true</addClasspath>  
            <!-- 指定依赖的时候声明前缀 -->  
            <classpathPrefix>./</classpathPrefix> 
          </manifest> 
        </archive> 
      </configuration> 
    </plugin>  
    <plugin> 
      <groupId>org.apache.maven.plugins</groupId>  
      <artifactId>maven-assembly-plugin</artifactId>  
      <version>2.2.1</version>  
      <configuration> 
        <descriptors> 
          <descriptor>src/main/assembly/assembly.xml</descriptor> 
        </descriptors>  
        <appendAssemblyId>false</appendAssemblyId> 
      </configuration>  
      <executions> 
        <execution> 
          <id>make-assembly</id>  
          <phase>package</phase>  
          <goals> 
            <goal>single</goal> 
          </goals> 
        </execution> 
      </executions> 
    </plugin> 
  </plugins> 
</build>
  • 接着我们在src/main/assembly文件中配置assembly.xml文件
<assembly>
    <id>package</id>
    <formats>
        <format>tar.gz</format><!--打包的文件格式,也可以有:war zip-->
    </formats>
    <!--tar.gz压缩包下是否生成和项目名相同的根目录-->
    <includeBaseDirectory>true</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <!--是否把本项目打包的jar添加到依赖文件夹下-->
            <useProjectArtifact>true</useProjectArtifact>
            <outputDirectory>lib</outputDirectory>
            <!--将scope为runtime的依赖包打包-->
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <fileSet>
            <directory>src/main/bin</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

其中,生成的lib文件夹下放该项目的所有依赖以及该服务jar包,src/main/bin文件夹下我们一般放start.sh和stop.sh两个脚本文件用来开启和关闭该服务,打包后直接放到根目录下。生成的tar.gz文件的名字为:maven-assembly-plugin插件中配置的finalName-assembly.xml配置的id(若assembly中没有指定id,则只有前半部分).

  • 项目目录结构

QQ截图20171114134509.png

有依赖的jar打成tar.gz

<plugins>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2.1</version>
        <configuration>
          <archive>
            <manifest>
              <!--运行jar包时运行的主类,要求类全名-->
              <mainClass>com.datapps.generator.DataGenerator</mainClass>
              <!-- 是否指定项目classpath下的依赖 -->
              <addClasspath>true</addClasspath>
              <!-- 指定依赖的时候声明前缀 -->
              <classpathPrefix>./</classpathPrefix>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <descriptors>
            <descriptor>src/main/assembly/assembly.xml</descriptor>
          </descriptors>
          <appendAssemblyId>false</appendAssemblyId>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                  <resource>reference.conf</resource>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>

    </plugins>

assembly.xml

<assembly>
    <id>package</id>
    <formats>
        <format>tar.gz</format><!--打包的文件格式,也可以有:war zip-->
    </formats>
    <!--tar.gz压缩包下是否生成和项目名相同的根目录-->
    <includeBaseDirectory>true</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <!--是否把本项目添加到依赖文件夹下-->
            <useProjectArtifact>true</useProjectArtifact>
            <outputDirectory>lib</outputDirectory>
            <!--将scope为runtime的依赖包打包-->
            <scope>provide</scope>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <fileSet>
            <directory>src/main/bin</directory>
            <outputDirectory>/bin</outputDirectory>
            <fileMode>0755</fileMode>
        </fileSet>
        <fileSet>
            <directory>src/main/schemas</directory>
            <outputDirectory>/schemas</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>src/main/doc</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

Could not resolve substitution to a value: ${akka.stream.materializer}

<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  <resource>reference.conf</resource>
</transformer>