Re: Help needed for calling Java class from R
Hi Florian,
On Tue, Apr 14, 2020 at 08:49:44PM +0200, Florian Weimer wrote:
>
> Meh. Does R have exceptions? It would be nice to translate the
> underlying exception from
>
> if (clnam)
> cls = findClass(env, clnam, oClassLoader);
> else
> cls = objectClass(env,o);
> if (!cls)
> error_return("RcallMethod: cannot determine object class");
>
> into an R exception with a nice backtrace, then we might see *why* the
> class fails to load (like the missing superinterface before).
I have no idea about this.
> We can try to actually load the class using the classpath you used and
> some Java tools:
>
> # jshell --class-path /usr/share/java/cdk-interfaces.jar:/e/java/cdk-silent.jar
> | Welcome to JShell -- Version 11.0.7-ea
> | For an introduction type: /help intro
>
> jshell> org.openscience.cdk.silent.SilentChemObjectBuilder.class.newInstance()
> | Exception java.lang.NoClassDefFoundError: org/openscience/cdk/DynamicFactory$CreationModifier
> | at Class.getDeclaredConstructors0 (Native Method)
> | at Class.privateGetDeclaredConstructors (Class.java:3137)
> | at Class.getConstructor0 (Class.java:3342)
> | at Class.newInstance (Class.java:556)
> | at (#1:1)
> | Caused by: java.lang.ClassNotFoundException: org.openscience.cdk.DynamicFactory$CreationModifier
> | at BuiltinClassLoader.loadClass (BuiltinClassLoader.java:581)
> | at ClassLoaders$AppClassLoader.loadClass (ClassLoaders.java:178)
> | at ClassLoader.loadClass (ClassLoader.java:522)
> | ...
>
> That error goes away if I add /usr/share/java/cdk-core.jar to the
> classpath. Hopefully that gets past this point. (The jshell command
> will still fail, but now because JDK can load the class and sees that
> the constructor has private access and cannot be called. Hopefully
> that's not relevant in the real scenario.)
So far your hints were helpful. It turned out that finally the
CLASSPATH does not need to set only in d/rules for building the package
but way more importantly inside r-cran-rcdklibs package. It was shipping
a binary JAR cdk-2.3.jar. Since this had to be replaced by the Debian
packaged libcdk-java I symlinked now to all JARs that are shipped
with libcdk-java into the install dir from rcdklibs:
https://salsa.debian.org/r-pkg-team/r-cran-rcdklibs/-/blob/master/debian/rules
You see I need also vecmath.jar in addition - and more ...
The CLASSPATH is created when loading rcdklibs in
https://salsa.debian.org/r-pkg-team/r-cran-rcdklibs/-/blob/master/R/rcdklibs.R
line 10. It simply attaches each JAR file that is found in
$(debRdir)/$(cranNameOrig)/cont/ (see rules file)
So far I'm now able to build the r-cran-rcdk package. However, in the
autopkgtest more classes are needed. The output is:
...
1 Test Suite :
rcdk rcdk Unit Tests - 31 test functions, 31 errors, 0 failures
ERROR in test.charges: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.get.hcount: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.is.aromatic: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.depictiongenerator: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.fp: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.fp.substructures.binary: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.fp.substructures.count: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.frag1: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.frag2: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.frag3: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.aromaticity.match: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.match1: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.match2: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.match3: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.match4: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.mcs1: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.mcs2: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.mcs3: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.get.properties: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.set.props: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.atom.count: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.desc.calc: Error in .jcall("org/guha/rcdk/descriptors/DescriptorUtilities", "[Ljava/lang/String;", :
java.util.ServiceConfigurationError: org.openscience.cdk.qsar.IMolecularDescriptor: Provider org.openscience.cdk.qsar.descriptors.molecular.KierHallSmartsDescriptor could not be instantiated
ERROR in test.desc.cats: Error in .jcall("org/guha/rcdk/descriptors/DescriptorUtilities", "[Ljava/lang/String;", :
java.util.ServiceConfigurationError: org.openscience.cdk.qsar.IMolecularDescriptor: Provider org.openscience.cdk.qsar.descriptors.molecular.KierHallSmartsDescriptor could not be instantiated
ERROR in test.desc.names: Error in .jcall("org/guha/rcdk/descriptors/DescriptorUtilities", "[Ljava/lang/String;", :
java.util.ServiceConfigurationError: org.openscience.cdk.qsar.IMolecularDescriptor: Provider org.openscience.cdk.qsar.descriptors.molecular.KierHallSmartsDescriptor could not be instantiated
ERROR in test.exact.natural.mass: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.formula: Error in load.molecules(formula_file) :
java.lang.NoClassDefFoundError: com/google/common/io/CharStreams
ERROR in test.get.largest: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.is.connected: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.is.neutral: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.get.smiles: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
ERROR in test.get.smiles2: Error in .jnew("org/openscience/cdk/smiles/SmilesParser", get.chem.object.builder()) :
java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
... and I'm now wondering what other JARs I need to symlink (if I
do not really want to symlink every *.jar inside /usr/share/java
which would probably work but sounds a bit like overkill. Hmmm,
thinking I could also symlink the whole dir to /usr/share/java
and tried:
$ git diff
diff --git a/debian/rules b/debian/rules
index 045412f..6a6e650 100755
--- a/debian/rules
+++ b/debian/rules
@@ -9,9 +9,10 @@ JARS=vecmath.jar
override_dh_link:
dh_link
- for jar in `dpkg -L libcdk-java | grep /usr/share/java/ | grep -v [0-9]\.[0-9]\.jar` ; do \
- dh_link $${jar} $(debRdir)/$(cranNameOrig)/cont/`basename $${jar}` ; \
- done
- for jar in $(JARS) ; do \
- dh_link /usr/share/java/$${jar} $(debRdir)/$(cranNameOrig)/cont/$${jar} ; \
- done
+ dh_link /usr/share/java $(debRdir)/$(cranNameOrig)/cont
+# for jar in `dpkg -L libcdk-java | grep /usr/share/java/ | grep -v [0-9]\.[0-9]\.jar` ; do \
+# dh_link $${jar} $(debRdir)/$(cranNameOrig)/cont/`basename $${jar}` ; \
+# done
+# for jar in $(JARS) ; do \
+# dh_link /usr/share/java/$${jar} $(debRdir)/$(cranNameOrig)/cont/$${jar} ; \
+# done
but this did not changed the error above unfortunately. :-(
Any further hints?
Kind regards
Andreas.
--
http://fam-tille.de
Reply to: