[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: