首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找到多个defaults.yaml资源

找到多个defaults.yaml资源
EN

Stack Overflow用户
提问于 2015-10-26 21:51:25
回答 1查看 8K关注 0票数 7

当我试图提交拓扑时,我发现

代码语言:javascript
复制
Exception in thread "main" java.lang.RuntimeException: Found multiple defaults.yaml resources. You're probably bundling the Storm jars with your topology jar.
at backtype.storm.utils.Utils.findAndReadConfigFile(Utils.java:115)
at backtype.storm.utils.Utils.readDefaultConfig(Utils.java:135)
at backtype.storm.utils.Utils.readStormConfig(Utils.java:155)
at backtype.storm.StormSubmitter.submitTopology(StormSubmitter.java:61)
at backtype.storm.StormSubmitter.submitTopology(StormSubmitter.java:40)
at trident.myproject.main(myproject.java:288)

但是,此错误在pom.xml中更新后出现。

<scope>compile</scope> instead of <scope>provided</scope>

因为我是个错误

代码语言:javascript
复制
An exception occured while executing the Java class. storm/trident/state/StateFactory

这里pom文件

代码语言:javascript
复制
<plugins>
    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
                <manifest>
                    <mainClass>trident.myproject</mainClass>
                    <!-- <mainClass>crawler.Crawler</mainClass> -->
                </manifest>
            </archive>
        </configuration>

pom文件第2部分

代码语言:javascript
复制
<executions>
    <execution>
        <id>make-assembly</id>
        <phase>package</phase>
        <goals>
            <goal>single</goal>
        </goals>
    </execution>
</executions>

pom文件第3部分

代码语言:javascript
复制
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
        </configuration>
    </plugin>
</plugins>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-27 13:36:26

LocalCluster中或通过StormSubmitter (这是项目中的默认设置)运行拓扑是有根本区别的。

storm-core的作用域设置为<scope>provided</scope>是默认的,因为这些类文件无论如何在集群中都是可用的。provided告诉maven,这些类不能包含在组装的jar文件中,从而减小了jar的大小。此外,如果文件多次提供,这就避免了冲突--如果将作用域更改为default.yaml,就会发生这种情况。对于这些情况,来自storm-core的所有文件都打包到jar中并提交到集群中。defaults.yaml文件“本地”(即在集群中的工作机器上)和您的jar中查找。因此,Storm不知道使用哪一个,并引发错误。

但是,如果您也在本地运行,provided将排除这些类文件。当然,本地这些文件不是自动可用的,但在启动本地JVM时必须包含在CLASSPATH中。由于providedstorm-core中排除了这些文件,所以您将得到ClassNotFound异常。

为了在每次提交到不同环境时更改范围,可以将作用域设置为compile,并在maven-jar-plugin设置中显式地包含拓扑Main/Bolt/Spout类。此显式包含自动排除jar中的所有其他文件,即storm-core中的所有文件。

代码语言:javascript
复制
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.6</version>

  <executions>
    <execution>
      <id>MyTopology</id>
      <phase>package</phase>
      <goals>
        <goal>jar</goal>
      </goals>
      <configuration>
        <includes>
          <include>my/topology/package/**/*.class</include>
        </includes>
      </configuration>
    </execution>
  </executions>
</plugin>
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33356292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档