Uploaded image for project: 'Solr'
  1. Solr
  2. SOLR-1675

Placing Custom Transform in example/lib directory does not work properly

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Blocker
    • Resolution: Invalid
    • 1.4
    • None
    • None

    Description

      I have created a Custom transformer for transforming a javax.sql.Array instance into a java.lang.Object[] value, and placed it in the example/lib directory. I then configured the transformer appropriately in my db-data-config.xml:

      <entity ...
      transformer="org.apache.solr.handler.dataimport.SqlArrayTransformer"
      

      However, when i try to actually index my documents, i get the following error in the console:

      org.apache.solr.handler.dataimport.DataImportHandlerException: java.lang.NoClassDefFoundError: org/apache/solr/handler/dataimport/Transformer
      	at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:424)
      	at org.apache.solr.handler.dataimport.DocBuilder.doFullDump(DocBuilder.java:242)
      	at org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:180)
      	at org.apache.solr.handler.dataimport.DataImporter.doFullImport(DataImporter.java:331)
      	at org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:389)
      	at org.apache.solr.handler.dataimport.DataImporter$1.run(DataImporter.java:370)
      Caused by: java.lang.NoClassDefFoundError: org/apache/solr/handler/dataimport/Transformer
      	at java.lang.ClassLoader.defineClass1(Native Method)
      	at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
      	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
      	at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
      	at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
      	at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
      	at java.security.AccessController.doPrivileged(Native Method)
      	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
      	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
      	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
      	at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:375)
      	at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
      	at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:579)
      	at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
      	at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:579)
      	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
      	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
      	at java.lang.Class.forName0(Native Method)
      	at java.lang.Class.forName(Class.java:242)
      	at org.apache.solr.core.SolrResourceLoader.findClass(SolrResourceLoader.java:357)
      	at org.apache.solr.handler.dataimport.DocBuilder.loadClass(DocBuilder.java:728)
      	at org.apache.solr.handler.dataimport.EntityProcessorWrapper.loadTransformers(EntityProcessorWrapper.java:103)
      
      

      It seems there is some issue with the classloader going on here, and the only solution to this problem seems to be to find the exploded web application in the "work" directory, and place the .jar file for my transformer in the WEB-INF/lib directory there. My guess is that the classloader for the custom transformer class is not using the web application's class loader as it's parent classloader, and as a result, the Transformer class can't be found.

      I believe I tried this in 1.5-dev as well and had no success either.

      Attachments

        1. SqlArrayTransformer.java
          1 kB
          Matthew P. Inger

        Issue Links

          Activity

            People

              noble.paul Noble Paul
              mattinger Matthew P. Inger
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: