2017-05-11 35 views
-1

我正在和Confluent Kafka Streams一起工作,我运行了发现的示例流here,而且这个工作正常。我想知道是否有替换以下命令的方式,如何从Github使用本地文件而不是一个?

./bin/kafka-run-class org.apache.kafka.streams.examples.wordcount.WordCountDemo 

与使用本地文件而不是此源在Github上的一个。我试图复制从GitHub的文件,并把它在一个本地文件,streams像这样:

./bin/kafka-run-class ./streams/WordCountDemo.java 

,但它给了我下面的错误信息:

Error: Could not find or load main class ..streams.WordCountDemo.java 
+0

使用SAME包名将文件复制到本地驱动器。然后在kafka类之前将该位置放置在类路径中。它必须具有相同的包名称,但它会允许其他类加载它。 – Dakoda

+0

@达科达我不确定你的意思。作为访问文件的命令,我该怎么做? – Ryan

+0

你不需要特殊的命令。你只是使用或正常申报。类加载器将使用类路径来查找类,因此如果您将本地目录放在kafka位置的前面,它将首先加载您的类。当它对关联的类有另一个用法时,它会先尝试在您的目录中找到它(找不到它),然后搜索kafka位置。这就是为什么你需要保持包名称相同。 – Dakoda

回答

0

org.apache.kafka.streams。 examples.wordcount是包含类的包的名称WordCountDemo。把它放在另一个(本地)路径不会改变软件包。

如果您想使用streams/WordcountDemo,则必须将包名更改为流。

+0

更改软件包名称并没有改变任何东西。 – Ryan

+0

_./bin/kafka-run-class ./streams/WordCountDemo.java_将不起作用。它必须看起来像原始_./bin/kafka-run-class流/ WordCountDemo_。顺便说一句,你为什么要更改包名?如果你已经下载了文件,你可以使用_org.apache.kafka.streams.examples.wordcount_local。 – Pastafari

+0

_./bin/kafka-run-class streams/WordCountDemo_也没有工作。另外,我不想更改软件包的名称。我只是想在本地使用它,但如果我不直接链接它,它如何知道文件的位置? – Ryan

0

好的。 @Pastafari和我说的是一样的东西。

  1. 将github的字数和所有关联的jar/classes/etc复制到本地目录。把它们放到源目录中并编译/运行它们。这是最重要的一步 - 让他们使用步骤1-1B运行。

答:将源的目标目录添加到你的类路径中。这是你的.class文件所在的位置。

B.运行使用他们的wordCount类的“./bin/kafka-run-class org.apache.kafka.streams.examples.wordcount.WordCountDemo”。

当一切运行...

  • 复制字计数到另一个目录(比方说,源2)。对其进行更改。您的WordCount将位于source2(目标目录)\ org \ apache \ kafka \ streams \ examples \ wordcount目录中。您的WordCount将具有相同的包名称。现在有两个WordCount.class副本,但在不同的目录中。
  • 将类路径更改为“source2; source”这将告诉类加载器首先在source2目录中查找。然后在源代码中搜索其余的东西。
  • 运行“./bin/kafka-run-class org.apache.kafka.streams.examples.wordcount.WordCountDemo”您的课程将首先加载。
  • +0

    将步骤3的类路径更改为以分号分隔 - 以避免混淆。 – Dakoda

    +0

    我不知道如何编译/运行它们。注意:我使用的是Ubuntu。 – Ryan

    +0

    eclipse将在Linux上工作 – Dakoda

    0

    你觉得这是怎么回事:

    卡夫卡是使用HTTP来从GitHub上的文件WordCountDemo,并将它作为一个类。

    这不是发生了什么事情。

    什么是实际发生的事情:

    卡夫卡是要求Java的一个名为org.apache.kafka.streams.examples.wordcount.WordCountDemo类。

    完全相同的类,如果你做了,你会得到:

    import org.apache.kafka.streams.examples.wordcount.WordCountDemo; 
    
    ... 
    
    WordCountDemo demo = new WordCountDemo(...); 
    

    在此命令行中,你有没有import声明或类似的,所以你使用完全限定类名,其中包括包。

    Java在其文件系统右侧的文件夹中搜索其类加载器的WordCountDemo.class文件。 它很可能在您的类路径中的某个.jar文件中。

    你可以通过编译它(也可以把它放入JAR中)来使你自己的类可用。

    这与普通的Java类加载没有区别 - 在任何介绍性的Java书籍或教程中阅读它。

    +0

    我认为我现在明白了一点,但我不完全确定该把类放在哪里,以及在我的命令中放什么。如果我要从头开始创建一个班级,我应该在哪里放置它,以及我应该在我的命令中放置什么? – Ryan

    +0

    从许多书籍和指南中学习Java。你在这里没有做任何不寻常的事情。 – slim

    相关问题