Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在tomcat或weblogic上使用lucene和spring重新部署时发生LinkageError_Java_Spring_Spring Mvc_Tomcat_Lucene - Fatal编程技术网

Java 在tomcat或weblogic上使用lucene和spring重新部署时发生LinkageError

Java 在tomcat或weblogic上使用lucene和spring重新部署时发生LinkageError,java,spring,spring-mvc,tomcat,lucene,Java,Spring,Spring Mvc,Tomcat,Lucene,我有一个服务,可以读取csv文件,并使用lucene回答来自该数据的查询。维修模块在单机和单元测试中都能完美工作。该服务使用spring创建所有lucene类(目录、分析器…请参见下面的ServiceConfig) 该服务由SpringRESTWeb应用程序使用。第一次在tomcat或weblogic中部署时,它工作正常。但当我尝试重新部署它时,它无法再次加载spring上下文,错误如下: 2014-11-14 13:59:57,261 MyService#1.0-SNAPSHOT 750 ER

我有一个服务,可以读取csv文件,并使用lucene回答来自该数据的查询。维修模块在单机和单元测试中都能完美工作。该服务使用spring创建所有lucene类(目录、分析器…请参见下面的ServiceConfig)

该服务由SpringRESTWeb应用程序使用。第一次在tomcat或weblogic中部署时,它工作正常。但当我尝试重新部署它时,它无法再次加载spring上下文,错误如下:

2014-11-14 13:59:57,261 MyService#1.0-SNAPSHOT 750 ERROR org.springframework.web.context.ContextLoader - Context initialization failedorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'csvReader' defined in class de.camminati.config.ServiceConfig: Invocation of init method failed; nested exception is java.lang.LinkageError: loader constraint violation: when resolving method "java.lang.invoke.MethodHandle.invokeExact()Lorg/apache/lucene/util/AttributeImpl;" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, org/apache/lucene/util/AttributeFactory$1, and the class loader (instance of <bootloader>) for resolved class, java/lang/invoke/MethodHandle, have different Class objects for the type ; used in the signature
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1514)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:636)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:934)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1073)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:553)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1648)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:791)
at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1496)
at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:709)
at org.apache.catalina.manager.ManagerServlet.doPut(ManagerServlet.java:450)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:649)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:610)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at com.googlecode.psiprobe.Tomcat70AgentValve.invoke(Tomcat70AgentValve.java:38)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.LinkageError: loader constraint violation: when resolving method "java.lang.invoke.MethodHandle.invokeExact()Lorg/apache/lucene/util/AttributeImpl;" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, org/apache/lucene/util/AttributeFactory$1, and the class loader (instance of <bootloader>) for resolved class, java/lang/invoke/MethodHandle, have different Class objects for the type ; used in the signature
at org.apache.lucene.util.AttributeFactory$1.createInstance(AttributeFactory.java:140)
at org.apache.lucene.util.AttributeFactory$StaticImplementationAttributeFactory.createAttributeInstance(AttributeFactory.java:103)
at org.apache.lucene.util.AttributeSource.addAttribute(AttributeSource.java:222)
at org.apache.lucene.analysis.core.KeywordTokenizer.<init>(KeywordTokenizer.java:37)
at org.apache.lucene.analysis.core.KeywordTokenizer.<init>(KeywordTokenizer.java:41)
at org.apache.lucene.analysis.core.KeywordAnalyzer.createComponents(KeywordAnalyzer.java:34)
at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:182)
at org.apache.lucene.document.Field.tokenStream(Field.java:554)
at org.apache.lucene.index.DefaultIndexingChain$PerField.invert(DefaultIndexingChain.java:611)
at org.apache.lucene.index.DefaultIndexingChain.processField(DefaultIndexingChain.java:359)
at org.apache.lucene.index.DefaultIndexingChain.processDocument(DefaultIndexingChain.java:318)
at org.apache.lucene.index.DocumentsWriterPerThread.updateDocument(DocumentsWriterPerThread.java:239)
at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:454)
at org.apache.lucene.index.IndexWriter.updateDocument(IndexWriter.java:1511)
at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1246)
at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1231)
at de.camminati.csv.CSVReader.readData(CSVReader.java:54)
at de.camminati.csv.CSVReader.afterPropertiesSet(CSVReader.java:62)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1573)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1511)
... 57 more    

以及CSVReader.java:

public class CSVReader implements InitializingBean, DisposableBean {

  @Autowired
  InputStream csvInputStream;
  @Autowired
  IndexWriter indexWriter;

  private ApplicationContext appContext;    

  public void readData() throws IOException {
    CSVParser csvParser = new CSVParser(new InputStreamReader(csvInputStream), CSVFormat.EXCEL.withDelimiter(';').withIgnoreEmptyLines(true));
    for (CSVRecord record : csvParser.getRecords()) {

      Document doc = new Document();
      doc.add(...);
      indexWriter.addDocument(doc);
    }    
    indexWriter.close();
  }    
  @Override
  public void afterPropertiesSet() throws IOException {
    readData();
  }


  @Override
  public void destroy() throws Exception {
    log.info("Closing from destroy().....");
    csvInputStream.close();
    log.info("Closing from destroy().....done!");
  }
}
服务类:

@Service
@Slf4j
public class Service {

  @Autowired(required = true)
  @Qualifier(("directory"))
  Directory directory;
  @Autowired
  Analyzer analyzer;
  @Autowired
  IndexSearcher indexSearcher;

  private final int MAX_HITS = 45000;

  @Override
  protected void finalize() throws IOException {
    directory.close();
  }

  public boolean existsInIndex(String input, String index) throws ParseException, IOException {
    QueryParser parser = new QueryParser(Version.LUCENE_4_10_2, index, analyzer);
    Query query = parser.parse("\"" + parser.escape(input) + "\"");
    ScoreDoc[] hits = indexSearcher.search(query, null, MAX_HITS).scoreDocs;
    return (hits.length > 0) ? true : false;
  }
}

你知道为什么它只运行一次吗?有什么办法可以解决吗?

你的项目使用什么版本的
lucene
springbeans
java
吗?对不起,我在度假。。因此:lucene=4.10.1、spring=3.2.12.RELEASE和Java=jdk1.7.0\u 60在JBoss EAP 6.3.3、jdk1.7.0\u 21和lucene 4.10.3上也会发生同样的事情。至少我们可以排除春天。看起来Lucene根本无法进行热部署。我对它做了一些深入的研究,现在我很确定它不会工作,因为Lucene试图尽我所能控制它自己的类加载和线程管理。这将与任何其他标准类加载器不兼容,可能与自定义类加载器不兼容。
@Service
@Slf4j
public class Service {

  @Autowired(required = true)
  @Qualifier(("directory"))
  Directory directory;
  @Autowired
  Analyzer analyzer;
  @Autowired
  IndexSearcher indexSearcher;

  private final int MAX_HITS = 45000;

  @Override
  protected void finalize() throws IOException {
    directory.close();
  }

  public boolean existsInIndex(String input, String index) throws ParseException, IOException {
    QueryParser parser = new QueryParser(Version.LUCENE_4_10_2, index, analyzer);
    Query query = parser.parse("\"" + parser.escape(input) + "\"");
    ScoreDoc[] hits = indexSearcher.search(query, null, MAX_HITS).scoreDocs;
    return (hits.length > 0) ? true : false;
  }
}