Hello,
I’m trying to locally subclass a custom method provided with the VuFind core, and I’m running into problems. Not sure if this is a bug in SolrMarc 3.2 (I’m on the latest release), or just something I’m doing wrong.
I’m working with the code in this pull request:
https://github.com/vufind-org/vufind/pull/1209
(This is an effort to share some locally customized code in a more generic way.. but I still need to subclass the generic version locally to reintroduce some institution-specific details).
On my test server, the core code I wish to extend is located in /opt/vufind/import/index_java/src/org/vufind/index/MultiFormatCalculator.java and my subclass is located in /opt/vufind/local/import/index_java/src/edu/villanova/index/VillanovaIndexer.java. My subclass code looks like this:
package edu.villanova.index;
import org.vufind.index.MultiFormatCalculator;
public class VillanovaIndexer extends MultiFormatCalculator
{
// ... code ...
}
When I try to run an import, though, SolrMarc fails like this:
INFO [main] (ValueIndexerFactory.java:117) - Using directory: /opt/vufind/local/import/index_java as location of java sources
INFO [main] (ValueIndexerFactory.java:117) - Using directory: /opt/vufind/import/index_java as location of java sources
INFO [main] (ValueIndexerFactory.java:117) - Using directory: /opt/vufind/local/import/index_java as location of java sources
FATAL [main] (Boot.java:212) - ERROR: Error while invoking main method in specified class: org.solrmarc.driver.IndexDriver
java.lang.RuntimeException:
/opt/vufind/local/import/index_java/src/edu/villanova/index/VillanovaIndexer.java:21: error: package org.vufind.index does not exist
import org.vufind.index.MultiFormatCalculator;
^
/opt/vufind/local/import/index_java/src/edu/villanova/index/VillanovaIndexer.java:29: error: cannot find symbol
public class VillanovaIndexer extends MultiFormatCalculator
^
symbol: class MultiFormatCalculator
/opt/vufind/local/import/index_java/src/edu/villanova/index/VillanovaIndexer.java:60: error: cannot find symbol
String result = super.getFormatFrom007(formatCode, formatCode2, formatCode5);
^
symbol: variable super
location: class edu.villanova.index.VillanovaIndexer
/opt/vufind/local/import/index_java/src/edu/villanova/index/VillanovaIndexer.java:83: error: cannot find symbol
return getFormats(record);
^
symbol: method getFormats(org.marc4j.marc.Record)
location: class edu.villanova.index.VillanovaIndexer
Compiling java sources failed!
at org.solrmarc.index.extractor.impl.java.JavaValueExtractorUtils.compileSources(JavaValueExtractorUtils.java:114)
at org.solrmarc.index.indexer.ValueIndexerFactory.<init>(ValueIndexerFactory.java:124)
at org.solrmarc.index.indexer.ValueIndexerFactory.initialize(ValueIndexerFactory.java:76)
at org.solrmarc.driver.IndexDriver.execute(IndexDriver.java:92)
at org.solrmarc.driver.IndexDriver.main(IndexDriver.java:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.solrmarc.driver.Boot.invokeMain(Boot.java:201)
at org.solrmarc.driver.ConfigDriver.main(ConfigDriver.java:114)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.solrmarc.driver.Boot.invokeMain(Boot.java:201)
at org.solrmarc.driver.Boot.main(Boot.java:74)
At the top of the excerpted output above, you can see that SolrMarc is finding both the core and the local source directories… but then for some reason it can’t find the org.vufind.index package. Also, is it cause for concern that the code is finding the local directory twice?
If I copy the parent class into the same directory with the child class, then everything works… so I’m guessing it’s some kind of classpath problem… but not sure what the best resolution is.
Anyway, curious if this is a known issue or if it’s something I should spend some time digging into. I’m happy to delve into the code if necessary, but I’m asking first in case it saves some time. Any input would be appreciated!
thanks,
Demian
Demian,
Its definitely a class path issue. More specifically a class compilation issue. One of my first attempts at dynamic compilation for this project ran into problems of A relying on B and B referencing A (IIRC) and not
being able to compile either before the other, and needing to lump all of the to-be-compiled classes that reference one another into the same invocation of the compiler.
It seems that there may be some problem doing that when the source files are in different locations. I will take a look at it.
-Bob
Thanks, Bob, please let me know if I can help! If you have trouble reproducing the problem, I can send all the offending files, and if you need me to test anything, I’m more than happy to do so.
- Demian