找到了多个defaults.yaml资源

时间:2015-10-26 21:51:26

标签: java maven apache-storm

当我尝试提交拓扑时,我发现了这个

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>

因为我是个错误

An exception occured while executing the Java class. storm/trident/state/StateFactory

这里是pom文件

<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部分

<executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

pom文件的第3部分

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>

1 个答案:

答案 0 :(得分:9)

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

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

但是,如果您在本地运行,provided也会排除这些类文件。当然,本地这些文件不能自动使用,但在启动本地JVM时必须包含在 CLASSPATH 中。由于providedstorm-core排除了文件,您会收到ClassNotFound例外。

作为每次要提交到其他环境时更改范围的替代方法,您可以将范围设置为compile并在maven-jar-plugin中明确包含拓扑主要/螺栓/ Spout类设置。此显式包含自动从jar中排除所有其他文件,即storm-core中的所有文件。

<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>