Maven 配置 Storm 第三方依賴包分離
阿新 • • 發佈:2019-02-03
做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,那就更方便,可以配置成自動化釋出,就不用手工去各個節點上釋出了。