1. 程式人生 > >Maven 配置 Storm 第三方依賴包分離

Maven 配置 Storm 第三方依賴包分離

做storm的開發,一直有一個問題困擾,就是第三方依賴的包都要合併打成一個包,才能放到伺服器上去執行,隨著需求功能的增加,打的包也就越來越大。而我們的生產環境在雲上,每次釋出包,幾百兆的檔案都要傳好久。

所以,決定把這個問題徹底解決了,Storm的安裝目錄下有一個extlib的目錄,分析bin/storm檔案,發現,topo在啟動執行的時候,會到這個目錄下尋找是否有要加入到classpath中的檔案。這個就是我們解決問題的地方啦。

我們是通過maven打包,所以這個時候就要修改maven的pom檔案,先來支援依賴分離。
配置如下,主要是外掛部分:

<plugins>
      <plugin
>
<artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar</goal
>
</goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <addMavenDescriptor>false</addMavenDescriptor> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib</classpathPrefix> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.4</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> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4</version> <configuration> <descriptors> <descriptor>package.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins>

再配置,將依賴打包成zip檔案。
package.xml

<assembly>
    <id>bin</id>
    <!-- 最終打包成一個用於釋出的zip檔案 -->
    <formats>
        <format>zip</format>
    </formats>

    <!-- Adds dependencies to zip package under lib directory -->
    <dependencySets>
        <dependencySet>
            <!--
               不使用專案的artifact,第三方jar不要解壓,打包進zip檔案的lib目錄
           -->
            <useProjectArtifact>false</useProjectArtifact>
            <outputDirectory>/</outputDirectory>
            <unpack>false</unpack>
        </dependencySet>
    </dependencySets>

    <fileSets>
        <!-- 把專案自己編譯出來的jar檔案,打包進zip檔案的根目錄 -->
        <fileSet>
            <directory>${project.build.directory}/lib</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
            <excludes> 
                <exclude>storm-core-1.0.1.jar</exclude> <!-- 與節點上安裝的storm 有衝突 -->
            </excludes> 
        </fileSet>
    </fileSets>
</assembly>

這樣,打包之後,依賴全部放在了target/lib 目錄下,而程式包,放在target目錄下。

第一次釋出會麻煩一點,因為所有依賴包要釋出到所有storm節點上,之後再發布,就只用釋出程式包了。如果使用jenkins,那就更方便,可以配置成自動化釋出,就不用手工去各個節點上釋出了。