gpt4 book ai didi

java - Apache Storm - 如何在生产集群中排除 Maven 中的storm jar

转载 作者:行者123 更新时间:2023-11-30 02:15:34 27 4
gpt4 key购买 nike

根据 documentation ,当我们将Storm拓扑部署到生产集群时,我们必须从Maven中排除Storm的jar,因为它已经在类路径中了,如果我们不这样做,就会出现类似multiple default的错误类路径中的 .yaml

那么我们该怎么做呢?文档提供了一些细节,但不够清晰。当我们配置maven并构建jar时,org.apache.stormjar仍然包含在内,jar中我们有一个default.yaml,实际上,如果我们在构建中打开调试输出,我们将看到如下警告:

[WARNING]The following patterns were never triggered in this artifact inclusion filter: o 'org.apache.storm:storm-core:jar:1.1.1'.

将依赖项org.apache.storm的范围更改为provided,但它不起作用。

<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<type>jar</type>
<version>1.1.1</version>
<scope>provided</scope>
</dependency>

最佳答案

documentation of Storm告诉我们排除 Storm 依赖并提供 a link to a page of Maven ,它解释了如何做到这一点,但缺乏完整的示例。事实证明,我们必须创建另一个 XML 文件作为程序集配置的描述符,而不是将配置直接放在 pom.xml 中,即使 Eclipse 没有提示将这两个文件放在一起文件放在一起。

并且,在第二个 xml 文件中,范围应该是 compile 而不是 runtime

方法如下:

我们有 pom.xmlassemble 插件,指向另一个描述符 xml 文件:

<plugin>                                                                                
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptors>
<descriptor>/src/main/resources/exclude-storm.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>path.to.main.class</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>

注意以下部分:(应该是完整路径)

<descriptors>                                                                   
<descriptor>/src/main/resources/exclude-storm.xml</descriptor>
</descriptors>

在这条路径中:

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
<id>exclude-storm</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<unpack>true</unpack>
<scope>compile</scope> <!-- note here!!!! -->
<excludes>
<exclude>org.apache.storm:storm-core:jar:1.1.1</exclude>
</excludes>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<outputDirectory>/</outputDirectory>
<directory>${project.build.outputDirectory}</directory>
</fileSet>
</fileSets>
</assembly>

这里我们添加Maven文档页面的设置。

最重要的是:排除的格式:应该是:( ref )

groupId:artifactId:type[:classifier]:version

还有范围! runtime 是默认的,我将其更改为 compile 并且它可以工作。

最后,编译时使用:

clean assembly:assembly

并打开调试输出以在控制台中查看完整输出。如果您:

  • 构建成功
  • 搜索输出,没有找到类似的内容:[警告]在此 Artifact 包含过滤器中从未触发以下模式:o 'org.apache.storm:storm-core:jar:1.1.1' .
  • jar 不包含 default.yaml

然后你就知道你已经成功了。

感谢另一个问题和答案的启发:How to exclude dependencies from maven assembly plugin : jar-with-dependencies?

关于java - Apache Storm - 如何在生产集群中排除 Maven 中的storm jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48582602/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com