我在将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();


它有效,并且我没有任何异常消息。我已经检查过,该生成器不是null。但是,当我尝试初始化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调用一个类的构造函数而没有任何问题,而另一个类的构造函数却不能呢?

如果您能提出解决方案或可能的原因,我将不胜感激。

谢谢!

最佳答案

好,终于自己解决了这个问题。清理项目元数据,清理认可的库目录,将KNIME工作区切换到另一个目录,将所有jar放在一个文件夹中,并将它们添加为外部库。现在可以正常工作:)

关于java - 在KNIME中使用外部Java库。为什么一个类的初始化失败而另一个类的初始化成功呢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30170569/

10-12 06:05