stanleyerror
stanleyerror

Reputation: 788

How to resolve NoSuchFieldError exception when testing Lucene 4.0

I want to test my own Analyzer. Following is test code from Lucene in Action 2nd Edition, Code List 4.2, page 121.

public class AnalyzerUtils {
    public static void displayTokens(Analyzer analyzer, String text) throws IOException {
        TokenStream tokenStream = analyzer.tokenStream("contents", new StringReader(text));
        displayTokens(tokenStream);
    }

    public static void displayTokens(TokenStream stream) throws IOException {
        CharTermAttribute term = stream.getAttribute(CharTermAttribute.class);
        while(stream.incrementToken()) {
            System.out.println(Arrays.toString(term.buffer()));
        }
    }
}

My customed Analyzer is:

 static class SimpleAnalyzer extends Analyzer {
    static class SimpleFilter extends TokenFilter {
        protected SimpleFilter(TokenStream input) { super(input); }
        @Override
        public boolean incrementToken() throws IOException { return false; }
    }

    @Override
    protected TokenStreamComponents createComponents(String s, Reader reader) {
        Tokenizer tokenizer = new WhitespaceTokenizer(reader);
        return new TokenStreamComponents(tokenizer, new SimpleFilter(tokenizer));
    }
}

static class FilteringAnalyzer extends Analyzer {
    static class FilteringFilter extends FilteringTokenFilter {
        public FilteringFilter(TokenStream in) { super(in); }
        @Override
        protected boolean accept() throws IOException { return false; }
    }

    @Override
    protected TokenStreamComponents createComponents(String s, Reader reader) {
        Tokenizer tokenizer = new WhitespaceTokenizer(reader);
        return new TokenStreamComponents(tokenizer, new FilteringFilter(tokenizer));
    }
}

Problem is if I run AnalyzerUtils.displayTokens(new SimpleAnalyzer(), "美国 法国 中国");, it is ok; however, running AnalyzerUtils.displayTokens(new FilteringAnalyzer(), "美国 法国 中国"); I got this Exception:

Exception in thread "main" java.lang.NoSuchFieldError: LATEST
    at org.apache.lucene.analysis.util.FilteringTokenFilter.<init>(FilteringTokenFilter.java:70)
    at cn.edu.nju.ws.miliqa.nlp.ner.index.NameEntityIndexing$FilteringFilter.<init>(NameEntityIndexing.java:62)
    at cn.edu.nju.ws.miliqa.nlp.ner.index.NameEntityIndexing$FilteringAnalyzer.createComponents(NameEntityIndexing.java:83)
    at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:134)
    at cn.edu.nju.ws.miliqa.lucene.AnalyzerUtils.displayTokens(AnalyzerUtils.java:19)

The difference between to test case is the filter in analyzer extendes TokenFilter or FilteringTokenFilter. I have been working on it for three days, but still have no idea about it. What is the reason for this odd exception?

Upvotes: 1

Views: 3745

Answers (1)

seanhodges
seanhodges

Reputation: 17524

The java.lang.NoSuchFieldError runtime exception means you have one class attempting to access a field on another class that doesn't exist. The offending class was FilteringTokenFilter.

Most likely, you have multiple versions of Lucene in your classpath.

You mention you are using 4.0 in the title, but Version.LATEST (the field this exception is complaining is missing) was not introduced until Lucene 4.10.

That implies that perhaps you have a copy of FilteringTokenFilter.class in a Lucene 4.10+ jar file attempting to find the field "LATEST" in an older (4.0?) Version.class file.

Check you only have one copy of each "lucene-core" and "lucene-analyzers-common" jar files in your class path, and that they are both matching version numbers. If you are not sure, download them again to ensure you have matching versions.

Upvotes: 2

Related Questions