我必须在Maven Apache Storm项目中包含哪些依赖项?

时间:2018-01-02 20:49:33

标签: maven dependencies syntax-error apache-storm

我是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文件(一个没有依赖项的小文件和一个带有依赖项的较大文件)。我不能运行较小的那个,因为它说&#34;主要的清单没有找到&#34;。但是我可以通过执行以下命令来运行更大的一个:

storm -jar StormTest-1.0-SNAPSHOT_dep.jar

实际上在我本地安装的apache上运行风暴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)进行了arroung,并尝试使用ecen排除dependecies而没有任何成功。我无法摆脱这个错误。

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

2 个答案:

答案 0 :(得分:0)

我同意风暴启动器已经变得非常大,我们应该有更多的例子。

首先,您应该将storm-core依赖项设置为“已提供”范围。当您将拓扑部署到Storm时,您的jar将使用Storm安装中存在的storm-core 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。如果需要设置特定的日志级别,可以按照http://storm.apache.org/releases/1.1.1/dynamic-log-level-settings.html中的说明修改worker.xml或使用CLI。

除此之外你的pom看起来很好。我不知道你为什么在那里有exec-maven-plugin(编辑:我看到它也在风暴启动器中,我认为这是在本地模式下可以运行风暴启动器的剩余时间。你不应该需要它),我可能用sharow插件替换maven-assembly-plugin,但我希望你的拓扑无论如何都能工作。

答案 1 :(得分:0)

感谢StigRohdeDøssing。最后,我根据你关于log4j2 / worker.xml的提示找到了我的异常的起源。问题不在worker.xml中,而是在位于同一目录中的cluster.xml中。

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

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