java - 处理 java.lang.VerifyError

标签 java lucene

我在 Eclipse Juno 中使用 Lucene 编写了一个 Java 程序。每当我尝试运行它时,都会出现以下错误:

Exception in thread "main" java.lang.VerifyError: Cannot inherit from final class

at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at parser.BuildMainIndex.setUp(BuildMainIndex.java:339)
at parser.luceneDemo.main(luceneDemo.java:10)

错误的来源,即 BuildManinIndex.java 中的行是:

        doc.add(new IntField("startTime1",startTime1,Field.Store.YES));

这里startTime1是文档中要索引的字段。我之前使用的是 Lucene 3.6.0,现在使用的是 Lucene 4.3.0。我还没有从 java.net.URL 导入任何东西。我不知道这个错误的可能原因。请帮忙。

编辑:以下是我编写的简短程序。

writer=new IndexWriter(directory,new StandardAnalyzer(Version.LUCENE_CURRENT),IndexWriter.MaxFieldLength.UNLIMITED);

Document doc=new Document();
doc.add(new Field("title","XYZ",Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field("address","ABC Road",Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field("city","Mumbai",Field.Store.YES,Field.Index.ANALYZED));
doc.add(new IntField("startTime1",900,Field.Store.YES));
doc.add(new IntField("finishTime1",1000,Field.Store.YES));
doc.add(new IntField("startTime2",9999,Field.Store.YES));
doc.add(new IntField("finishTime2",9999,Field.Store.YES));

writer.addDocument(doc);
writer.close();

最佳答案

错误消息有点令人困惑,因为您没有继承 IntField 类,而是创建它的实例,对吗?

doc.add(new IntField("startTime1", startTime1, Field.Store.YES));

问题出在该语句的第一部分doc.add(..)。 Lucene 版本 3.6.0 和 4.x 之间的 Document 类发生了变化 - 3.6 中的 add(..) 接受 Fieldable ( class API ),而在 4.1.0 中接受 IndexableField ( class API )。

有用article关于VerifyError。或this StackOverflow answer .

此外,Lucene 3.6.0 中没有 IntField,即该类来自 Apache Solr ( class API ),但 Lucene 4.1.0 中有一个。您可能使用的是 3.6 版本的 IntField,它与 Lucene 的不同 - 请检查您的 import 语句和类路径。

更新

Joy,对您来说最简单的解决方案是从 /home/abhishek/mtp/stage-2/software/apache-tomcat-7.0.37/lib 中删除旧的 Lucene JAR 文件并放入新文件,然后在 Eclipse 中刷新项目。

我给你的建议是改用Apache Maven进行依赖管理(Eclipse有一个Maven插件)。在 Eclipse 中,您创建一个“新 Maven 项目”并将依赖项添加到 pom.xml 文件 - example for Lucene 。这样您就不必将任何 JAR 文件复制到您的项目或 Tomcat 中。

祝你好运。

关于java - 处理 java.lang.VerifyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16976993/

相关文章:

java - 带有 Java Asmack 库和 X-FACEBOOK-PLATFORM 的 XMPP

lucene - 在 Azure 和 Lucene.NET 上构建分布式索引。我应该学习 Solr 和 Hadoop 吗?

lucene - 分析后如何读取 Lucene 文档字段标记?

java - Spring 形式上的路径选择不起作用

java - 如何显示以特定数字开头的所有值

java - .clone() 还是 Arrays.copyOf()?

solr - Solr 4将分片添加到现有集群

regex - Elasticsearch/Lucene正则表达式fquery/query_string不返回所有文档

java - 如何获取搜索结果中出现的术语集?

java - Angular 元素定位