我在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();
答案 0 :(得分:1)
错误消息有点令人困惑,因为你没有继承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)。
VerifyError
上有用的article。或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中,您创建一个“New Maven Project”并将依赖项添加到pom.xml
文件 - example for Lucene。这样您就不必将任何JAR文件复制到项目或Tomcat中。