【问题标题】:Which dependencies do I have to include in a Maven Apache Storm Project?我必须在 Maven Apache Storm 项目中包含哪些依赖项?
【发布时间】:2018-01-02 20:49:32
【问题描述】:

我对 Apache Storm 和 Maven 项目还很陌生,所以我尝试遵循这个“教程”(从我的角度来看,这根本不是教程):

http://storm.apache.org/releases/current/Creating-a-new-Storm-project.html

引用了一个巨大的 pom.xml (https://github.com/apache/storm/blob/v1.1.1/examples/storm-starter/pom.xml),它将用作新项目的基础。我试图弄清楚要复制到我的项目 pom.xml 中的内容。所以我决定先从apache核心依赖开始。我的 pom.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>groupId</groupId>
    <artifactId>StormTest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.storm</groupId>
            <artifactId>storm-core</artifactId>
            <version>1.1.1</version>            
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.5.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <executable>java</executable>
                    <includeProjectDependencies>true</includeProjectDependencies>
                    <includePluginDependencies>false</includePluginDependencies>
                    <classpathScope>compile</classpathScope>
                    <mainClass>${storm.topology}</mainClass>
                    <cleanupDaemonThreads>false</cleanupDaemonThreads>
                </configuration>
            </plugin>

            <plugin>

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

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <appendAssemblyId>false</appendAssemblyId>
                    <finalName>StormTest-1.0-SNAPSHOT_dep</finalName>
                    <archive>
                        <manifest>
                            <mainClass>de.arphi.bi.WordCountTopology</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

        <resources>
            <resource>
                <directory>${basedir}/resources</directory>
                <filtering>false</filtering>
                <includes>
                    <include>log4j2.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

这甚至在运行 maven 和构建/打包 jar 时也有效。结果是两个 jar 文件(一个没有依赖关系的小文件和一个有依赖关系的大文件)。我不能运行较小的,因为它说“找不到主要清单”。但是我可以通过执行以下命令来运行更大的:

storm -jar StormTest-1.0-SNAPSHOT_dep.jar

实际上在我本地安装的 apachestorm 1.1.1 上运行(我有一些 System.out.printlns ...)但我得到一个异常:

2018-01-02 21:38:31,864 main ERROR Unable to create file C:\Users\Artur\Desktop\Bi\apache-storm-1.1.1\logs/access-web-${sys:daemon.name}.log java.io.IOException: Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch
        at java.io.WinNTFileSystem.canonicalizeWithPrefix0(Native Method)
        at java.io.WinNTFileSystem.canonicalizeWithPrefix(WinNTFileSystem.java:451)
        at java.io.WinNTFileSystem.canonicalize(WinNTFileSystem.java:422)
        at java.io.File.getCanonicalPath(File.java:618)
        at java.io.File.getCanonicalFile(File.java:643)
        at org.apache.logging.log4j.core.util.FileUtils.makeParentDirs(FileUtils.java:134)
        at org.apache.logging.log4j.core.appender.rolling.RollingFileManager$RollingFileManagerFactory.createManager(RollingFileManager.java:573)
        at org.apache.logging.log4j.core.appender.rolling.RollingFileManager$RollingFileManagerFactory.createManager(RollingFileManager.java:554)
        at org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:112)
        at org.apache.logging.log4j.core.appender.OutputStreamManager.getManager(OutputStreamManager.java:114)
        at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.getFileManager(RollingFileManager.java:155)
        at org.apache.logging.log4j.core.appender.RollingFileAppender$Builder.build(RollingFileAppender.java:131)        at org.apache.logging.log4j.core.appender.RollingFileAppender$Builder.build(RollingFileAppender.java:60)
        at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:122)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:952)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:892)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:884)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:508)        at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:232)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:244)
        at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:545)
        at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:617)
        at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:634)
        at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:229)
        at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:152)
        at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
        at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
        at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:122)
        at org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:43)
        at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:46)
        at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
        at org.apache.storm.topology.BasicBoltExecutor.<clinit>(BasicBoltExecutor.java:28)
        at org.apache.storm.topology.TopologyBuilder.setBolt(TopologyBuilder.java:215)
        at de.arphi.bi.WordCountTopology.main(WordCountTopology.java:22)

它说创建目录的语法是错误的。我知道这是关于日志记录的。我使用了不同的其他依赖项(log4j、slf4j)并尝试使用 ecen 排除依赖项而没有任何成功。我无法摆脱这个错误。

有什么想法吗?我认为我缺少一个依赖项,或者我必须排除我的 pom.xml 的某些部分。但由于我不是 Maven 专家,所以我很难弄清楚我必须在这里适应什么。

【问题讨论】:

  • 看起来更像是 Storm 的配置问题?占位符“sys:daemon.name”似乎未知或未被替换。你是从 git bash 还是 cmd 提示符下运行它的?并在正确的目录中?文档提到了本地模式:storm.apache.org/releases/1.1.1/Local-mode.html - 我不是风暴用户,所以我不知道。但它看起来与 maven 或构建无关

标签: maven dependencies syntax-error apache-storm


【解决方案1】:

我同意storm-starter已经变得相当大了,我们也许应该有更多的小例子。

首先,您应该将storm-core 依赖项设置为“提供”范围。当您将拓扑部署到 Storm 时,您的 jar 将使用 Storm 安装中存在的storm-core jar,因此您不应该将它也放入您的 fat jar 中。

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

当您的拓扑在 Storm 上运行时,它将使用 Storm 安装中 log4j2/worker.xml 文件中的 Log4j2 配置。您不应该包含您自己的 log4j2.xml。如果您需要设置特定的日志级别,您可以修改 worker.xml 或使用 http://storm.apache.org/releases/1.1.1/dynamic-log-level-settings.html 中描述的 CLI。

除此之外,您的 pom 看起来还不错。我不知道你为什么在那里有 exec-maven-plugin (编辑:我看到它也在storm-starter中,我认为这是可以在本地模式下运行storm-starter的剩余部分。你不应该需要它),我可能会用 shade 插件替换 maven-assembly-plugin,但我希望你的拓扑无论如何都能工作。

【讨论】:

    【解决方案2】:

    感谢 Stig Rohde Døssing。最后,根据您对 log4j2/worker.xml 的提示,我找到了异常的来源。问题不在于worker.xml,而在于位于同一目录中的cluster.xml。

    阅读此处显示的异常时,您可以看到 Java 抱怨创建系统路径(“access-web-${sys:daemon.name}.log”)。我在 cluster.xml 中找到了占位符 sys:daemon.name 并将其替换为诸如“access-web-mysysdaemonname.log”之类的静态内容。这解决了这个问题。我不知道为什么这个占位符不能被系统解析,而其他占位符没有问题。

    感谢您的提示。主题可以关闭。

    【讨论】:

      猜你喜欢
      • 2011-01-15
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      相关资源
      最近更新 更多