我在将 Java 代码集成到 KNIME 时遇到问题。Knime 论坛上的类似帖子(http://tech.knime.org/forum/knime-general/using-external-jar-in-java-snippet-node-workflow-not-able-to-initialize-class-of)没有什么帮助,我也在那里发布了一个问题,但到目前为止还没有得到答案,所以我在这里试试运气。
我正在尝试使用 JavaSnippet 将我的代码集成到 KNIME 工作流程中。我已将代码导出到 jar 中并将其放入 KNIME jre/lib/endorsed 文件夹中。代码引用了CDK 1.4.19,我也把对应的jar文件放到了同一个目录下。我没有在 KNIME 中安装 CDK 节点扩展,在我的情况下也不能使用它们。
代码以:
IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();
SmilesParser sp= new SmilesParser(builder);
当我尝试执行 JavaSnippet 时,我收到以下异常消息:
Evaluation of java snippet failed for row "Row0". Exception message: Could not initialize class org.openscience.cdk.smiles.SmilesParser
当我尝试
IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();
它有效,我没有收到异常消息。我已经检查过,构建器不是空值。但是,当我尝试初始化 SmilesParser 时,它失败了。这堂课是公开的。它没有默认构造函数,并且有一个以 IChemObjectBuilder 作为参数的公共构造函数。
我尝试使用类加载器:
URL[] classLoaderUrls = new URL[]{new URL("file:///path on my computer/knime_2.9.4/jre/lib/endorsed/cdk-1.4.19.jar")};
URLClassLoader urlClassLoader = new URLClassLoader(classLoaderUrls);
Class<?> parserClass = urlClassLoader.loadClass("org.openscience.cdk.smiles.SmilesParser");
Class[] classParameters = new Class[] {IChemObjectBuilder.class};
Constructor<?> constructor = parserClass.getConstructor(classParameters); //until this line there are no problems
Object parser = constructor.newInstance(builder); //fails here with the same exception message: Could not initialize class org.openscience.cdk.smiles.SmilesParser
我确信这不是 CDK 错误,因为我可以在 Eclipse 中执行代码。
为什么可以从 KNIME 调用一个类的构造函数而没有任何问题,而另一个类的构造函数却不能?
如果您能提出解决方案或发生这种情况的可能原因,我将不胜感激。
谢谢!