antlr4 Jar 在不同的包中有重复的类 - 不知道内部代码引用了哪些类



我使用的是antlr4.3 (complete) jar。它在org.antlr.runtime和org.antlr.v4.runtime包中有很多副本。

在代码中,当我显式使用'v4.runtime' -在运行时,类路径拾取'runtime'。所以我提取了这个jar并重新创建了它,没有org.antlr.runtime。

但显然有些类,如RecognitionException现在没有找到。

我该如何解决这个问题呢?

打开最新的Jar并指定org.antlr.v4.runtime在org.antlr.runtime之前,这样就会从v4.runtime中找到一个重复的类,如果里面没有,它会查找org.antlr.runtime…??

要添加到上面,这里的代码片段给出了一个问题:jar在类路径中。

import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.ANTLRInputStream;
public class AntlrMain {
  public static void main(String[] args) {
    System.out.println("Start Hello World");
    try {
      InputStream is = new FileInputStream(
          "/home/ecworkspace/antlrCentral/DSL/mydev.dsl");
      org.antlr.runANTLRInputStream input = new ANTLRInputStream(is);
      org.antlr.v4.runtime.CharStream cs = (org.antlr.v4.runtime.CharStream) input;
      VCFGLexer lexer = new VCFGLexer(cs);
  1. 最初在ANtlrMain类中,我没有使用explicitorg.antlr.v4.runtime。但在运行时,'CharStream not found'失败了。
  2. 然后我更改为包含类的完整路径
  3. 然后将ANTLR4 Jar更改为"排除"org.antlr.runtime(它有org.antlr.v4.runtime)。这就是'RecognitionException not found'错误发生的时候。

语法顺便说一下,编译OK,生成我所有的VCFG*.java and tokens类,其中VCFG是语法名称。

更新1

与所有人的建议保持一致-我删除了我对自己问题的回答,并将其添加到原始问题中。

在antlr-4.2-complete.jar中,我看到:
/tmp/x/ $ jar -xf antlr-4.2-complete.jar 
/tmp/x/ $ ls org/antlr
runtime  stringtemplate  v4
/tmp/x/ $ ls org/antlr/v4
analysis  codegen  parse    semantics  Tool$1UndefChecker.class  Tool$OptionArgType.class
automata  misc     runtime  tool       Tool.class                Tool$Option.class
/tmp/x/ $ ## The 2 runtimes above: org.antlr.runtime and org.antlr.v4.runtime
/tmp/x/ $ ## which to use where, along with same-name classes in 
/tmp/x/ $ ##  org.antlr and org.antlr.v4

所以,在build.xml中,我使用上面的jar:'

  • java -jar antlr-4.2-complete grammar。g4 => 编译并给我VCFG*.java和VCFG*.tokens
  • javac -cp "antlr-4.2-complete-jar" VCFG*.java => 成功。我有VCFG*.class集合。
  • 然后我编译我的代码AntlrMain.java(它使用AntlrInputStream等),再次使用上述鹿角罐和一些第三方罐
    (logging, commons) => 成功.
  • java -cp "antlr-4.2-complete.jar:log4j.jar" -jar myJar => 运行失败,没有找到CharStream

更新2

根据您的回答添加

我最近才开始在Stackoverflow上发布问题。因此,关于是否回应我的问题以提供更多信息,或评论回复等的指针是欢迎的。

-cp <3rd-party> is -cp "log4j.jar:commonsLang.jar".  

这里的-cp "above-jar"指的是-cp "antlr-4.2-complete.jar "。

如果我没有提到它,这是一个疏忽——我有,对于每个'java'和'javac命令,包括antlr-4.2-complete.jar。但是我看到你写的是antlr-runtime-4.2.jar。所以有单独的antlr-runtime jar和antlr-complete jar。

在下面的4个步骤中(为了方便,我省略了-cp,但是在'每个'步骤中都包含了antlr-4.2-complete.jar)

我认为,我应该在不同的步骤中使用antlr-run-time和antlr-complete jar:

1 (java MyGrammar.java) 
2 (javac MyGrammar*.java) 
3. javac MyOwnCode.java 
4. Run myCode (java MyCode) ...

两个antlr jar中的哪一个(运行时和完成;以及他们的版本)我应该在上面的4个步骤中使用它们吗?

jar文件不包含重复的类。ANTLR 4.3工具的代码生成部分依赖于ANTLR 3.5.2运行时库,该库包含在"complete"jar文件中。虽然有些类与ANTLR 4中的类具有相同的名称,但它们不是重复的,不能互换使用。

@280Z28/Sam:

我很惭愧,但不得不承认最简单的答案往往是正确的。我花了一些时间充实这个JAR,从中生成了多个JAR文件,包括一个用于编译,一个用于运行,等等。 下面的ANT build.xml代码片段简洁地解释了答案:在这里,我生成了"最终的"生产JAR文件,这是在执行主程序时唯一包含的JAR:
<jar destfile="${p_productionJar}">
      <fileset dir="${p_buildDir}" casesensitive="yes">
        <include name="**/*.class"/>
      </fileset>
      <zipfileset includes="**/*.class" src="${p_genCodeJar}"/>
       <!-- How did I miss including p_antlrJar earlier?? -->
      <zipfileset includes="**/*.class" src="${p_antlrJar}"/>
      <zipfileset includes="**/*.class" src="${p_jschJar}"/>
      <zipfileset includes="**/*.class" src="${p_log4jJar}"/>
      <zipfileset includes="**/*.class" src="${p_commonslangJar}"/>
      <manifest>
        <attribute name="Main-Class" value="AntlrMain"/>
        .....

生产Jar缺少${p_antlrJar} =>,即antlr-4.3-complete.jar!!!!你在回答中确实提到了这一点……但这是一个相当愚蠢的错误,我不认为是我做的……谢谢你。

相关内容

  • 没有找到相关文章

最新更新